on master help sign in
Dropping initial question mark for query string
commitd2f1908b59ff1c4e09cb2e2bf391cd06274651de authorMichael Snoyman <michael@snoyman.com> dateTue 25 May 2010, 12:50 (16 years ago) parent4eb8fdb
3 files changed+30−8
Network/Wai/Parse.hs+11−7 runtests.hs+18 wai-extra.cabal+1−1
Network/Wai/Parse.hs+11−7
@@ -52,14 +52,18 @@ breakDiscard w s =
5252-- * Percent decoding errors are ignored. In particular, "%Q" will be output as
5353-- "%Q".
5454parseQueryString :: S.ByteString -> [(S.ByteString, S.ByteString)]
55−parseQueryString q | S.null q = []
56−parseQueryString q =
57− let (x, xs) = breakDiscard 38 q -- ampersand
58− in parsePair x : parseQueryString xs
55+parseQueryString = parseQueryString' . dropQuestion
5956 where
60− parsePair x =
61− let (k, v) = breakDiscard 61 x -- equal sign
62− in (qsDecode k, qsDecode v)
57+ dropQuestion q | S.null q || S.head q /= 63 = q
58+ dropQuestion q | otherwise = S.tail q
59+ parseQueryString' q | S.null q = []
60+ parseQueryString' q =
61+ let (x, xs) = breakDiscard 38 q -- ampersand
62+ in parsePair x : parseQueryString' xs
63+ where
64+ parsePair x =
65+ let (k, v) = breakDiscard 61 x -- equal sign
66+ in (qsDecode k, qsDecode v)
6367
6468
6569qsDecode :: S.ByteString -> S.ByteString
runtests.hs+18
@@ -14,6 +14,7 @@ main = defaultMain [testSuite]
1414testSuite :: Test
1515testSuite = testGroup "Network.Wai.Parse"
1616 [ testCase "parseQueryString" caseParseQueryString
17+ , testCase "parseQueryString with question mark" caseParseQueryStringQM
1718 , testCase "parseCookies" caseParseCookies
1819 , testCase "parseHttpAccept" caseParseHttpAccept
1920 , testCase "parseRequestBody" caseParseRequestBody
@@ -37,6 +38,23 @@ caseParseQueryString = do
3738 go [("/", "")] "%2f"
3839 go [("foo bar", "")] "foo+bar"
3940
41+caseParseQueryStringQM :: Assertion
42+caseParseQueryStringQM = do
43+ let go l r =
44+ map (S8.pack *** S8.pack) l
45+ @=? parseQueryString (S8.pack $ '?' : r)
46+
47+ go [] ""
48+ go [("foo", "")] "foo"
49+ go [("foo", "bar")] "foo=bar"
50+ go [("foo", "bar"), ("baz", "bin")] "foo=bar&baz=bin"
51+ go [("%Q", "")] "%Q"
52+ go [("%1Q", "")] "%1Q"
53+ go [("%1", "")] "%1"
54+ go [("/", "")] "%2F"
55+ go [("/", "")] "%2f"
56+ go [("foo bar", "")] "foo+bar"
57+
4058caseParseCookies :: Assertion
4159caseParseCookies = do
4260 let input = S8.pack "a=a1;b=b2; c=c3"
wai-extra.cabal+1−1
@@ -1,5 +1,5 @@
11Name: wai-extra
2−Version: 0.1.2
2+Version: 0.1.2.1
33Synopsis: Provides some basic WAI handlers and middleware.
44Description: The goal here is to provide common features without many dependencies.
55License: BSD3