Merged revisions 80101 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r80101 | senthil.kumaran | 2010-04-16 08:16:46 +0530 (Fri, 16 Apr 2010) | 3 lines

  Fix issue2987: RFC2732 support for urlparse (IPv6 addresses)
........
diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py
index 879873c..3a8fd60 100644
--- a/Lib/urllib/parse.py
+++ b/Lib/urllib/parse.py
@@ -70,22 +70,26 @@
 
     @property
     def hostname(self):
-        netloc = self.netloc
-        if "@" in netloc:
-            netloc = netloc.rsplit("@", 1)[1]
-        if ":" in netloc:
-            netloc = netloc.split(":", 1)[0]
-        return netloc.lower() or None
+        netloc = self.netloc.split('@')[-1]
+        if '[' in netloc and ']' in netloc:
+            return netloc.split(']')[0][1:].lower()
+        elif '[' in netloc or ']' in netloc:
+            raise ValueError("Invalid IPv6 hostname")
+        elif ':' in netloc:
+            return netloc.split(':')[0].lower()
+        elif netloc == '':
+            return None
+        else:
+            return netloc.lower()
 
     @property
     def port(self):
-        netloc = self.netloc
-        if "@" in netloc:
-            netloc = netloc.rsplit("@", 1)[1]
-        if ":" in netloc:
-            port = netloc.split(":", 1)[1]
+        netloc = self.netloc.split('@')[-1].split(']')[-1]
+        if ':' in netloc:
+            port = netloc.split(':')[1]
             return int(port, 10)
-        return None
+        else:
+            return None
 
 from collections import namedtuple
 
@@ -130,6 +134,10 @@
 
 def _splitnetloc(url, start=0):
     delim = len(url)   # position of end of domain part of url, default is end
+    if '[' in url:     # check for invalid IPv6 URL
+        if not ']' in url: raise ValueError("Invalid IPv6 URL")
+    elif ']' in url:
+        if not '[' in url: raise ValueError("Invalid IPv6 URL")
     for c in '/?#':    # look for delimiters; the order is NOT important
         wdelim = url.find(c, start)        # find first of this delim
         if wdelim >= 0:                    # if found