(original) (raw)
changeset: 97346:7c78279afc30 user: Robert Collins rbtcollins@hp.com date: Mon Aug 10 09:53:30 2015 +1200 files: Doc/library/urllib.parse.rst Doc/whatsnew/3.6.rst Lib/test/test_urlparse.py Lib/urllib/parse.py Misc/NEWS description: Issue #20059: urllib.parse raises ValueError on all invalid ports. Patch by Martin Panter. diff -r a16c6456f34b -r 7c78279afc30 Doc/library/urllib.parse.rst --- a/Doc/library/urllib.parse.rst Sun Aug 09 13:44:04 2015 +0300 +++ b/Doc/library/urllib.parse.rst Mon Aug 10 09:53:30 2015 +1200 @@ -115,8 +115,9 @@ | | | if present | | +------------------+-------+--------------------------+----------------------+ - See section :ref:`urlparse-result-object` for more information on the result - object. + Reading the :attr:`port` attribute will raise a :exc:`ValueError` if + an invalid port is specified in the URL. See section + :ref:`urlparse-result-object` for more information on the result object. .. versionchanged:: 3.2 Added IPv6 URL parsing capabilities. @@ -126,6 +127,10 @@ false), in accordance with :rfc:`3986`. Previously, a whitelist of 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') @@ -228,8 +233,13 @@ | | | if present | | +------------------+-------+-------------------------+----------------------+ - See section :ref:`urlparse-result-object` for more information on the result - object. + Reading the :attr:`port` attribute will raise a :exc:`ValueError` if + 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) diff -r a16c6456f34b -r 7c78279afc30 Doc/whatsnew/3.6.rst --- a/Doc/whatsnew/3.6.rst Sun Aug 09 13:44:04 2015 +0300 +++ b/Doc/whatsnew/3.6.rst Mon Aug 10 09:53:30 2015 +1200 @@ -162,7 +162,10 @@ 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 diff -r a16c6456f34b -r 7c78279afc30 Lib/test/test_urlparse.py --- a/Lib/test/test_urlparse.py Sun Aug 09 13:44:04 2015 +0300 +++ b/Lib/test/test_urlparse.py Mon Aug 10 09:53:30 2015 +1200 @@ -554,29 +554,27 @@ self.assertEqual(p.port, 80) 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" 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): - """Check handling of non-integer ports.""" - p = urllib.parse.urlsplit("http://www.example.net:foo") - self.assertEqual(p.netloc, "www.example.net:foo") - self.assertRaises(ValueError, lambda: p.port) - - p = urllib.parse.urlparse("http://www.example.net:foo") - self.assertEqual(p.netloc, "www.example.net:foo") - self.assertRaises(ValueError, lambda: p.port) - - # Once again, repeat ourselves to test bytes - p = urllib.parse.urlsplit(b"http://www.example.net:foo") - self.assertEqual(p.netloc, b"www.example.net:foo") - self.assertRaises(ValueError, lambda: 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) + """Check handling of invalid ports.""" + for bytes in (False, True): + for parse in (urllib.parse.urlsplit, urllib.parse.urlparse): + for port in ("foo", "1.5", "-1", "0x10"): + with self.subTest(bytes=bytes, parse=parse, port=port): + netloc = "www.example.net:" + port + url = "http://" + netloc + if bytes: + netloc = netloc.encode("ascii") + url = url.encode("ascii") + p = parse(url) + self.assertEqual(p.netloc, netloc) + with self.assertRaises(ValueError): + p.port def test_attributes_without_netloc(self): # This example is straight from RFC 3261. It looks like it diff -r a16c6456f34b -r 7c78279afc30 Lib/urllib/parse.py --- a/Lib/urllib/parse.py Sun Aug 09 13:44:04 2015 +0300 +++ b/Lib/urllib/parse.py Mon Aug 10 09:53:30 2015 +1200 @@ -156,9 +156,8 @@ port = self._hostinfo[1] if port is not None: port = int(port, 10) - # Return None on an illegal port if not ( 0 <= port <= 65535): - return None + raise ValueError("Port out of range 0-65535") return port diff -r a16c6456f34b -r 7c78279afc30 Misc/NEWS --- a/Misc/NEWS Sun Aug 09 13:44:04 2015 +0300 +++ b/Misc/NEWS Mon Aug 10 09:53:30 2015 +1200 @@ -15,6 +15,9 @@ 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 compatible with pydoc. /rbtcollins@hp.com