Skip to content

Commit fa045bf

Browse files
committed
Fix empty query value parsing and add appropriate tests
1 parent bb840f6 commit fa045bf

File tree

2 files changed

+33
-7
lines changed

2 files changed

+33
-7
lines changed

src/Data/URI/Query.purs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ parseParts = sepBy parsePart (string ";" <|> string "&")
3333

3434
parsePart Parser (Tuple String (Maybe String))
3535
parsePart = do
36-
key ← rxPat "[^=]+"
36+
key ← rxPat "[^=;&]+"
3737
value ← optionMaybe $ string "=" *> rxPat "[^;&]*"
3838
pure $ Tuple (prettyDecodeURI key) (prettyDecodeURI <$> value)
3939

test/Main.purs

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,12 @@ import Data.Maybe (Maybe(Nothing, Just))
1111
import Data.Path.Pathy (currentDir, parentDir', file, dir, rootDir, (</>))
1212
import Data.Tuple (Tuple(Tuple))
1313
import Data.URI (Authority(Authority), HierarchicalPart(HierarchicalPart), Host(IPv4Address, NameAddress, IPv6Address), Query(Query), RelativePart(RelativePart), RelativeRef(RelativeRef), URI(URI), URIScheme(URIScheme), runParseURIRef)
14-
import Data.URI.Query (printQuery)
14+
import Data.URI.Query (parseQuery, printQuery)
1515
import Test.Unit (suite, test, TestSuite)
1616
import Test.Unit.Assert (assert, equal)
1717
import Test.Unit.Console (TESTOUTPUT)
1818
import Test.Unit.Main (runTest)
19+
import Text.Parsing.StringParser (runParser)
1920

2021
testRunParseURIRefParses :: forall a. String -> Either URI RelativeRef -> TestSuite a
2122
testRunParseURIRefParses uri expected =
@@ -29,12 +30,18 @@ testRunParseURIRefFailes uri =
2930
("failes to parse: " <> uri)
3031
(assert ("parse should fail for: " <> uri) <<< isLeft <<< runParseURIRef $ uri)
3132

32-
testQuerySerialization :: forall a. Query -> String -> TestSuite a
33-
testQuerySerialization query expected =
33+
testPrintQuerySerializes :: forall a. Query -> String -> TestSuite a
34+
testPrintQuerySerializes query expected =
3435
test
35-
("query " <> show query <> " serializes.")
36+
("serializes: " <> show query)
3637
(equal expected (printQuery query))
3738

39+
testParseQueryParses :: forall a. String -> Query -> TestSuite a
40+
testParseQueryParses uri query =
41+
test
42+
("parses: \"" <> uri <> "\"")
43+
(equal (Right query) (runParser parseQuery uri))
44+
3845
main :: forall eff. Eff ( console :: CONSOLE , testOutput :: TESTOUTPUT, avar :: AVAR | eff ) Unit
3946
main = runTest $ suite "Data.URI" do
4047
suite "runParseURIRef" do
@@ -282,8 +289,27 @@ main = runTest $ suite "Data.URI" do
282289
testRunParseURIRefFailes "mailto:[email protected]"
283290
testRunParseURIRefFailes "/top_story.htm"
284291

285-
testQuerySerialization
292+
suite "printQuery" do
293+
testPrintQuerySerializes
286294
(Query (Tuple "key1" (Just "value1") : Tuple "key2" (Just "value2") : Tuple "key1" (Just "value3") : Nil))
287295
"?key1=value1&key2=value2&key1=value3"
288-
testQuerySerialization (Query Nil) ""
296+
testPrintQuerySerializes (Query Nil) ""
297+
testPrintQuerySerializes
298+
(Query (Tuple "key1" (Just "") : Tuple "key2" (Just "") : Nil))
299+
"?key1=&key2="
300+
testPrintQuerySerializes
301+
(Query (Tuple "key1" Nothing : Tuple "key2" Nothing : Nil))
302+
"?key1&key2"
303+
304+
suite "parseQuery" do
305+
testParseQueryParses
306+
"key1=value1&key2=value2&key1=value3"
307+
(Query (Tuple "key1" (Just "value1") : Tuple "key2" (Just "value2") : Tuple "key1" (Just "value3") : Nil))
308+
testParseQueryParses
309+
"key1&key2"
310+
(Query (Tuple "key1" Nothing : Tuple "key2" Nothing : Nil))
311+
testParseQueryParses
312+
"key1=&key2="
313+
(Query (Tuple "key1" (Just "") : Tuple "key2" (Just "") : Nil))
314+
289315

0 commit comments

Comments
 (0)