Skip to content

Commit eddfdb3

Browse files
[3.11] gh-116764: Fix regressions in urllib.parse.parse_qsl() (GH-116801) (GH-116895)
* Restore support of None and other false values. * Raise TypeError for non-zero integers and non-empty sequences. The regressions were introduced in gh-74668 (bdba8ef). (cherry picked from commit 1069a46) Co-authored-by: Serhiy Storchaka <[email protected]>
1 parent d16519a commit eddfdb3

File tree

3 files changed

+33
-1
lines changed

3 files changed

+33
-1
lines changed

Lib/test/test_urlparse.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1067,6 +1067,30 @@ def test_parse_qsl_separator(self):
10671067
result_bytes = urllib.parse.parse_qsl(orig, separator=b';')
10681068
self.assertEqual(result_bytes, expect, "Error parsing %r" % orig)
10691069

1070+
def test_parse_qsl_bytes(self):
1071+
self.assertEqual(urllib.parse.parse_qsl(b'a=b'), [(b'a', b'b')])
1072+
self.assertEqual(urllib.parse.parse_qsl(bytearray(b'a=b')), [(b'a', b'b')])
1073+
self.assertEqual(urllib.parse.parse_qsl(memoryview(b'a=b')), [(b'a', b'b')])
1074+
1075+
def test_parse_qsl_false_value(self):
1076+
kwargs = dict(keep_blank_values=True, strict_parsing=True)
1077+
for x in '', b'', None, 0, 0.0, [], {}, memoryview(b''):
1078+
self.assertEqual(urllib.parse.parse_qsl(x, **kwargs), [])
1079+
self.assertRaises(ValueError, urllib.parse.parse_qsl, x, separator=1)
1080+
1081+
def test_parse_qsl_errors(self):
1082+
self.assertRaises(TypeError, urllib.parse.parse_qsl, list(b'a=b'))
1083+
self.assertRaises(TypeError, urllib.parse.parse_qsl, iter(b'a=b'))
1084+
self.assertRaises(TypeError, urllib.parse.parse_qsl, 1)
1085+
self.assertRaises(TypeError, urllib.parse.parse_qsl, object())
1086+
1087+
for separator in '', b'', None, 0, 1, 0.0, 1.5:
1088+
with self.assertRaises(ValueError):
1089+
urllib.parse.parse_qsl('a=b', separator=separator)
1090+
with self.assertRaises(UnicodeEncodeError):
1091+
urllib.parse.parse_qsl(b'a=b', separator='\xa6')
1092+
with self.assertRaises(UnicodeDecodeError):
1093+
urllib.parse.parse_qsl('a=b', separator=b'\xa6')
10701094

10711095
def test_urlencode_sequences(self):
10721096
# Other tests incidentally urlencode things; test non-covered cases:

Lib/urllib/parse.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -765,7 +765,11 @@ def parse_qsl(qs, keep_blank_values=False, strict_parsing=False,
765765
def _unquote(s):
766766
return unquote_plus(s, encoding=encoding, errors=errors)
767767
else:
768-
qs = bytes(qs)
768+
if not qs:
769+
return []
770+
# Use memoryview() to reject integers and iterables,
771+
# acceptable by the bytes constructor.
772+
qs = bytes(memoryview(qs))
769773
if isinstance(separator, str):
770774
separator = bytes(separator, 'ascii')
771775
eq = b'='
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
Restore support of ``None`` and other false values in :mod:`urllib.parse`
2+
functions :func:`~urllib.parse.parse_qs` and
3+
:func:`~urllib.parse.parse_qsl`. Also, they now raise a TypeError for
4+
non-zero integers and non-empty sequences.

0 commit comments

Comments
 (0)