summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xLib/cgi.py2
-rw-r--r--Lib/test/output/test_cgi11
-rw-r--r--Lib/test/test_cgi.py23
-rw-r--r--Misc/NEWS4
4 files changed, 38 insertions, 2 deletions
diff --git a/Lib/cgi.py b/Lib/cgi.py
index 487b01e..7c3d657 100755
--- a/Lib/cgi.py
+++ b/Lib/cgi.py
@@ -209,6 +209,8 @@ def parse_qsl(qs, keep_blank_values=0, strict_parsing=0):
pairs = [s2 for s1 in qs.split('&') for s2 in s1.split(';')]
r = []
for name_value in pairs:
+ if not name_value and not strict_parsing:
+ continue
nv = name_value.split('=', 1)
if len(nv) != 2:
if strict_parsing:
diff --git a/Lib/test/output/test_cgi b/Lib/test/output/test_cgi
index 3741c22..d5d6f75 100644
--- a/Lib/test/output/test_cgi
+++ b/Lib/test/output/test_cgi
@@ -1,4 +1,15 @@
test_cgi
+'' => []
+'&' => []
+'&&' => []
+'=' => [('', '')]
+'=a' => [('', 'a')]
+'a' => [('a', '')]
+'a=' => [('a', '')]
+'a=' => [('a', '')]
+'&a=b' => [('a', 'b')]
+'a=a+b&b=b+c' => [('a', 'a b'), ('b', 'b c')]
+'a=1&a=2' => [('a', '1'), ('a', '2')]
''
'&'
'&&'
diff --git a/Lib/test/test_cgi.py b/Lib/test/test_cgi.py
index 980e3b6..5ecaf7f 100644
--- a/Lib/test/test_cgi.py
+++ b/Lib/test/test_cgi.py
@@ -55,7 +55,21 @@ def do_test(buf, method):
# A list of test cases. Each test case is a a two-tuple that contains
# a string with the query and a dictionary with the expected result.
-parse_test_cases = [
+parse_qsl_test_cases = [
+ ("", []),
+ ("&", []),
+ ("&&", []),
+ ("=", [('', '')]),
+ ("=a", [('', 'a')]),
+ ("a", [('a', '')]),
+ ("a=", [('a', '')]),
+ ("a=", [('a', '')]),
+ ("&a=b", [('a', 'b')]),
+ ("a=a+b&b=b+c", [('a', 'a b'), ('b', 'b c')]),
+ ("a=1&a=2", [('a', '1'), ('a', '2')]),
+]
+
+parse_strict_test_cases = [
("", ValueError("bad query field: ''")),
("&", ValueError("bad query field: ''")),
("&&", ValueError("bad query field: ''")),
@@ -114,7 +128,12 @@ def first_second_elts(list):
return map(lambda p:(p[0], p[1][0]), list)
def main():
- for orig, expect in parse_test_cases:
+ for orig, expect in parse_qsl_test_cases:
+ result = cgi.parse_qsl(orig, keep_blank_values=True)
+ print repr(orig), '=>', result
+ verify(result == expect, "Error parsing %s" % repr(orig))
+
+ for orig, expect in parse_strict_test_cases:
# Test basic parsing
print repr(orig)
d = do_test(orig, "GET")
diff --git a/Misc/NEWS b/Misc/NEWS
index cd34d13..29adb45 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -94,6 +94,10 @@ Library
- The threading module has a new class, local, for creating objects
that provide thread-local data.
+- Bug #990307: when keep_empty_values is True, cgi.parse_qsl()
+ no longer returns spurious empty fields.
+
+
Tools/Demos
-----------