diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2020-09-20 01:07:13 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-09-20 01:07:13 +0200 |
commit | ebb632ccba0d786b90684e4da2b393cfae04a24c (patch) | |
tree | fbc639f80d19dfab02623c29c69323fc4d2389df | |
parent | a15d77df7e324f6cda831bf44ced7a5a8bd93ef4 (diff) | |
download | Nim-ebb632ccba0d786b90684e4da2b393cfae04a24c.tar.gz |
fixes #15369 (#15371)
-rw-r--r-- | lib/pure/cgi.nim | 6 | ||||
-rw-r--r-- | tests/stdlib/tcgi.nim | 14 |
2 files changed, 17 insertions, 3 deletions
diff --git a/lib/pure/cgi.nim b/lib/pure/cgi.nim index 734ab9171..1f0e0736a 100644 --- a/lib/pure/cgi.nim +++ b/lib/pure/cgi.nim @@ -105,10 +105,10 @@ iterator decodeData*(data: string): tuple[key, value: TaintedString] = while i < data.len: setLen(name, 0) # reuse memory i = parseData(data, i, name) - if i >= data.len or data[i] != '=': cgiError("'=' expected") - inc(i) # skip '=' setLen(value, 0) # reuse memory - i = parseData(data, i, value) + if i < data.len and data[i] == '=': + inc(i) # skip '=' + i = parseData(data, i, value) yield (name.TaintedString, value.TaintedString) if i < data.len: if data[i] == '&': inc(i) diff --git a/tests/stdlib/tcgi.nim b/tests/stdlib/tcgi.nim index 7df1b077d..222a3bf6d 100644 --- a/tests/stdlib/tcgi.nim +++ b/tests/stdlib/tcgi.nim @@ -1,6 +1,14 @@ discard """ output: ''' [Suite] Test cgi module +(key: "a", value: "1") +(key: "b", value: "0") +(key: "c", value: "3") +(key: "d", value: "") +(key: "e", value: "") +(key: "a", value: "5") +(key: "a", value: "t e x t") +(key: "e", value: "http://w3schools.com/my test.asp?name=ståle&car=saab") ''' """ @@ -21,3 +29,9 @@ suite "Test cgi module": expect KeyError: discard parsedQuery["not_existing_key"] + +# bug #15369 +let queryString = "a=1&b=0&c=3&d&e&a=5&a=t%20e%20x%20t&e=http%3A%2F%2Fw3schools.com%2Fmy%20test.asp%3Fname%3Dst%C3%A5le%26car%3Dsaab" + +for pair in decodeData(queryString): + echo pair |