Skip to content

Commit 2d1083c

Browse files
committed
fix #774
1 parent 5bd72b0 commit 2d1083c

File tree

2 files changed

+84
-2
lines changed

2 files changed

+84
-2
lines changed

src/Suave.Tests/Parsing.fs

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,85 @@ let parseQuery =
3131
let subject =
3232
Parsing.parseData ""
3333
Expect.equal subject.Length 0 "Should be empty list"
34+
35+
testCase "can parse equal signs in query" <| fun _ ->
36+
37+
let subject =
38+
Parsing.parseData "q=a=b"
39+
Expect.equal subject.Length 1 "Should have one value"
40+
let actual = subject.[0] |> snd |> Option.get
41+
Expect.equal actual "a=b" "Should contain a=b"
42+
43+
testCase "can parse query with missing values" <| fun _ ->
44+
let subject =
45+
Parsing.parseData "a=1&b=&c=3&d"
46+
Expect.equal subject.Length 4 "Should have four values"
47+
48+
let actualB = subject.[1] |> snd |> Option.get
49+
Expect.equal actualB "" "b should be empty string"
50+
51+
let actualD = subject.[3] |> snd
52+
Expect.equal actualD (Some("")) "d should be Some(\"\")"
53+
54+
testCase "can parse query with multiple =" <| fun _ ->
55+
let subject =
56+
Parsing.parseData "a==1==&b===2==="
57+
Expect.equal subject.Length 2 "Should have two values"
58+
let actualA = subject.[0] |> snd |> Option.get
59+
Expect.equal actualA "=1==" "a should be '=1=='"
60+
let actualB = subject.[1] |> snd |> Option.get
61+
Expect.equal actualB "==2===" "b should be '==2==='"
62+
63+
testCase "can parse query with empty values only" <| fun _ ->
64+
let subject =
65+
Parsing.parseData "a=&b=&c="
66+
Expect.equal subject.Length 3 "Should have three values"
67+
let actualA = subject.[0] |> snd |> Option.get
68+
Expect.equal actualA "" "a should be empty string"
69+
let actualB = subject.[1] |> snd |> Option.get
70+
Expect.equal actualB "" "b should be empty string"
71+
let actualC = subject.[2] |> snd |> Option.get
72+
Expect.equal actualC "" "c should be empty string"
73+
74+
testCase "can parse query with no keys only values" <| fun _ ->
75+
let subject =
76+
Parsing.parseData "=1&=2&=3"
77+
Expect.equal subject.Length 3 "Should have three values"
78+
let actual1 = subject.[0] |> snd |> Option.get
79+
Expect.equal actual1 "1" "first value should be '1'"
80+
let actual2 = subject.[1] |> snd |> Option.get
81+
Expect.equal actual2 "2" "second value should be '2'"
82+
let actual3 = subject.[2] |> snd |> Option.get
83+
Expect.equal actual3 "3" "third value should be '3'"
84+
85+
testCase "can parse query with only keys no values" <| fun _ ->
86+
let subject =
87+
Parsing.parseData "a&b&c"
88+
Expect.equal subject.Length 3 "Should have three values"
89+
let actualA = subject.[0] |> snd |> Option.get
90+
Expect.equal actualA "" "a should be empty string"
91+
let actualB = subject.[1] |> snd |> Option.get
92+
Expect.equal actualB "" "b should be empty string"
93+
let actualC = subject.[2] |> snd |> Option.get
94+
Expect.equal actualC "" "c should be empty string"
95+
96+
testCase "can parse query with mixed cases" <| fun _ ->
97+
let subject =
98+
Parsing.parseData "a=1&b&c=&=4&=&&d==5=="
99+
Expect.equal subject.Length 6 "Should have six values"
100+
let actualA = subject.[0] |> snd |> Option.get
101+
Expect.equal actualA "1" "a should be '1'"
102+
let actualB = subject.[1] |> snd |> Option.get
103+
Expect.equal actualB "" "b should be empty string"
104+
let actualC = subject.[2] |> snd |> Option.get
105+
Expect.equal actualC "" "c should be empty string"
106+
let actualFirstEmptyKey = subject.[3] |> snd |> Option.get
107+
Expect.equal actualFirstEmptyKey "4" "first empty key should be '4'"
108+
let actualSecondEmptyKey = subject.[4] |> snd |> Option.get
109+
Expect.equal actualSecondEmptyKey "" "second empty key should be empty string"
110+
let actualD = subject.[5] |> snd |> Option.get
111+
Expect.equal actualD "=5==" "d should be '=5=='"
112+
34113
]
35114

36115
[<Tests>]

src/Suave/Utils/Parsing.fs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,11 @@ let isLocalAddress (ip : string) =
1919
/// by the ampersand character.
2020
let parseData (s : string) =
2121
let parseArr (d : string array) =
22-
if d.Length = 2 then (d.[0], Some <| System.Net.WebUtility.UrlDecode(d.[1]))
23-
else d.[0],None
22+
let value =
23+
Array.tail d
24+
|> Array.map (fun x -> WebUtility.UrlDecode(x))
25+
|> fun x -> String.Join('=',x)
26+
d.[0], Some (value)
2427

2528
if String.IsNullOrWhiteSpace(s) then
2629
[]

0 commit comments

Comments
 (0)