diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2014-01-18 16:30:33 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2014-01-18 16:30:33 (GMT) |
commit | ff97b08d0022392da23a25aa5ccb04e6a2966e8b (patch) | |
tree | e8b304f8bf9b2bb260a783fea484a233cffb4dab | |
parent | e413cde95f79544aefce5576ebb92d18cbf6ff2e (diff) | |
download | cpython-ff97b08d0022392da23a25aa5ccb04e6a2966e8b.zip cpython-ff97b08d0022392da23a25aa5ccb04e6a2966e8b.tar.gz cpython-ff97b08d0022392da23a25aa5ccb04e6a2966e8b.tar.bz2 |
Issue #20270: urllib.urlparse now supports empty ports.
-rw-r--r-- | Lib/test/test_urlparse.py | 38 | ||||
-rw-r--r-- | Lib/urllib/parse.py | 31 | ||||
-rw-r--r-- | Misc/NEWS | 2 |
3 files changed, 47 insertions, 24 deletions
diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py index 9d695da..d67cf25 100644 --- a/Lib/test/test_urlparse.py +++ b/Lib/test/test_urlparse.py @@ -394,6 +394,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), ] def _encode(t): return t[0].encode('ascii'), t[1].encode('ascii'), t[2] @@ -739,17 +749,25 @@ class UrlParseTestCase(unittest.TestCase): errors="ignore") self.assertEqual(result, [('key', '\u0141-')]) + def test_splitport(self): + splitport = urllib.parse.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): - # Normal cases are exercised by other tests; ensure that we also - # catch cases with no port specified. (testcase ensuring coverage) - result = urllib.parse.splitnport('parrot:88') - self.assertEqual(result, ('parrot', 88)) - result = urllib.parse.splitnport('parrot') - self.assertEqual(result, ('parrot', -1)) - result = urllib.parse.splitnport('parrot', 55) - self.assertEqual(result, ('parrot', 55)) - result = urllib.parse.splitnport('parrot:') - self.assertEqual(result, ('parrot', None)) + splitnport = urllib.parse.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)) def test_splitquery(self): # Normal cases are exercised by other tests; ensure that we also diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py index 9a2df41..975c6ff 100644 --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -182,10 +182,10 @@ class _NetlocResultMixinStr(_NetlocResultMixinBase, _ResultMixinStr): _, have_open_br, bracketed = hostinfo.partition('[') if have_open_br: hostname, _, port = bracketed.partition(']') - _, have_port, port = port.partition(':') + _, _, port = port.partition(':') else: - hostname, have_port, port = hostinfo.partition(':') - if not have_port: + hostname, _, port = hostinfo.partition(':') + if not port: port = None return hostname, port @@ -212,10 +212,10 @@ class _NetlocResultMixinBytes(_NetlocResultMixinBase, _ResultMixinBytes): _, have_open_br, bracketed = hostinfo.partition(b'[') if have_open_br: hostname, _, port = bracketed.partition(b']') - _, have_port, port = port.partition(b':') + _, _, port = port.partition(b':') else: - hostname, have_port, port = hostinfo.partition(b':') - if not have_port: + hostname, _, port = hostinfo.partition(b':') + if not port: port = None return hostname, port @@ -903,10 +903,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 @@ -923,12 +926,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 @@ -43,6 +43,8 @@ Core and Builtins Library ------- +- Issue #20270: urllib.urlparse now supports empty ports. + - Issue #20243: TarFile no longer raise ReadError when opened in write mode. - Issue #20238: TarFile opened with external fileobj and "w:gz" mode didn't |