Issue #20270: urllib and urlparse now support empty ports.
diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py
index 3018ab1..fa88b61 100644
--- a/Lib/test/test_urllib.py
+++ b/Lib/test/test_urllib.py
@@ -789,6 +789,26 @@
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 13dd297..b3ad7cd 100644
--- a/Lib/test/test_urlparse.py
+++ b/Lib/test/test_urlparse.py
@@ -362,6 +362,16 @@
('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 244cb05..ac5d797 100644
--- a/Lib/urllib.py
+++ b/Lib/urllib.py
@@ -1125,10 +1125,13 @@
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 @@
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 4ce982e..4cd3d67 100644
--- a/Lib/urlparse.py
+++ b/Lib/urlparse.py
@@ -109,10 +109,11 @@
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 abafed7..40a9c5d 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -35,6 +35,8 @@
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