mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
Issue #20059: urllib.parse raises ValueError on all invalid ports.
Patch by Martin Panter.
This commit is contained in:
parent
846a1487cb
commit
dfa95c9a8f
5 changed files with 39 additions and 26 deletions
|
@ -115,8 +115,9 @@ or on combining URL components into a URL string.
|
||||||
| | | if present | |
|
| | | if present | |
|
||||||
+------------------+-------+--------------------------+----------------------+
|
+------------------+-------+--------------------------+----------------------+
|
||||||
|
|
||||||
See section :ref:`urlparse-result-object` for more information on the result
|
Reading the :attr:`port` attribute will raise a :exc:`ValueError` if
|
||||||
object.
|
an invalid port is specified in the URL. See section
|
||||||
|
:ref:`urlparse-result-object` for more information on the result object.
|
||||||
|
|
||||||
.. versionchanged:: 3.2
|
.. versionchanged:: 3.2
|
||||||
Added IPv6 URL parsing capabilities.
|
Added IPv6 URL parsing capabilities.
|
||||||
|
@ -126,6 +127,10 @@ or on combining URL components into a URL string.
|
||||||
false), in accordance with :rfc:`3986`. Previously, a whitelist of
|
false), in accordance with :rfc:`3986`. Previously, a whitelist of
|
||||||
schemes that support fragments existed.
|
schemes that support fragments existed.
|
||||||
|
|
||||||
|
.. versionchanged:: 3.6
|
||||||
|
Out-of-range port numbers now raise :exc:`ValueError`, instead of
|
||||||
|
returning :const:`None`.
|
||||||
|
|
||||||
|
|
||||||
.. function:: parse_qs(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace')
|
.. function:: parse_qs(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace')
|
||||||
|
|
||||||
|
@ -228,8 +233,13 @@ or on combining URL components into a URL string.
|
||||||
| | | if present | |
|
| | | if present | |
|
||||||
+------------------+-------+-------------------------+----------------------+
|
+------------------+-------+-------------------------+----------------------+
|
||||||
|
|
||||||
See section :ref:`urlparse-result-object` for more information on the result
|
Reading the :attr:`port` attribute will raise a :exc:`ValueError` if
|
||||||
object.
|
an invalid port is specified in the URL. See section
|
||||||
|
:ref:`urlparse-result-object` for more information on the result object.
|
||||||
|
|
||||||
|
.. versionchanged:: 3.6
|
||||||
|
Out-of-range port numbers now raise :exc:`ValueError`, instead of
|
||||||
|
returning :const:`None`.
|
||||||
|
|
||||||
|
|
||||||
.. function:: urlunsplit(parts)
|
.. function:: urlunsplit(parts)
|
||||||
|
|
|
@ -162,7 +162,10 @@ that may require changes to your code.
|
||||||
Changes in the Python API
|
Changes in the Python API
|
||||||
-------------------------
|
-------------------------
|
||||||
|
|
||||||
* None yet.
|
* Reading the :attr:`~urllib.parse.SplitResult.port` attribute of
|
||||||
|
:func:`urllib.parse.urlsplit` and :func:`~urllib.parse.urlparse` results
|
||||||
|
now raises :exc:`ValueError` for out-of-range values, rather than
|
||||||
|
returning :const:`None`. See :issue:`20059`.
|
||||||
|
|
||||||
|
|
||||||
Changes in the C API
|
Changes in the C API
|
||||||
|
|
|
@ -554,29 +554,27 @@ class UrlParseTestCase(unittest.TestCase):
|
||||||
self.assertEqual(p.port, 80)
|
self.assertEqual(p.port, 80)
|
||||||
self.assertEqual(p.geturl(), url)
|
self.assertEqual(p.geturl(), url)
|
||||||
|
|
||||||
# Verify an illegal port is returned as None
|
# Verify an illegal port raises ValueError
|
||||||
url = b"HTTP://WWW.PYTHON.ORG:65536/doc/#frag"
|
url = b"HTTP://WWW.PYTHON.ORG:65536/doc/#frag"
|
||||||
p = urllib.parse.urlsplit(url)
|
p = urllib.parse.urlsplit(url)
|
||||||
self.assertEqual(p.port, None)
|
with self.assertRaisesRegex(ValueError, "out of range"):
|
||||||
|
p.port
|
||||||
|
|
||||||
def test_attributes_bad_port(self):
|
def test_attributes_bad_port(self):
|
||||||
"""Check handling of non-integer ports."""
|
"""Check handling of invalid ports."""
|
||||||
p = urllib.parse.urlsplit("http://www.example.net:foo")
|
for bytes in (False, True):
|
||||||
self.assertEqual(p.netloc, "www.example.net:foo")
|
for parse in (urllib.parse.urlsplit, urllib.parse.urlparse):
|
||||||
self.assertRaises(ValueError, lambda: p.port)
|
for port in ("foo", "1.5", "-1", "0x10"):
|
||||||
|
with self.subTest(bytes=bytes, parse=parse, port=port):
|
||||||
p = urllib.parse.urlparse("http://www.example.net:foo")
|
netloc = "www.example.net:" + port
|
||||||
self.assertEqual(p.netloc, "www.example.net:foo")
|
url = "http://" + netloc
|
||||||
self.assertRaises(ValueError, lambda: p.port)
|
if bytes:
|
||||||
|
netloc = netloc.encode("ascii")
|
||||||
# Once again, repeat ourselves to test bytes
|
url = url.encode("ascii")
|
||||||
p = urllib.parse.urlsplit(b"http://www.example.net:foo")
|
p = parse(url)
|
||||||
self.assertEqual(p.netloc, b"www.example.net:foo")
|
self.assertEqual(p.netloc, netloc)
|
||||||
self.assertRaises(ValueError, lambda: p.port)
|
with self.assertRaises(ValueError):
|
||||||
|
p.port
|
||||||
p = urllib.parse.urlparse(b"http://www.example.net:foo")
|
|
||||||
self.assertEqual(p.netloc, b"www.example.net:foo")
|
|
||||||
self.assertRaises(ValueError, lambda: p.port)
|
|
||||||
|
|
||||||
def test_attributes_without_netloc(self):
|
def test_attributes_without_netloc(self):
|
||||||
# This example is straight from RFC 3261. It looks like it
|
# This example is straight from RFC 3261. It looks like it
|
||||||
|
|
|
@ -156,9 +156,8 @@ class _NetlocResultMixinBase(object):
|
||||||
port = self._hostinfo[1]
|
port = self._hostinfo[1]
|
||||||
if port is not None:
|
if port is not None:
|
||||||
port = int(port, 10)
|
port = int(port, 10)
|
||||||
# Return None on an illegal port
|
|
||||||
if not ( 0 <= port <= 65535):
|
if not ( 0 <= port <= 65535):
|
||||||
return None
|
raise ValueError("Port out of range 0-65535")
|
||||||
return port
|
return port
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,9 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #20059: urllib.parse raises ValueError on all invalid ports.
|
||||||
|
Patch by Martin Panter.
|
||||||
|
|
||||||
- Issue #24824: Signatures of codecs.encode() and codecs.decode() now are
|
- Issue #24824: Signatures of codecs.encode() and codecs.decode() now are
|
||||||
compatible with pydoc.
|
compatible with pydoc.
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue