22
22
# XXX Name hacking to get this to work on Windows.
23
23
fname = os.path.abspath(urllib2.__file__).replace('\\', '/')
26
25
# And more hacking to get it to work on MacOS. This assumes
27
26
# urllib.pathname2url works, unfortunately...
28
27
if os.name == 'mac':
32
31
fname = os.expand(fname)
33
32
fname = fname.translate(string.maketrans("/.", "./"))
35
file_url = "file://%s" % fname
35
file_url = "file:///%s" % fname
37
file_url = "file://%s" % fname
36
39
f = urllib2.urlopen(file_url)
261
264
def __call__(self, *args):
262
265
return self.handle(self.meth_name, self.action, *args)
267
class MockHTTPResponse:
268
def __init__(self, fp, msg, status, reason):
278
self.req_headers = []
280
self.raise_on_endheaders = False
281
self._tunnel_headers = {}
283
def __call__(self, host, timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
285
self.timeout = timeout
288
def set_debuglevel(self, level):
291
def _set_tunnel(self, host, port=None, headers=None):
292
self._tunnel_host = host
293
self._tunnel_port = port
295
self._tunnel_headers = headers
297
self._tunnel_headers.clear()
298
def request(self, method, url, body=None, headers=None):
301
if headers is not None:
302
self.req_headers += headers.items()
303
self.req_headers.sort()
306
if self.raise_on_endheaders:
309
def getresponse(self):
310
return MockHTTPResponse(MockFile(), {}, 200, "OK")
264
312
class MockHandler:
265
313
# useful for testing handler machinery
266
314
# see add_ordered_mock_handlers() docstring
368
416
msg = mimetools.Message(StringIO("\r\n\r\n"))
369
417
return MockResponse(200, "OK", msg, "", req.get_full_url())
419
class MockHTTPSHandler(urllib2.AbstractHTTPHandler):
420
# Useful for testing the Proxy-Authorization request by verifying the
421
# properties of httpcon
424
urllib2.AbstractHTTPHandler.__init__(self)
425
self.httpconn = MockHTTPClass()
427
def https_open(self, req):
428
return self.do_open(self.httpconn, req)
371
430
class MockPasswordManager:
372
431
def add_password(self, realm, uri, user, password):
373
432
self.realm = realm
680
739
self.assertEqual(req.type, "ftp")
682
741
def test_http(self):
683
class MockHTTPResponse:
684
def __init__(self, fp, msg, status, reason):
693
self.req_headers = []
695
self.raise_on_endheaders = False
696
def __call__(self, host, timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
698
self.timeout = timeout
700
def set_debuglevel(self, level):
702
def request(self, method, url, body=None, headers={}):
705
self.req_headers += headers.items()
706
self.req_headers.sort()
709
if self.raise_on_endheaders:
712
def getresponse(self):
713
return MockHTTPResponse(MockFile(), {}, 200, "OK")
715
743
h = urllib2.AbstractHTTPHandler()
716
744
o = h.parent = MockOpener()
974
1002
self.assertEqual([(handlers[0], "https_open")],
975
1003
[tup[0:2] for tup in o.calls])
1005
def test_proxy_https_proxy_authorization(self):
1006
o = OpenerDirector()
1007
ph = urllib2.ProxyHandler(dict(https='proxy.example.com:3128'))
1009
https_handler = MockHTTPSHandler()
1010
o.add_handler(https_handler)
1011
req = Request("https://www.example.com/")
1012
req.add_header("Proxy-Authorization","FooBar")
1013
req.add_header("User-Agent","Grail")
1014
self.assertEqual(req.get_host(), "www.example.com")
1015
self.assertTrue(req._tunnel_host is None)
1017
# Verify Proxy-Authorization gets tunneled to request.
1018
# httpsconn req_headers do not have the Proxy-Authorization header but
1019
# the req will have.
1020
self.assertFalse(("Proxy-Authorization","FooBar") in
1021
https_handler.httpconn.req_headers)
1022
self.assertTrue(("User-Agent","Grail") in
1023
https_handler.httpconn.req_headers)
1024
self.assertFalse(req._tunnel_host is None)
1025
self.assertEqual(req.get_host(), "proxy.example.com:3128")
1026
self.assertEqual(req.get_header("Proxy-authorization"),"FooBar")
977
1028
def test_basic_auth(self, quote_char='"'):
978
1029
opener = OpenerDirector()
979
1030
password_manager = MockPasswordManager()
1083
1134
auth_hdr_value = 'Basic '+base64.encodestring(userpass).strip()
1084
1135
self.assertEqual(http_handler.requests[1].get_header(auth_header),
1085
1136
auth_hdr_value)
1137
self.assertEqual(http_handler.requests[1].unredirected_hdrs[auth_header],
1087
1139
# if the password manager can't find a password, the handler won't
1088
1140
# handle the HTTP auth error
1089
1141
password_manager.user = password_manager.password = None