Index: Lib/test/test_urlparse.py =================================================================== --- Lib/test/test_urlparse.py (revision 63658) +++ Lib/test/test_urlparse.py (working copy) @@ -210,6 +210,34 @@ class UrlParseTestCase(unittest.TestCase self.checkJoin(RFC2396_BASE, 'g#s/./x', 'http://a/b/c/g#s/./x') self.checkJoin(RFC2396_BASE, 'g#s/../x', 'http://a/b/c/g#s/../x') + def test_rfc2732(self): + # FIXME: Needs test cases for proper error behaviour, especially + # if IPv4 addrs and hostnames also get a few error tests. + for url, hostname, port in [ + ('http://Test.python.org:5432/foo/', 'test.python.org', 5432), + ('http://12.34.56.78:5432/foo/', '12.34.56.78', 5432), + ('http://[::1]:5432/foo/', '[::1]', 5432), + ('http://[dead:beef::1]:5432/foo/', '[dead:beef::1]', 5432), + ('http://[dead:beef::]:5432/foo/', '[dead:beef::]', 5432), + ('http://[dead:beef:cafe:5417:affe:8FA3:deaf:feed]:5432/foo/', + '[dead:beef:cafe:5417:affe:8fa3:deaf:feed]', 5432), + ('http://[::12.34.56.78]:5432/foo/', '[::12.34.56.78]', 5432), + ('http://[::ffff:12.34.56.78]:5432/foo/', + '[::ffff:12.34.56.78]', 5432), + ('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)) + def test_urldefrag(self): for url, defrag, frag in [ ('http://python.org#frag', 'http://python.org', 'frag'),