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

Commit 4b261cd

Browse files
committed
Start of http11 upgrade test
1 parent 3ed87b4 commit 4b261cd

File tree

2 files changed

+53
-9
lines changed

2 files changed

+53
-9
lines changed

test/server.py

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,24 +39,29 @@ def __init__(self,
3939
socket_handler,
4040
host='localhost',
4141
ready_event=None,
42-
h2=True):
42+
h2=True,
43+
secure=True):
4344
threading.Thread.__init__(self)
4445

4546
self.socket_handler = socket_handler
4647
self.host = host
48+
self.secure = secure
4749
self.ready_event = ready_event
4850

49-
self.cxt = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
50-
if ssl.HAS_NPN and h2:
51-
self.cxt.set_npn_protocols([NPN_PROTOCOL])
52-
self.cxt.load_cert_chain(certfile='test/certs/server.crt',
53-
keyfile='test/certs/server.key')
51+
if self.secure:
52+
self.cxt = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
53+
if ssl.HAS_NPN and h2:
54+
self.cxt.set_npn_protocols([NPN_PROTOCOL])
55+
self.cxt.load_cert_chain(certfile='test/certs/server.crt',
56+
keyfile='test/certs/server.key')
5457

5558
def _start_server(self):
5659
sock = socket.socket(socket.AF_INET6)
5760
if sys.platform != 'win32':
5861
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
59-
sock = self.cxt.wrap_socket(sock, server_side=True)
62+
63+
if self.secure:
64+
sock = self.cxt.wrap_socket(sock, server_side=True)
6065
sock.bind((self.host, 0))
6166
self.port = sock.getsockname()[1]
6267

@@ -84,6 +89,7 @@ class SocketLevelTest(object):
8489
def set_up(self):
8590
self.host = None
8691
self.port = None
92+
self.secure = None
8793
self.server_thread = None
8894

8995
def _start_server(self, socket_handler):
@@ -95,17 +101,19 @@ def _start_server(self, socket_handler):
95101
socket_handler=socket_handler,
96102
ready_event=ready_event,
97103
h2=self.h2,
104+
secure=self.secure
98105
)
99106
self.server_thread.start()
100107
ready_event.wait()
101108
self.host = self.server_thread.host
102109
self.port = self.server_thread.port
110+
self.secure = self.server_thread.secure
103111

104112
def get_connection(self):
105113
if self.h2:
106-
return HTTP20Connection(self.host, self.port, secure=True)
114+
return HTTP20Connection(self.host, self.port, self.secure)
107115
else:
108-
return HTTP11Connection(self.host, self.port, secure=True)
116+
return HTTP11Connection(self.host, self.port, self.secure)
109117

110118
def get_encoder(self):
111119
"""

test/test_integration_http11.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,3 +214,39 @@ def socket_handler(listener):
214214
assert data == b'hellotherehello'
215215

216216
assert c._sock is None
217+
218+
def test_upgrade_response(self):
219+
self.set_up()
220+
221+
send_event = threading.Event()
222+
223+
def socket_handler(listener):
224+
sock = listener.accept()[0]
225+
226+
# We should get the initial request.
227+
data = b''
228+
while not data.endswith(b'\r\n\r\n'):
229+
data += sock.recv(65535)
230+
231+
send_event.wait()
232+
233+
# We need to send back a response.
234+
resp = (
235+
b'HTTP/1.1 101 Upgrade\r\n'
236+
b'Server: socket-level-server\r\n'
237+
b'Content-Length: 0\r\n'
238+
b'Connection: upgrade\r\n'
239+
b'Upgrade: h2c\r\n'
240+
b'\r\n'
241+
)
242+
sock.send(resp)
243+
244+
sock.close()
245+
246+
self._start_server(socket_handler)
247+
c = self.get_connection()
248+
c.request('GET', '/')
249+
send_event.set()
250+
251+
with pytest.raises(HTTPUpgrade):
252+
r = c.get_response()

0 commit comments

Comments
 (0)