From 326b5ab05a810dd75670b5e3386127d172bedca3 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sat, 18 Jan 2014 18:30:09 +0200 Subject: [PATCH] Issue #20270: urllib and urlparse now support empty ports. --- Lib/test/test_urllib.py | 20 ++++++++++++++++++++ Lib/test/test_urlparse.py | 10 ++++++++++ Lib/urllib.py | 19 +++++++++++-------- Lib/urlparse.py | 9 +++++---- Misc/NEWS | 2 ++ 5 files changed, 48 insertions(+), 12 deletions(-) diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index 3018ab198b..fa88b61a11 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -789,6 +789,26 @@ class Utility_Tests(unittest.TestCase): self.assertEqual(('user 2', 'ab'),urllib.splitpasswd('user 2:ab')) self.assertEqual(('user+1', 'a+b'),urllib.splitpasswd('user+1:a+b')) + def test_splitport(self): + splitport = urllib.splitport + self.assertEqual(splitport('parrot:88'), ('parrot', '88')) + self.assertEqual(splitport('parrot'), ('parrot', None)) + self.assertEqual(splitport('parrot:'), ('parrot', None)) + self.assertEqual(splitport('127.0.0.1'), ('127.0.0.1', None)) + self.assertEqual(splitport('parrot:cheese'), ('parrot:cheese', None)) + + def test_splitnport(self): + splitnport = urllib.splitnport + self.assertEqual(splitnport('parrot:88'), ('parrot', 88)) + self.assertEqual(splitnport('parrot'), ('parrot', -1)) + self.assertEqual(splitnport('parrot', 55), ('parrot', 55)) + self.assertEqual(splitnport('parrot:'), ('parrot', -1)) + self.assertEqual(splitnport('parrot:', 55), ('parrot', 55)) + self.assertEqual(splitnport('127.0.0.1'), ('127.0.0.1', -1)) + self.assertEqual(splitnport('127.0.0.1', 55), ('127.0.0.1', 55)) + self.assertEqual(splitnport('parrot:cheese'), ('parrot', None)) + self.assertEqual(splitnport('parrot:cheese', 55), ('parrot', None)) + class URLopener_Tests(unittest.TestCase): """Testcase to test the open method of URLopener class.""" diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py index 13dd297c49..b3ad7cd513 100644 --- a/Lib/test/test_urlparse.py +++ b/Lib/test/test_urlparse.py @@ -362,6 +362,16 @@ class UrlParseTestCase(unittest.TestCase): ('http://[::12.34.56.78]/foo/', '::12.34.56.78', None), ('http://[::ffff:12.34.56.78]/foo/', '::ffff:12.34.56.78', None), + ('http://Test.python.org:/foo/', 'test.python.org', None), + ('http://12.34.56.78:/foo/', '12.34.56.78', None), + ('http://[::1]:/foo/', '::1', None), + ('http://[dead:beef::1]:/foo/', 'dead:beef::1', None), + ('http://[dead:beef::]:/foo/', 'dead:beef::', None), + ('http://[dead:beef:cafe:5417:affe:8FA3:deaf:feed]:/foo/', + 'dead:beef:cafe:5417:affe:8fa3:deaf:feed', None), + ('http://[::12.34.56.78]:/foo/', '::12.34.56.78', None), + ('http://[::ffff:12.34.56.78]:/foo/', + '::ffff:12.34.56.78', None), ]: urlparsed = urlparse.urlparse(url) self.assertEqual((urlparsed.hostname, urlparsed.port) , (hostname, port)) diff --git a/Lib/urllib.py b/Lib/urllib.py index 244cb05374..ac5d797e33 100644 --- a/Lib/urllib.py +++ b/Lib/urllib.py @@ -1125,10 +1125,13 @@ def splitport(host): global _portprog if _portprog is None: import re - _portprog = re.compile('^(.*):([0-9]+)$') + _portprog = re.compile('^(.*):([0-9]*)$') match = _portprog.match(host) - if match: return match.group(1, 2) + if match: + host, port = match.groups() + if port: + return host, port return host, None _nportprog = None @@ -1145,12 +1148,12 @@ def splitnport(host, defport=-1): match = _nportprog.match(host) if match: host, port = match.group(1, 2) - try: - if not port: raise ValueError, "no digits" - nport = int(port) - except ValueError: - nport = None - return host, nport + if port: + try: + nport = int(port) + except ValueError: + nport = None + return host, nport return host, defport _queryprog = None diff --git a/Lib/urlparse.py b/Lib/urlparse.py index 4ce982e8fd..4cd3d6743a 100644 --- a/Lib/urlparse.py +++ b/Lib/urlparse.py @@ -109,10 +109,11 @@ class ResultMixin(object): netloc = self.netloc.split('@')[-1].split(']')[-1] if ':' in netloc: port = netloc.split(':')[1] - port = int(port, 10) - # verify legal port - if (0 <= port <= 65535): - return port + if port: + port = int(port, 10) + # verify legal port + if (0 <= port <= 65535): + return port return None from collections import namedtuple diff --git a/Misc/NEWS b/Misc/NEWS index abafed787b..40a9c5d190 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -35,6 +35,8 @@ Core and Builtins Library ------- +- Issue #20270: urllib and urlparse now support empty ports. + - Issue #20243: TarFile no longer raise ReadError when opened in write mode. - Issue #20245: The open functions in the tarfile module now correctly handle -- 2.50.1