@@ -10,6 +10,7 @@ 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
1314import Network.HPACK
1415import qualified Network.HTTP.Types as H
1516import Network.HTTP2
@@ -19,6 +20,9 @@ import Network.Wai.Handler.Warp.Response
1920import qualified Network.Wai.Handler.Warp.Settings as S
2021import Network.Wai.Handler.Warp.Types
2122
23+-- $setup
24+-- >>> :set -XOverloadedStrings
25+
2226hpackEncodeHeader :: Context -> InternalInfo -> S.Settings -> H.Status
2327 -> H.ResponseHeaders -> IO Builder
2428hpackEncodeHeader ctx ii settings s h = do
@@ -49,6 +53,16 @@ hpackDecodeHeader hdrblk Context{decodeDynamicTable} = do
4953 hdrtbl <- readIORef decodeDynamicTable
5054 (hdrtbl', hdr) <- decodeHeader hdrtbl hdrblk `E.onException` cleanup
5155 writeIORef decodeDynamicTable hdrtbl'
52− return hdr
56+ return $ concatCookie hdr
5357 where
5458 cleanup = E.throwIO $ ConnectionError CompressionError "cannot decompress the header"
59+
60+-- |
61+--
62+-- >>> concatCookie [("cookie","a=b"),("foo","bar"),("cookie","c=d"),("cookie","e=f")]
63+-- [("cookie","a=b; c=d; e=f"),("foo","bar")]
64+concatCookie :: HeaderList -> HeaderList
65+concatCookie hdr = ("cookie",cookieValue) : others
66+ where
67+ (cookies,others) = L.partition (\x -> fst x == "cookie") hdr
68+ cookieValue = B.intercalate "; " (map snd cookies)