]> granicus.if.org Git - python/commitdiff
Issue #20270: urllib.urlparse now supports empty ports.
authorSerhiy Storchaka <storchaka@gmail.com>
Sat, 18 Jan 2014 16:30:33 +0000 (18:30 +0200)
committerSerhiy Storchaka <storchaka@gmail.com>
Sat, 18 Jan 2014 16:30:33 +0000 (18:30 +0200)
Lib/test/test_urlparse.py
Lib/urllib/parse.py
Misc/NEWS

index 9d695da9a12088d23cbfd038c965446d5721499f..d67cf258b0212331ce604599aa88b4ab580b3c39 100644 (file)
@@ -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
index 9a2df41faf92d0901c63f38322847b2504fac12f..975c6ffb9c15a30487542d0927d0c63b8527b19f 100644 (file)
@@ -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
index 533d5c5949222e1486bec0e51aec2ddf6f0af467..b831e491a223b960dd142437db6c1ae47c9aaa7f 100644 (file)
--- 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