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

Commit c2ff27c

Browse files
committed
Update overly complicated proxy integration test cases with simple ones
1 parent a2af966 commit c2ff27c

File tree

3 files changed

+88
-111
lines changed

3 files changed

+88
-111
lines changed

test/server.py

Lines changed: 11 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -81,53 +81,6 @@ 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.proxy_port = None
102-
self.secure = secure
103-
self.daemon = True
104-
105-
assert not self.secure, "HTTPS Proxies not supported"
106-
107-
def _start_proxy(self):
108-
tx_sock = socket.socket(socket.AF_INET6)
109-
rx_sock = socket.socket(socket.AF_INET6)
110-
111-
if sys.platform != 'win32':
112-
for sock in [tx_sock, rx_sock]:
113-
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
114-
115-
rx_sock.bind((self.proxy_host, 0))
116-
self.proxy_port = rx_sock.getsockname()[1]
117-
118-
# Once listen() returns, the server socket is ready
119-
rx_sock.listen(1)
120-
tx_sock.connect((self.host, self.port))
121-
122-
self.socket_handler(tx_sock, rx_sock)
123-
sock.close()
124-
125-
def _wrap_socket(self, sock):
126-
raise NotImplementedError()
127-
128-
def run(self):
129-
self.proxy_server = self._start_proxy()
130-
13184

13285
class SocketLevelTest(object):
13386
"""
@@ -137,15 +90,9 @@ class SocketLevelTest(object):
13790
def set_up(self, secure=True, proxy=False):
13891
self.host = None
13992
self.port = None
140-
141-
self.proxy = proxy
142-
self.proxy_host = None
143-
self.proxy_port = None
144-
14593
self.secure = secure if not proxy else False
146-
94+
self.proxy = proxy
14795
self.server_thread = None
148-
self.proxy_thread = None
14996

15097
def _start_server(self, socket_handler):
15198
"""
@@ -160,38 +107,23 @@ def _start_server(self, socket_handler):
160107
)
161108
self.server_thread.start()
162109
ready_event.wait()
110+
163111
self.host = self.server_thread.host
164112
self.port = self.server_thread.port
165113
self.secure = self.server_thread.secure
166114

167-
if self.proxy:
168-
self._start_proxy()
169-
170-
self.proxy_host = self.proxy_thread.proxy_host
171-
self.proxy_port = self.proxy_thread.proxy_port
172-
self.secure = self.proxy_thread.secure
173-
174-
def _start_proxy(self):
175-
"""
176-
Starts a background thread that runs the given socket handler.
177-
"""
178-
def _proxy_socket_handler(tx_sock, rx_sock):
179-
rx_sock_add = rx_sock.accept()[0]
180-
tx_sock.send(rx_sock_add.recv(65535))
181-
rx_sock_add.close()
182-
183-
self.proxy_thread = SocketProxyThread(
184-
socket_handler=_proxy_socket_handler,
185-
host=self.host,
186-
port=self.port
187-
)
188-
self.proxy_thread.start()
189-
190115
def get_connection(self):
191116
if self.h2:
192-
return HTTP20Connection(self.host, self.port, self.secure, proxy_host=self.proxy_host, proxy_port=self.proxy_port)
117+
if not self.proxy:
118+
return HTTP20Connection(self.host, self.port, self.secure)
119+
else:
120+
return HTTP20Connection('http2bin.org', secure=self.secure, proxy_host=self.host, proxy_port=self.port)
193121
else:
194-
return HTTP11Connection(self.host, self.port, self.secure, proxy_host=self.proxy_host, proxy_port=self.proxy_port)
122+
if not self.proxy:
123+
return HTTP11Connection(self.host, self.port, self.secure)
124+
else:
125+
return HTTP11Connection('httpbin.org', secure=self.secure, proxy_host=self.host, proxy_port=self.port)
126+
195127

196128
def get_encoder(self):
197129
"""
@@ -206,6 +138,3 @@ def tear_down(self):
206138
Tears down the testing thread.
207139
"""
208140
self.server_thread.join(0.1)
209-
210-
if self.proxy:
211-
self.proxy_thread.join(0.1)

test/test_integration.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,54 @@ def socket_handler(listener):
506506

507507
self.tear_down()
508508

