This commit is contained in:
@@ -498,6 +498,9 @@ def make_connection(scheme, location, use_proxy):
|
|||||||
# run a little heuristic to see if location is an url, and if so parse out the hostpart
|
# run a little heuristic to see if location is an url, and if so parse out the hostpart
|
||||||
if location.startswith('http'):
|
if location.startswith('http'):
|
||||||
_scheme, location, path, parameters, query, fragment = url_parser(location)
|
_scheme, location, path, parameters, query, fragment = url_parser(location)
|
||||||
|
|
||||||
|
if use_proxy and scheme == 'https':
|
||||||
|
scheme = 'http'
|
||||||
|
|
||||||
result = scheme_to_factory_map[scheme](location)
|
result = scheme_to_factory_map[scheme](location)
|
||||||
result.connect()
|
result.connect()
|
||||||
|
@@ -400,5 +400,69 @@ class TestHttpTime(tests.TestCase):
|
|||||||
self.assertEqual(ticks, self.secs_since_epoch)
|
self.assertEqual(ticks, self.secs_since_epoch)
|
||||||
|
|
||||||
|
|
||||||
|
class TestProxy(tests.TestCase):
|
||||||
|
def test_ssl_proxy(self):
|
||||||
|
def ssl_proxy(sock):
|
||||||
|
conn, addr = sock.accept()
|
||||||
|
fd = conn.makefile()
|
||||||
|
try:
|
||||||
|
line = request = fd.readline()
|
||||||
|
self.assertEqual(request, 'GET https://localhost:1234 HTTP/1.1\r\n')
|
||||||
|
while line.strip(): # eat request headers
|
||||||
|
line = fd.readline()
|
||||||
|
|
||||||
|
# we're not going to actually proxy to localhost:1234,
|
||||||
|
# we're just going to return a response on its behalf
|
||||||
|
fd.write("HTTP/1.0 200 OK\r\n\r\n")
|
||||||
|
finally:
|
||||||
|
fd.close()
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
server = api.tcp_listener(('0.0.0.0', 5505))
|
||||||
|
api.spawn(ssl_proxy, server)
|
||||||
|
import os
|
||||||
|
os.environ['ALL_PROXY'] = 'localhost:5505'
|
||||||
|
httpc.get('https://localhost:1234', ok=[200], use_proxy=True)
|
||||||
|
|
||||||
|
def test_ssl_proxy_redirects(self):
|
||||||
|
# make sure that if the proxy returns a redirect, that httpc
|
||||||
|
# successfully follows it (this was broken at one point)
|
||||||
|
def ssl_proxy(sock):
|
||||||
|
conn, addr = sock.accept()
|
||||||
|
fd = conn.makefile()
|
||||||
|
try:
|
||||||
|
line = request = fd.readline()
|
||||||
|
self.assertEqual(request, 'GET https://localhost:1234 HTTP/1.1\r\n')
|
||||||
|
while line.strip(): # eat request headers
|
||||||
|
line = fd.readline()
|
||||||
|
|
||||||
|
# we're not going to actually proxy to localhost:1234,
|
||||||
|
# we're just going to return a response on its behalf
|
||||||
|
fd.write("HTTP/1.0 302 Found\r\nLocation: https://localhost:1234/2\r\n\r\n")
|
||||||
|
finally:
|
||||||
|
fd.close()
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
# second request, for /2 target
|
||||||
|
conn, addr = sock.accept()
|
||||||
|
fd = conn.makefile()
|
||||||
|
try:
|
||||||
|
line = request = fd.readline()
|
||||||
|
self.assertEqual(request, 'GET https://localhost:1234/2 HTTP/1.1\r\n')
|
||||||
|
while line.strip(): # eat request headers
|
||||||
|
line = fd.readline()
|
||||||
|
fd.write("HTTP/1.0 200 OK\r\n\r\n")
|
||||||
|
finally:
|
||||||
|
fd.close()
|
||||||
|
conn.close()
|
||||||
|
sock.close()
|
||||||
|
|
||||||
|
server = api.tcp_listener(('0.0.0.0', 5505))
|
||||||
|
api.spawn(ssl_proxy, server)
|
||||||
|
import os
|
||||||
|
os.environ['ALL_PROXY'] = 'localhost:5505'
|
||||||
|
httpc.get('https://localhost:1234', use_proxy=True, max_retries=1)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
tests.main()
|
tests.main()
|
||||||
|
Reference in New Issue
Block a user