From 8c2f99951febce6996a183ec7e505f26d838098b Mon Sep 17 00:00:00 2001 From: Markus Birth Date: Tue, 3 Nov 2015 16:01:40 +0100 Subject: [PATCH] IPv6 support. --- http.py | 5 ++--- test/test_http.py | 15 ++++++++++++++- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/http.py b/http.py index 9d5aa4f..ec890ce 100644 --- a/http.py +++ b/http.py @@ -19,15 +19,14 @@ class HTTP: query = re1.group(7) fragment = re1.group(9) - # TODO: Not IPv6 ready!!! - re2 = re.match('^(([^:]+)(:([^@]*))?@)?([^:]+)(:(\d+))?$', hostpart) + re2 = re.match('^(([^:]+)(:([^@]*))?@)?((\[.+\])|[^:]+)(:(\d+))?$', hostpart) #for i in range(0, 10): # print(str(i) + ': ' + re2.group(i)) username = re2.group(2) or None password = re2.group(4) or None hostname = re2.group(5) or None - port = re2.group(7) or None + port = re2.group(8) or None if port: port = int(port) diff --git a/test/test_http.py b/test/test_http.py index 4fe1a52..e7251df 100755 --- a/test/test_http.py +++ b/test/test_http.py @@ -10,7 +10,7 @@ class TestHttp(unittest.TestCase): import http self.http = http.HTTP() - def test_parse_url(self): + def test_parse_url1(self): urlparts = self.http.parse_url('https://user:passwd@example.org:1234/test?x=3&y=4#fragme') self.assertEqual(urlparts.scheme, 'https') self.assertEqual(urlparts.hostname, 'example.org') @@ -54,6 +54,19 @@ class TestHttp(unittest.TestCase): self.assertEqual(urlparts.password, None) self.assertEqual(urlparts.port, 1234) + def test_parse_ipv6_1(self): + urlparts = self.http.parse_url('http://[fedc:ba98::3210]/test') + self.assertEqual(urlparts.hostname, '[fedc:ba98::3210]') + + def test_parse_ipv6_2(self): + urlparts = self.http.parse_url('http://[fedc:ba98::3210]:1234/test') + self.assertEqual(urlparts.hostname, '[fedc:ba98::3210]') + self.assertEqual(urlparts.port, 1234) + + def test_parse_ipv6_3(self): + urlparts = self.http.parse_url('http://[::FFFF:129.144.52.38]:5678/blah') + self.assertEqual(urlparts.hostname, '[::FFFF:129.144.52.38]') + self.assertEqual(urlparts.port, 5678) if __name__ == '__main__': unittest.main()