@@ -10,7 +10,6 @@ import Data.ByteString.Builder (Builder)
1010import qualified Data.ByteString.Char8 as B8
1111import Data.CaseInsensitive (foldedCase)
1212import Data.IORef (readIORef, writeIORef)
13−import qualified Data.List as L
1413import Network.HPACK
1514import qualified Network.HTTP.Types as H
1615import Network.HTTP2
@@ -63,17 +62,11 @@ hpackDecodeHeader hdrblk Context{decodeDynamicTable} = do
6362-- >>> concatCookie [("foo","bar")]
6463-- [("foo","bar")]
6564-- >>> concatCookie [("cookie","a=b"),("foo","bar"),("cookie","c=d"),("cookie","e=f")]
66−-- [("cookie","a=b; c=d; e=f"),("foo","bar")]
67−-- >>> concatCookie [(":pseudo","pseudo"),("cookie","a=b"),("foo","bar"),("cookie","c=d"),("cookie","e=f")]
68−-- [(":pseudo","pseudo"),("cookie","a=b; c=d; e=f"),("foo","bar")]
65+-- [("foo","bar"),("cookie","a=b; c=d; e=f")]
6966concatCookie :: HeaderList -> HeaderList
70−concatCookie hdr = case L.partition (\x -> fst x == "cookie") hdr of
71− ([],_) -> hdr
72− (cookies,others) -> let cookieValue = B.intercalate "; " (map snd cookies)
73− in insertAfterPseudo ("cookie",cookieValue) others
74−
75−insertAfterPseudo :: Header -> HeaderList -> HeaderList
76−insertAfterPseudo x [] = [x]
77−insertAfterPseudo x yys@(y:ys)
78− | isPseudo (fst y) = y : insertAfterPseudo x ys
79− | otherwise = x : yys
67+concatCookie = collect []
68+ where
69+ collect cookies (("cookie",c):rest) = collect (cookies ++ [c]) rest
70+ collect cookies (h:rest) = h : collect cookies rest
71+ collect [] [] = []
72+ collect cookies [] = [("cookie", B.intercalate "; " cookies)]