]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-42967: coerce bytes separator to string in urllib.parse_qs(l) (GH-24818) (#25345)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Fri, 16 Apr 2021 17:07:31 +0000 (10:07 -0700)
committerGitHub <noreply@github.com>
Fri, 16 Apr 2021 17:07:31 +0000 (10:07 -0700)
* coerce bytes separator to string

* Add news

* Update Misc/NEWS.d/next/Library/2021-03-11-00-31-41.bpo-42967.2PeQRw.rst
(cherry picked from commit b38601d49675d90e1ee6faa47f7adaeca992d02d)

Co-authored-by: Ken Jin <28750310+Fidget-Spinner@users.noreply.github.com>
Co-authored-by: Ken Jin <28750310+Fidget-Spinner@users.noreply.github.com>
Lib/test/test_urlparse.py
Lib/urllib/parse.py
Misc/NEWS.d/next/Library/2021-03-11-00-31-41.bpo-42967.2PeQRw.rst [new file with mode: 0644]

index 90c8d6922629e81ee0ea4d98d82e9bd43c4f87c8..d2ec0dadbcb0718ffd0c2891d5603b11cbdf60b2 100644 (file)
@@ -891,6 +891,8 @@ class UrlParseTestCase(unittest.TestCase):
             with self.subTest(f"Original: {orig!r}, Expected: {expect!r}"):
                 result = urllib.parse.parse_qs(orig, separator=';')
                 self.assertEqual(result, expect, "Error parsing %r" % orig)
+                result_bytes = urllib.parse.parse_qs(orig, separator=b';')
+                self.assertEqual(result_bytes, expect, "Error parsing %r" % orig)
 
 
     def test_parse_qsl_separator(self):
@@ -910,6 +912,8 @@ class UrlParseTestCase(unittest.TestCase):
             with self.subTest(f"Original: {orig!r}, Expected: {expect!r}"):
                 result = urllib.parse.parse_qsl(orig, separator=';')
                 self.assertEqual(result, expect, "Error parsing %r" % orig)
+                result_bytes = urllib.parse.parse_qsl(orig, separator=b';')
+                self.assertEqual(result_bytes, expect, "Error parsing %r" % orig)
 
 
     def test_urlencode_sequences(self):
index 0c1c94f5fc986b09539f5e08337e2722ab907c80..36fd8fe2803e2234bb3426f5a154d155d979f64c 100644 (file)
@@ -721,6 +721,7 @@ def parse_qsl(qs, keep_blank_values=False, strict_parsing=False,
         Returns a list, as G-d intended.
     """
     qs, _coerce_result = _coerce_args(qs)
+    separator, _ = _coerce_args(separator)
 
     if not separator or (not isinstance(separator, (str, bytes))):
         raise ValueError("Separator must be of type string or bytes.")
diff --git a/Misc/NEWS.d/next/Library/2021-03-11-00-31-41.bpo-42967.2PeQRw.rst b/Misc/NEWS.d/next/Library/2021-03-11-00-31-41.bpo-42967.2PeQRw.rst
new file mode 100644 (file)
index 0000000..f8ad3ea
--- /dev/null
@@ -0,0 +1,3 @@
+Allow :class:`bytes` ``separator`` argument in ``urllib.parse.parse_qs`` and
+``urllib.parse.parse_qsl`` when parsing :class:`str` query strings.  Previously,
+this raised a ``TypeError``.