@@ -1,5 +1,6 @@
11{-# LANGUAGE OverloadedStrings #-}
22{-# LANGUAGE NamedFieldPuns #-}
3+{-# LANGUAGE BangPatterns #-}
34
45module Network.Wai.Handler.Warp.HTTP2.HPACK where
56
@@ -68,9 +69,14 @@ hpackDecodeHeader hdrblk Context{decodeDynamicTable} = do
6869-- >>> concatCookie [("cookie","a=b"),("foo","bar"),("cookie","c=d"),("cookie","e=f")]
6970-- [("foo","bar"),("cookie","a=b; c=d; e=f")]
7071concatCookie :: HeaderList -> HeaderList
71−concatCookie = collect []
72+concatCookie = collect id
7273 where
73− collect cookies (("cookie",c):rest) = collect (cookies ++ [c]) rest
74− collect cookies (h:rest) = h : collect cookies rest
75− collect [] [] = []
76− collect cookies [] = [("cookie", B.intercalate "; " cookies)]
74+ collect cb (("cookie",c):rest) = collect (cb . (c:)) rest
75+ collect cb (h:rest) = h : collect cb rest
76+ collect cb [] = cookie
77+ where
78+ !cookies = cb []
79+ !cookie
80+ | null cookies = []
81+ | otherwise = let !v = B.intercalate "; " cookies
82+ in [("cookie",v)]