Skip to content
This repository was archived by the owner on Jan 13, 2021. It is now read-only.

Commit ecb7b57

Browse files
committed
Add proxy support to test server
1 parent 5f905e5 commit ecb7b57

File tree

1 file changed

+68
-2
lines changed

1 file changed

+68
-2
lines changed

test/server.py

Lines changed: 68 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,17 +81,65 @@ def _wrap_socket(self, sock):
8181
def run(self):
8282
self.server = self._start_server()
8383

84+
class SocketProxyThread(threading.Thread):
85+
"""
86+
:param ready_event: Event which gets set when the socket handler is
87+
ready to receive requests.
88+
"""
89+
def __init__(self,
90+
socket_handler,
91+
proxy_host='localhost',
92+
host='localhost',
93+
port=80,
94+
secure=False):
95+
threading.Thread.__init__(self)
96+
97+
self.socket_handler = socket_handler
98+
self.host = host
99+
self.port = port
100+
self.proxy_host = proxy_host
101+
self.daemon = True
102+
103+
assert not self.secure, "HTTPS Proxies not supported"
104+
105+
def _start_proxy(self):
106+
tx_sock = socket.socket(socket.AF_INET6)
107+
rx_sock = socket.socket(socket.AF_INET6)
108+
109+
if sys.platform != 'win32':
110+
for sock in [tx_sock, rx_sock]:
111+
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
112+
113+
sock_rx.bind((self.proxy_host, 0))
114+
self.proxy_port = sock_rx.getsockname()[1]
115+
116+
# Once listen() returns, the server socket is ready
117+
rx_sock.listen(1)
118+
tx_sock.connect((host, port))
119+
120+
self.socket_handler(tx_sock, rx_sock)
121+
sock.close()
122+
123+
def _wrap_socket(self, sock):
124+
raise NotImplementedError()
125+
126+
def run(self):
127+
self.proxy = self._start_proxy()
128+
84129

85130
class SocketLevelTest(object):
86131
"""
87132
A test-class that defines a few helper methods for running socket-level
88133
tests.
89134
"""
90-
def set_up(self, secure=True):
135+
def set_up(self, secure=True, proxy=False):
91136
self.host = None
92137
self.port = None
93-
self.secure = secure
138+
self.proxy = proxy
139+
self.secure = secure if not proxy else False
140+
94141
self.server_thread = None
142+
self.proxy_thread = None
95143

96144
def _start_server(self, socket_handler):
97145
"""
@@ -110,6 +158,24 @@ def _start_server(self, socket_handler):
110158
self.port = self.server_thread.port
111159
self.secure = self.server_thread.secure
112160

161+
if proxy:
162+
self._start_proxy()
163+
self.proxy_host = self.proxy_thread.proxy_host
164+
165+
def _start_proxy(self):
166+
"""
167+
Starts a background thread that runs the given socket handler.
168+
"""
169+
def _proxy_socket_handler(tx_sock, rx_sock):
170+
rx_sock_add = rx_sock.accept()[0]
171+
tx_sock.send(rx_sock_add.recv(65535))
172+
rx_sock_add = sock.close()
173+
174+
self.proxy_thread = SocketProxyThread(
175+
socket_handler=_proxy_socket_handler
176+
)
177+
self.proxy_thread.start()
178+
113179
def get_connection(self):
114180
if self.h2:
115181
return HTTP20Connection(self.host, self.port, self.secure)

0 commit comments

Comments
 (0)