-
-
Notifications
You must be signed in to change notification settings - Fork 2.3k
Expand file tree
/
Copy pathtest_proxy_session.py
More file actions
120 lines (88 loc) · 3.83 KB
/
test_proxy_session.py
File metadata and controls
120 lines (88 loc) · 3.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
from unittest import mock
import pytest
import aiohttp
from aiohttp import web
@pytest.fixture
def proxy_test_server(aiohttp_raw_server, loop, monkeypatch):
"""Handle all proxy requests and imitate remote server response."""
_patch_ssl_transport(monkeypatch)
default_response = {'status': 200, 'headers': None, 'body': None}
proxy_mock = mock.Mock()
async def proxy_handler(request):
proxy_mock.request = request
proxy_mock.requests_list.append(request)
response = default_response.copy()
if isinstance(proxy_mock.return_value, dict):
response.update(proxy_mock.return_value)
headers = response['headers']
if not headers:
headers = {}
if request.method == 'CONNECT':
response['body'] = None
response['headers'] = headers
resp = web.Response(**response)
await resp.prepare(request)
await resp.write_eof()
return resp
async def proxy_server():
proxy_mock.request = None
proxy_mock.auth = None
proxy_mock.requests_list = []
server = await aiohttp_raw_server(proxy_handler)
proxy_mock.server = server
proxy_mock.url = server.make_url('/')
return proxy_mock
return proxy_server
@pytest.fixture()
def get_request(loop):
async def _request(method='GET', *, url, trust_env=False, **kwargs):
connector = aiohttp.TCPConnector(verify_ssl=False, loop=loop)
client = aiohttp.ClientSession(connector=connector,
trust_env=trust_env)
try:
resp = await client.request(method, url, **kwargs)
await resp.release()
return resp
finally:
await client.close()
return _request
def _patch_ssl_transport(monkeypatch) -> None:
"""Make ssl transport substitution to prevent ssl handshake."""
def _make_ssl_transport_dummy(self, rawsock, protocol, sslcontext,
waiter=None, **kwargs):
return self._make_socket_transport(rawsock, protocol, waiter,
extra=kwargs.get('extra'),
server=kwargs.get('server'))
monkeypatch.setattr(
"asyncio.selector_events.BaseSelectorEventLoop._make_ssl_transport",
_make_ssl_transport_dummy)
async def test_session_proxy_http(proxy_test_server, loop) -> None:
url = 'http://aiohttp.io/path'
proxy = await proxy_test_server()
proxy.return_value = dict(body=b'test')
conn = aiohttp.TCPConnector(loop=loop)
sess = aiohttp.ClientSession(connector=conn, loop=loop, proxy=proxy.url)
resp = await sess.get(url)
assert (await resp.read()) == b'test'
async def test_session_proxy_http_auth(proxy_test_server, loop) -> None:
url = 'http://aiohttp.io/path'
proxy = await proxy_test_server()
conn = aiohttp.TCPConnector(loop=loop)
sess = aiohttp.ClientSession(connector=conn, loop=loop, proxy=proxy.url)
await sess.get(url)
assert 'Authorization' not in proxy.request.headers
assert 'Proxy-Authorization' not in proxy.request.headers
conn = aiohttp.TCPConnector(loop=loop)
auth = aiohttp.BasicAuth('user', 'pass')
sess = aiohttp.ClientSession(connector=conn, loop=loop,
proxy_auth=auth, proxy=proxy.url)
await sess.get(url)
assert 'Authorization' not in proxy.request.headers
assert 'Proxy-Authorization' in proxy.request.headers
conn = aiohttp.TCPConnector(loop=loop)
auth = aiohttp.BasicAuth('user', 'pass')
sess = aiohttp.ClientSession(connector=conn, loop=loop,
auth=auth, proxy_auth=auth, proxy=proxy.url)
await sess.get(url)
assert 'Authorization' in proxy.request.headers
assert 'Proxy-Authorization' in proxy.request.headers