From ced4eb06e4fe528c99b34f4167011f8908c933af Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Sat, 5 Jan 2008 01:21:57 +0000 Subject: [PATCH] Patch #1698 by Senthil: allow '@' in username when parsed by urlparse.py. --- Lib/test/test_urlparse.py | 18 ++++++++++++++++++ Lib/urlparse.py | 8 ++++---- Misc/NEWS | 2 ++ 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py index dcb89f763bd..0df4058dc27 100644 --- a/Lib/test/test_urlparse.py +++ b/Lib/test/test_urlparse.py @@ -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") diff --git a/Lib/urlparse.py b/Lib/urlparse.py index ad5d75f681d..4bf0af3d0c6 100644 --- a/Lib/urlparse.py +++ b/Lib/urlparse.py @@ -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) diff --git a/Misc/NEWS b/Misc/NEWS index 4aad515b1aa..c5b0e244198 100644 --- 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.