mirror of https://github.com/python/cpython
gh-116764: Fix regressions in urllib.parse.parse_qsl() (GH-116801)
* 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
(bdba8ef42b
).
This commit is contained in:
parent
269051d20e
commit
1069a462f6
|
@ -1072,6 +1072,30 @@ class UrlParseTestCase(unittest.TestCase):
|
||||||
result_bytes = urllib.parse.parse_qsl(orig, separator=b';')
|
result_bytes = urllib.parse.parse_qsl(orig, separator=b';')
|
||||||
self.assertEqual(result_bytes, expect, "Error parsing %r" % orig)
|
self.assertEqual(result_bytes, expect, "Error parsing %r" % orig)
|
||||||
|
|
||||||
|
def test_parse_qsl_bytes(self):
|
||||||
|
self.assertEqual(urllib.parse.parse_qsl(b'a=b'), [(b'a', b'b')])
|
||||||
|
self.assertEqual(urllib.parse.parse_qsl(bytearray(b'a=b')), [(b'a', b'b')])
|
||||||
|
self.assertEqual(urllib.parse.parse_qsl(memoryview(b'a=b')), [(b'a', b'b')])
|
||||||
|
|
||||||
|
def test_parse_qsl_false_value(self):
|
||||||
|
kwargs = dict(keep_blank_values=True, strict_parsing=True)
|
||||||
|
for x in '', b'', None, 0, 0.0, [], {}, memoryview(b''):
|
||||||
|
self.assertEqual(urllib.parse.parse_qsl(x, **kwargs), [])
|
||||||
|
self.assertRaises(ValueError, urllib.parse.parse_qsl, x, separator=1)
|
||||||
|
|
||||||
|
def test_parse_qsl_errors(self):
|
||||||
|
self.assertRaises(TypeError, urllib.parse.parse_qsl, list(b'a=b'))
|
||||||
|
self.assertRaises(TypeError, urllib.parse.parse_qsl, iter(b'a=b'))
|
||||||
|
self.assertRaises(TypeError, urllib.parse.parse_qsl, 1)
|
||||||
|
self.assertRaises(TypeError, urllib.parse.parse_qsl, object())
|
||||||
|
|
||||||
|
for separator in '', b'', None, 0, 1, 0.0, 1.5:
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
urllib.parse.parse_qsl('a=b', separator=separator)
|
||||||
|
with self.assertRaises(UnicodeEncodeError):
|
||||||
|
urllib.parse.parse_qsl(b'a=b', separator='\xa6')
|
||||||
|
with self.assertRaises(UnicodeDecodeError):
|
||||||
|
urllib.parse.parse_qsl('a=b', separator=b'\xa6')
|
||||||
|
|
||||||
def test_urlencode_sequences(self):
|
def test_urlencode_sequences(self):
|
||||||
# Other tests incidentally urlencode things; test non-covered cases:
|
# Other tests incidentally urlencode things; test non-covered cases:
|
||||||
|
|
|
@ -773,7 +773,11 @@ def parse_qsl(qs, keep_blank_values=False, strict_parsing=False,
|
||||||
def _unquote(s):
|
def _unquote(s):
|
||||||
return unquote_plus(s, encoding=encoding, errors=errors)
|
return unquote_plus(s, encoding=encoding, errors=errors)
|
||||||
else:
|
else:
|
||||||
qs = bytes(qs)
|
if not qs:
|
||||||
|
return []
|
||||||
|
# Use memoryview() to reject integers and iterables,
|
||||||
|
# acceptable by the bytes constructor.
|
||||||
|
qs = bytes(memoryview(qs))
|
||||||
if isinstance(separator, str):
|
if isinstance(separator, str):
|
||||||
separator = bytes(separator, 'ascii')
|
separator = bytes(separator, 'ascii')
|
||||||
eq = b'='
|
eq = b'='
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
Restore support of ``None`` and other false values in :mod:`urllib.parse`
|
||||||
|
functions :func:`~urllib.parse.parse_qs` and
|
||||||
|
:func:`~urllib.parse.parse_qsl`. Also, they now raise a TypeError for
|
||||||
|
non-zero integers and non-empty sequences.
|
Loading…
Reference in New Issue