]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Patch #1698 by Senthil: allow '@' in username when parsed by urlparse.py.
authorGuido van Rossum <guido@python.org>
Sat, 5 Jan 2008 01:21:57 +0000 (01:21 +0000)
committerGuido van Rossum <guido@python.org>
Sat, 5 Jan 2008 01:21:57 +0000 (01:21 +0000)
Lib/test/test_urlparse.py
Lib/urlparse.py
Misc/NEWS

index dcb89f763bd3c5e3bf4c92d2ed7e415d3874c4b4..0df4058dc272eee36a0a7c9bc9f5299717682b58 100644 (file)
@@ -254,6 +254,24 @@ class UrlParseTestCase(unittest.TestCase):
         self.assertEqual(p.port, 80)
         self.assertEqual(p.geturl(), url)
 
+        # Addressing issue1698, which suggests Username can contain
+        # "@" character. Though not RFC complaint, many ftp sites allow
+        # and requests email ids as usernames.
+
+        url = "http://User@example.com:Pass@www.python.org:080/doc/?query=yes#frag"
+        p = urlparse.urlsplit(url)
+        self.assertEqual(p.scheme, "http")
+        self.assertEqual(p.netloc, "User@example.com:Pass@www.python.org:080")
+        self.assertEqual(p.path, "/doc/")
+        self.assertEqual(p.query, "query=yes")
+        self.assertEqual(p.fragment, "frag")
+        self.assertEqual(p.username, "User@example.com")
+        self.assertEqual(p.password, "Pass")
+        self.assertEqual(p.hostname, "www.python.org")
+        self.assertEqual(p.port, 80)
+        self.assertEqual(p.geturl(), url)
+
+
     def test_attributes_bad_port(self):
         """Check handling of non-integer ports."""
         p = urlparse.urlsplit("http://www.example.net:foo")
index ad5d75f681d93921ef9ab15dddb7e033045662b5..4bf0af3d0c6bd6ef26792b2e3b879169f48270eb 100644 (file)
@@ -82,7 +82,7 @@ class BaseResult(tuple):
     def username(self):
         netloc = self.netloc
         if "@" in netloc:
-            userinfo = netloc.split("@", 1)[0]
+            userinfo = netloc.rsplit("@", 1)[0]
             if ":" in userinfo:
                 userinfo = userinfo.split(":", 1)[0]
             return userinfo
@@ -92,7 +92,7 @@ class BaseResult(tuple):
     def password(self):
         netloc = self.netloc
         if "@" in netloc:
-            userinfo = netloc.split("@", 1)[0]
+            userinfo = netloc.rsplit("@", 1)[0]
             if ":" in userinfo:
                 return userinfo.split(":", 1)[1]
         return None
@@ -101,7 +101,7 @@ class BaseResult(tuple):
     def hostname(self):
         netloc = self.netloc
         if "@" in netloc:
-            netloc = netloc.split("@", 1)[1]
+            netloc = netloc.rsplit("@", 1)[1]
         if ":" in netloc:
             netloc = netloc.split(":", 1)[0]
         return netloc.lower() or None
@@ -110,7 +110,7 @@ class BaseResult(tuple):
     def port(self):
         netloc = self.netloc
         if "@" in netloc:
-            netloc = netloc.split("@", 1)[1]
+            netloc = netloc.rsplit("@", 1)[1]
         if ":" in netloc:
             port = netloc.split(":", 1)[1]
             return int(port, 10)
index 4aad515b1aa56b5f4ee6f004dbe6454efaab2717..c5b0e244198faf295f377302a8f7f4af2d48119b 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -342,6 +342,8 @@ Core and builtins
 Library
 -------
 
+- Patch #1698: allow '@' in username parsed by urlparse.py.
+
 - Issue #1735: TarFile.extractall() now correctly sets directory permissions
   and times.