diff options
| -rw-r--r-- | Doc/library/urllib.parse.rst | 5 | ||||
| -rw-r--r-- | Lib/test/test_urlparse.py | 4 | ||||
| -rw-r--r-- | Lib/urllib/parse.py | 14 | 
3 files changed, 12 insertions, 11 deletions
diff --git a/Doc/library/urllib.parse.rst b/Doc/library/urllib.parse.rst index ac05503bc9..49000050a1 100644 --- a/Doc/library/urllib.parse.rst +++ b/Doc/library/urllib.parse.rst @@ -88,6 +88,9 @@ The :mod:`urllib.parse` module defines the following functions:     See section :ref:`urlparse-result-object` for more information on the result     object. +   .. versionchanged:: 3.2 +      Added IPv6 URL parsing capabilities. +  .. function:: parse_qs(qs, keep_blank_values=False, strict_parsing=False) @@ -329,7 +332,7 @@ The :mod:`urllib.parse` module defines the following functions:     :rfc:`3986` - Uniform Resource Identifiers        This is the current standard (STD66). Any changes to urlparse module        should conform to this. Certain deviations could be observed, which are -      mostly due backward compatiblity purposes and for certain to de-facto +      mostly due backward compatiblity purposes and for certain de-facto        parsing requirements as commonly observed in major browsers.     :rfc:`2732` - Format for Literal IPv6 Addresses in URL's. diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py index a0b2d77790..f67487df1b 100644 --- a/Lib/test/test_urlparse.py +++ b/Lib/test/test_urlparse.py @@ -273,10 +273,10 @@ class UrlParseTestCase(unittest.TestCase):          for invalid_url in [                  'http://::12.34.56.78]/',                  'http://[::1/foo/', +                'ftp://[::1/foo/bad]/bad',                  'http://[::1/foo/bad]/bad',                  'http://[::ffff:12.34.56.78']: -            self.assertRaises(ValueError, lambda : urllib.parse.urlparse(invalid_url).hostname) -            self.assertRaises(ValueError, lambda : urllib.parse.urlparse(invalid_url)) +            self.assertRaises(ValueError, urllib.parse.urlparse, invalid_url)      def test_urldefrag(self):          for url, defrag, frag in [ diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py index 4f48b258bb..3d541a7206 100644 --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -181,10 +181,9 @@ def urlsplit(url, scheme='', allow_fragments=True):              url = url[i+1:]              if url[:2] == '//':                  netloc, url = _splitnetloc(url, 2) -                if '[' in netloc : -                    if not ']' in netloc: raise ValueError("Invalid IPv6 URL") -                if ']' in netloc: -                    if not '[' in netloc: raise ValueError("Invalid IPv6 URL") +                if (('[' in netloc and ']' not in netloc) or +                        (']' in netloc and '[' not in netloc)): +                    raise ValueError("Invalid IPv6 URL")              if allow_fragments and '#' in url:                  url, fragment = url.split('#', 1)              if '?' in url: @@ -199,10 +198,9 @@ def urlsplit(url, scheme='', allow_fragments=True):              scheme, url = url[:i].lower(), url[i+1:]      if url[:2] == '//':          netloc, url = _splitnetloc(url, 2) -        if '[' in netloc: -            if not ']' in netloc: raise ValueError("Invalid IPv6 URL") -        if ']' in netloc: -            if not '[' in netloc: raise ValueError("Invalid IPv6 URL") +        if (('[' in netloc and ']' not in netloc) or +                (']' in netloc and '[' not in netloc)): +            raise ValueError("Invalid IPv6 URL")      if allow_fragments and scheme in uses_fragment and '#' in url:          url, fragment = url.split('#', 1)      if scheme in uses_query and '?' in url:  | 
