summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2024-03-16 11:00:32 (GMT)
committerGitHub <noreply@github.com>2024-03-16 11:00:32 (GMT)
commit716d482ba49a72adad4db98db92bb30667a566c7 (patch)
tree6c4ae0504212c3f87294bbc39129f7d476e9284d /Lib
parent32c775165fd455a0ab0709c2897647f01c038c36 (diff)
downloadcpython-716d482ba49a72adad4db98db92bb30667a566c7.zip
cpython-716d482ba49a72adad4db98db92bb30667a566c7.tar.gz
cpython-716d482ba49a72adad4db98db92bb30667a566c7.tar.bz2
[3.12] gh-116764: Fix regressions in urllib.parse.parse_qsl() (GH-116801) (GH-116894)
* 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 (bdba8ef42b15e651dc23374a08143cc2b4c4657d). (cherry picked from commit 1069a462f611f0b70b6eec0bba603d618a0378f3) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Diffstat (limited to 'Lib')
-rw-r--r--Lib/test/test_urlparse.py24
-rw-r--r--Lib/urllib/parse.py6
2 files changed, 29 insertions, 1 deletions
diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py
index 72f0286..236b6e4 100644
--- a/Lib/test/test_urlparse.py
+++ b/Lib/test/test_urlparse.py
@@ -1072,6 +1072,30 @@ class UrlParseTestCase(unittest.TestCase):
result_bytes = urllib.parse.parse_qsl(orig, separator=b';')
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):
# Other tests incidentally urlencode things; test non-covered cases:
diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py
index ec52821..fc9e7c9 100644
--- a/Lib/urllib/parse.py
+++ b/Lib/urllib/parse.py
@@ -773,7 +773,11 @@ def parse_qsl(qs, keep_blank_values=False, strict_parsing=False,
def _unquote(s):
return unquote_plus(s, encoding=encoding, errors=errors)
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):
separator = bytes(separator, 'ascii')
eq = b'='