From 66edb6295f956af9c559ef037c5016c9f6b64261 Mon Sep 17 00:00:00 2001 From: Neil Schemenauer Date: Mon, 19 Jul 2004 15:38:11 +0000 Subject: [PATCH] Don't return spurious empty fields if 'keep_empty_values' is True. Fixes SF bug #990307. --- Lib/cgi.py | 2 ++ Lib/test/output/test_cgi | 11 +++++++++++ Lib/test/test_cgi.py | 23 +++++++++++++++++++++-- Misc/NEWS | 4 ++++ 4 files changed, 38 insertions(+), 2 deletions(-) diff --git a/Lib/cgi.py b/Lib/cgi.py index 487b01e3f2e..7c3d6579434 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 3741c22d015..d5d6f75c376 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 980e3b64864..5ecaf7f120c 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 cd34d13a8bc..29adb457b90 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 -----------