From d5b80eb11b4812b4a579ce129ba4a10c5f5d27f6 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 16 Apr 2021 10:07:31 -0700 Subject: [PATCH] bpo-42967: coerce bytes separator to string in urllib.parse_qs(l) (GH-24818) (#25345) * 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 | 4 ++++ Lib/urllib/parse.py | 1 + .../next/Library/2021-03-11-00-31-41.bpo-42967.2PeQRw.rst | 3 +++ 3 files changed, 8 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2021-03-11-00-31-41.bpo-42967.2PeQRw.rst diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py index 90c8d6922629..d2ec0dadbcb0 100644 --- a/Lib/test/test_urlparse.py +++ b/Lib/test/test_urlparse.py @@ -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): diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py index 0c1c94f5fc98..36fd8fe2803e 100644 --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -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 index 000000000000..f8ad3eaaedd7 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-03-11-00-31-41.bpo-42967.2PeQRw.rst @@ -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``. -- 2.47.3