509+
def test_proxy_connection(self):
510+
self.set_up(proxy=True)
511+
512+
data = []
513+
send_event = threading.Event()
514+
515+
def socket_handler(listener):
516+
sock = listener.accept()[0]
517+
518+
receive_preamble(sock)
519+
520+
data.append(sock.recv(65535))
521+
send_event.wait()
522+
523+
h = HeadersFrame(1)
524+
h.data = self.get_encoder().encode(
525+
{':status': 200,
526+
'Content-Type': 'not/real',
527+
'Content-Length': 14,
528+
'Server': 'socket-level-server'}
529+
)
530+
h.flags.add('END_HEADERS')
531+
sock.send(h.serialize())
532+
533+
d = DataFrame(1)
534+
d.data = b'thisisaproxy'
535+
d.flags.add('END_STREAM')
536+
sock.send(d.serialize())
537+
538+
sock.close()
539+
540+
self._start_server(socket_handler)
541+
c = self.get_connection()
542+
c.request('GET', '/')
543+
send_event.set()
544+
r = c.get_response()
545+
546+
assert r.status == 200
547+
assert len(r.headers) == 3
548+
assert r.headers[b'server'] == [b'socket-level-server']
549+
assert r.headers[b'content-length'] == [b'12']
550+
assert r.headers[b'content-type'] == [b'not/real']
551+
552+
assert r.read() == b'thisisaproxy'
553+
554+
self.tear_down()
555+
556+
509557
def test_resetting_stream_with_frames_in_flight(self):
510558
"""
511559
Hyper emits only one RST_STREAM frame, despite the other frames in

test/test_integration_http11.py

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ def socket_handler(listener):
6969

7070
assert c._sock is None
7171

72-
def test_proxy(self):
73-
self.set_up(secure=False, proxy=True)
72+
def test_closing_response(self):
73+
self.set_up()
7474

7575
send_event = threading.Event()
7676

@@ -86,14 +86,23 @@ def socket_handler(listener):
8686

8787
# We need to send back a response.
8888
resp = (
89-
b'HTTP/1.1 201 No Content\r\n'
89+
b'HTTP/1.1 200 OK\r\n'
9090
b'Server: socket-level-server\r\n'
91-
b'Content-Length: 0\r\n'
9291
b'Connection: close\r\n'
9392
b'\r\n'
9493
)
9594
sock.send(resp)
9695

96+
chunks = [
97+
b'hello',
98+
b'there',
99+
b'sir',
100+
b'finalfantasy',
101+
]
102+
103+
for chunk in chunks:
104+
sock.send(chunk)
105+
97106
sock.close()
98107

99108
self._start_server(socket_handler)
@@ -102,20 +111,16 @@ def socket_handler(listener):
102111
send_event.set()
103112
r = c.get_response()
104113

105-
assert r.status == 201
106-
assert r.reason == b'No Content'
107-
assert len(r.headers) == 3
114+
assert r.status == 200
115+
assert r.reason == b'OK'
116+
assert len(r.headers) == 2
108117
assert r.headers[b'server'] == [b'socket-level-server']
109-
assert r.headers[b'content-length'] == [b'0']
110118
assert r.headers[b'connection'] == [b'close']
111119

112-
assert r.read() == b''
120+
assert r.read() == b'hellotheresirfinalfantasy'
113121

114-
assert c._sock is None
115-
116-
117-
def test_closing_response(self):
118-
self.set_up()
122+
def test_proxy_request_response(self):
123+
self.set_up(proxy=True)
119124

120125
send_event = threading.Event()
121126

@@ -131,23 +136,14 @@ def socket_handler(listener):
131136

132137
# We need to send back a response.
133138
resp = (
134-
b'HTTP/1.1 200 OK\r\n'
139+
b'HTTP/1.1 201 No Content\r\n'
135140
b'Server: socket-level-server\r\n'
141+
b'Content-Length: 0\r\n'
136142
b'Connection: close\r\n'
137143
b'\r\n'
138144
)
139145
sock.send(resp)
140146

141-
chunks = [
142-
b'hello',
143-
b'there',
144-
b'sir',
145-
b'finalfantasy',
146-
]
147-
148-
for chunk in chunks:
149-
sock.send(chunk)
150-
151147
sock.close()
152148

153149
self._start_server(socket_handler)
@@ -156,13 +152,17 @@ def socket_handler(listener):
156152
send_event.set()
157153
r = c.get_response()
158154

159-
assert r.status == 200
160-
assert r.reason == b'OK'
161-
assert len(r.headers) == 2
155+
assert r.status == 201
156+
assert r.reason == b'No Content'
157+
assert len(r.headers) == 3
162158
assert r.headers[b'server'] == [b'socket-level-server']
159+
assert r.headers[b'content-length'] == [b'0']
163160
assert r.headers[b'connection'] == [b'close']
164161

165-
assert r.read() == b'hellotheresirfinalfantasy'
162+
assert r.read() == b''
163+
164+
assert c._sock is None
165+
166166

167167
def test_response_with_body(self):
168168
self.set_up()

0 commit comments

Comments
 (0)