Kaydet (Commit) 5d83d1a8 authored tarafından Serhiy Storchaka's avatar Serhiy Storchaka

Issue #20270: urllib.urlparse now supports empty ports.

...@@ -394,6 +394,16 @@ class UrlParseTestCase(unittest.TestCase): ...@@ -394,6 +394,16 @@ class UrlParseTestCase(unittest.TestCase):
('http://[::12.34.56.78]/foo/', '::12.34.56.78', None), ('http://[::12.34.56.78]/foo/', '::12.34.56.78', None),
('http://[::ffff:12.34.56.78]/foo/', ('http://[::ffff:12.34.56.78]/foo/',
'::ffff:12.34.56.78', None), '::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): def _encode(t):
return t[0].encode('ascii'), t[1].encode('ascii'), t[2] return t[0].encode('ascii'), t[1].encode('ascii'), t[2]
...@@ -739,17 +749,25 @@ class UrlParseTestCase(unittest.TestCase): ...@@ -739,17 +749,25 @@ class UrlParseTestCase(unittest.TestCase):
errors="ignore") errors="ignore")
self.assertEqual(result, [('key', '\u0141-')]) 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): def test_splitnport(self):
# Normal cases are exercised by other tests; ensure that we also splitnport = urllib.parse.splitnport
# catch cases with no port specified. (testcase ensuring coverage) self.assertEqual(splitnport('parrot:88'), ('parrot', 88))
result = urllib.parse.splitnport('parrot:88') self.assertEqual(splitnport('parrot'), ('parrot', -1))
self.assertEqual(result, ('parrot', 88)) self.assertEqual(splitnport('parrot', 55), ('parrot', 55))
result = urllib.parse.splitnport('parrot') self.assertEqual(splitnport('parrot:'), ('parrot', -1))
self.assertEqual(result, ('parrot', -1)) self.assertEqual(splitnport('parrot:', 55), ('parrot', 55))
result = urllib.parse.splitnport('parrot', 55) self.assertEqual(splitnport('127.0.0.1'), ('127.0.0.1', -1))
self.assertEqual(result, ('parrot', 55)) self.assertEqual(splitnport('127.0.0.1', 55), ('127.0.0.1', 55))
result = urllib.parse.splitnport('parrot:') self.assertEqual(splitnport('parrot:cheese'), ('parrot', None))
self.assertEqual(result, ('parrot', None)) self.assertEqual(splitnport('parrot:cheese', 55), ('parrot', None))
def test_splitquery(self): def test_splitquery(self):
# Normal cases are exercised by other tests; ensure that we also # Normal cases are exercised by other tests; ensure that we also
......
...@@ -182,10 +182,10 @@ class _NetlocResultMixinStr(_NetlocResultMixinBase, _ResultMixinStr): ...@@ -182,10 +182,10 @@ class _NetlocResultMixinStr(_NetlocResultMixinBase, _ResultMixinStr):
_, have_open_br, bracketed = hostinfo.partition('[') _, have_open_br, bracketed = hostinfo.partition('[')
if have_open_br: if have_open_br:
hostname, _, port = bracketed.partition(']') hostname, _, port = bracketed.partition(']')
_, have_port, port = port.partition(':') _, _, port = port.partition(':')
else: else:
hostname, have_port, port = hostinfo.partition(':') hostname, _, port = hostinfo.partition(':')
if not have_port: if not port:
port = None port = None
return hostname, port return hostname, port
...@@ -212,10 +212,10 @@ class _NetlocResultMixinBytes(_NetlocResultMixinBase, _ResultMixinBytes): ...@@ -212,10 +212,10 @@ class _NetlocResultMixinBytes(_NetlocResultMixinBase, _ResultMixinBytes):
_, have_open_br, bracketed = hostinfo.partition(b'[') _, have_open_br, bracketed = hostinfo.partition(b'[')
if have_open_br: if have_open_br:
hostname, _, port = bracketed.partition(b']') hostname, _, port = bracketed.partition(b']')
_, have_port, port = port.partition(b':') _, _, port = port.partition(b':')
else: else:
hostname, have_port, port = hostinfo.partition(b':') hostname, _, port = hostinfo.partition(b':')
if not have_port: if not port:
port = None port = None
return hostname, port return hostname, port
...@@ -898,10 +898,13 @@ def splitport(host): ...@@ -898,10 +898,13 @@ def splitport(host):
"""splitport('host:port') --> 'host', 'port'.""" """splitport('host:port') --> 'host', 'port'."""
global _portprog global _portprog
if _portprog is None: if _portprog is None:
_portprog = re.compile('^(.*):([0-9]+)$') _portprog = re.compile('^(.*):([0-9]*)$')
match = _portprog.match(host) 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 return host, None
_nportprog = None _nportprog = None
...@@ -917,12 +920,12 @@ def splitnport(host, defport=-1): ...@@ -917,12 +920,12 @@ def splitnport(host, defport=-1):
match = _nportprog.match(host) match = _nportprog.match(host)
if match: if match:
host, port = match.group(1, 2) host, port = match.group(1, 2)
try: if port:
if not port: raise ValueError("no digits") try:
nport = int(port) nport = int(port)
except ValueError: except ValueError:
nport = None nport = None
return host, nport return host, nport
return host, defport return host, defport
_queryprog = None _queryprog = None
......
...@@ -25,6 +25,8 @@ Core and Builtins ...@@ -25,6 +25,8 @@ Core and Builtins
Library Library
------- -------
- Issue #20270: urllib.urlparse now supports empty ports.
- Issue #20243: TarFile no longer raise ReadError when opened in write mode. - 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 - Issue #20238: TarFile opened with external fileobj and "w:gz" mode didn't
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment