diff -r 56e9d025078d Lib/test/test_urllib.py --- a/Lib/test/test_urllib.py Sat Jan 07 18:32:06 2012 +0100 +++ b/Lib/test/test_urllib.py Tue Jan 10 11:01:39 2012 +0100 @@ -1,9 +1,10 @@ """Regresssion tests for urllib""" +from test import test_support +from base64 import b64encode import urllib import httplib import unittest -from test import test_support import os import sys import mimetools @@ -22,8 +23,8 @@ def fakehttp(self, fakedata): class FakeSocket(StringIO.StringIO): - def sendall(self, str): - pass + def sendall(self, data): + FakeHTTPConnection.buf += data def makefile(self, *args, **kwds): return self @@ -38,6 +39,8 @@ return StringIO.StringIO.readline(self, length) class FakeHTTPConnection(httplib.HTTPConnection): + buf = "" + def connect(self): self.sock = FakeSocket(fakedata) assert httplib.HTTP._connection_class == httplib.HTTPConnection @@ -209,6 +212,41 @@ finally: self.unfakehttp() + def test_userpass_inurl(self): + self.fakehttp('Hello!') + try: + fakehttp_wrapper = httplib.HTTP._connection_class + fp = urllib.urlopen("http://user:pass@python.org/") + authorization = ("Authorization: Basic %s\r\n" % + b64encode('user:pass')) + # The authorization header must be in place + self.assertIn(authorization, fakehttp_wrapper.buf) + self.assertEqual(fp.readline(), "Hello!") + self.assertEqual(fp.readline(), "") + self.assertEqual(fp.geturl(), 'http://user:pass@python.org/') + self.assertEqual(fp.getcode(), 200) + finally: + self.unfakehttp() + + def test_userpass_w_spaces_inurl(self): + self.fakehttp('Hello!') + try: + url = "http://a b:c d@python.org/" + fakehttp_wrapper = httplib.HTTP._connection_class + authorization = ("Authorization: Basic %s\r\n" % + b64encode('a b:c d')) + fp = urllib.urlopen(url) + # The authorization header must be in place + self.assertIn(authorization, fakehttp_wrapper.buf) + self.assertEqual(fp.readline(), "Hello!") + self.assertEqual(fp.readline(), "") + # the spaces are quoted in URL so no match + #self.assertEqual(fp.geturl(), url) + self.assertEqual(fp.getcode(), 200) + finally: + self.unfakehttp() + + class urlretrieve_FileTests(unittest.TestCase): """Test urllib.urlretrieve() on local files""" @@ -716,6 +754,9 @@ self.assertEqual(('user', 'a\fb'),urllib.splitpasswd('user:a\fb')) self.assertEqual(('user', 'a\vb'),urllib.splitpasswd('user:a\vb')) self.assertEqual(('user', 'a:b'),urllib.splitpasswd('user:a:b')) + self.assertEqual(('user', 'a b'),urllib.splitpasswd('user:a b')) + self.assertEqual(('user 2', 'ab'),urllib.splitpasswd('user 2:ab')) + self.assertEqual(('user+1', 'a+b'),urllib.splitpasswd('user+1:a+b')) class URLopener_Tests(unittest.TestCase): diff -r 56e9d025078d Lib/urllib.py --- a/Lib/urllib.py Sat Jan 07 18:32:06 2012 +0100 +++ b/Lib/urllib.py Tue Jan 10 11:01:39 2012 +0100 @@ -294,6 +294,8 @@ if host: user_passwd, host = splituser(host) host = unquote(host) + if user_passwd: + user_passwd = unquote(user_passwd) realhost = host else: host, selector = url