summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAndreas Rumpf <rumpf_a@web.de>2020-09-20 01:07:13 +0200
committerGitHub <noreply@github.com>2020-09-20 01:07:13 +0200
commitebb632ccba0d786b90684e4da2b393cfae04a24c (patch)
treefbc639f80d19dfab02623c29c69323fc4d2389df
parenta15d77df7e324f6cda831bf44ced7a5a8bd93ef4 (diff)
downloadNim-ebb632ccba0d786b90684e4da2b393cfae04a24c.tar.gz
fixes #15369 (#15371)
-rw-r--r--lib/pure/cgi.nim6
-rw-r--r--tests/stdlib/tcgi.nim14
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