on master help sign in
Cookie parsing
commiteda31a9916919606c9bbc3e4b044d02178d853b7 authorMichael Snoyman <michael@snoyman.com> dateThu 20 May 2010, 00:31 (16 years ago) parentea9d392
2 files changed+22
Network/Wai/Parse.hs+15 runtests.hs+7
Network/Wai/Parse.hs+15
@@ -2,6 +2,7 @@
22
33module Network.Wai.Parse
44 ( parseQueryString
5+ , parseCookies
56 ) where
67
78import qualified Data.ByteString as S
@@ -59,3 +60,17 @@ parseQueryString q =
5960 | otherwise = Nothing
6061 combine :: Word8 -> Word8 -> Word8
6162 combine a b = shiftL a 4 .|. b
63+
64+-- | Decode the value of an HTTP_COOKIE header into key/value pairs.
65+parseCookies :: S.ByteString -> [(S.ByteString, S.ByteString)]
66+parseCookies s
67+ | S.null s = []
68+ | otherwise =
69+ let (first, rest) = breakDiscard 59 s -- semicolon
70+ in parseCookie first : parseCookies rest
71+
72+parseCookie :: S.ByteString -> (S.ByteString, S.ByteString)
73+parseCookie s =
74+ let (key, value) = breakDiscard 61 s -- equals sign
75+ key' = S.dropWhile (== 32) key -- space
76+ in (key', value)
runtests.hs+7
@@ -12,6 +12,7 @@ main = defaultMain [testSuite]
1212testSuite :: Test
1313testSuite = testGroup "Network.Wai.Parse"
1414 [ testCase "parseQueryString" caseParseQueryString
15+ , testCase "parseCookies" caseParseCookies
1516 ]
1617
1718caseParseQueryString :: Assertion
@@ -29,3 +30,9 @@ caseParseQueryString = do
2930 go [("/", "")] "%2F"
3031 go [("/", "")] "%2f"
3132 go [("foo bar", "")] "foo+bar"
33+
34+caseParseCookies :: Assertion
35+caseParseCookies = do
36+ let input = B8.pack "a=a1;b=b2; c=c3"
37+ expected = [("a", "a1"), ("b", "b2"), ("c", "c3")]
38+ map (B8.pack *** B8.pack) expected @=? parseCookies input