summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2014-01-18 16:30:33 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2014-01-18 16:30:33 (GMT)
commitff97b08d0022392da23a25aa5ccb04e6a2966e8b (patch)
treee8b304f8bf9b2bb260a783fea484a233cffb4dab
parente413cde95f79544aefce5576ebb92d18cbf6ff2e (diff)
downloadcpython-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.py38
-rw-r--r--Lib/urllib/parse.py31
-rw-r--r--Misc/NEWS2
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
diff --git a/Misc/NEWS b/Misc/NEWS
index 533d5c5..b831e49 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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