summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2008-01-05 01:21:57 (GMT)
committerGuido van Rossum <guido@python.org>2008-01-05 01:21:57 (GMT)
commitced4eb06e4fe528c99b34f4167011f8908c933af (patch)
tree81df17697d1f748fc75bc0c081104a932bf70bae /Lib
parent3b83549ea0b0c3e8d1919925a8875052e13367cf (diff)
downloadcpython-ced4eb06e4fe528c99b34f4167011f8908c933af.zip
cpython-ced4eb06e4fe528c99b34f4167011f8908c933af.tar.gz
cpython-ced4eb06e4fe528c99b34f4167011f8908c933af.tar.bz2
Patch #1698 by Senthil: allow '@' in username when parsed by urlparse.py.
Diffstat (limited to 'Lib')
-rw-r--r--Lib/test/test_urlparse.py18
-rw-r--r--Lib/urlparse.py8
2 files changed, 22 insertions, 4 deletions
diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py
index dcb89f7..0df4058 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 ad5d75f..4bf0af3 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)