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

Commit 765ee13

Browse files
committed
Merge pull request #138 from fredthomsen/add_missing_http2_tests
Start of http11 upgrade test
2 parents 3ed87b4 + b4000ca commit 765ee13

File tree

3 files changed

+98
-10
lines changed

3 files changed

+98
-10
lines changed

test/server.py

Lines changed: 18 additions & 10 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

@@ -81,9 +86,10 @@ class SocketLevelTest(object):
8186
A test-class that defines a few helper methods for running socket-level
8287
tests.
8388
"""
84-
def set_up(self):
89+
def set_up(self, secure=True):
8590
self.host = None
8691
self.port = None
92+
self.secure = secure
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.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,47 @@ def socket_handler(listener):
452452

453453
self.tear_down()
454454

455+
def test_insecure_connection(self):
456+
self.set_up(secure=False)
457+
458+
data = []
459+
send_event = threading.Event()
460+
461+
def socket_handler(listener):
462+
sock = listener.accept()[0]
463+
464+
receive_preamble(sock)
465+
466+
data.append(sock.recv(65535))
467+
send_event.wait()
468+
469+
h = HeadersFrame(1)
470+
h.data = self.get_encoder().encode({':status': 200, 'Content-Type': 'not/real', 'Content-Length': 14, 'Server': 'socket-level-server'})
471+
h.flags.add('END_HEADERS')
472+
sock.send(h.serialize())
473+
474+
d = DataFrame(1)
475+
d.data = b'nsaislistening'
476+
d.flags.add('END_STREAM')
477+
sock.send(d.serialize())
478+
479+
sock.close()
480+
481+
self._start_server(socket_handler)
482+
c = self.get_connection()
483+
c.request('GET', '/')
484+
send_event.set()
485+
r = c.get_response()
486+
487+
assert r.status == 200
488+
assert len(r.headers) == 3
489+
assert r.headers[b'server'] == [b'socket-level-server']
490+
assert r.headers[b'content-length'] == [b'14']
491+
assert r.headers[b'content-type'] == [b'not/real']
492+
493+
assert r.read() == b'nsaislistening'
494+
495+
self.tear_down()
455496

456497
class TestRequestsAdapter(SocketLevelTest):
457498
# This uses HTTP/2.

test/test_integration_http11.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@
88
"""
99
import hyper
1010
import threading
11+
import pytest
1112

1213
from hyper.compat import ssl
1314
from server import SocketLevelTest
15+
from hyper.common.exceptions import HTTPUpgrade
1416

1517
# Turn off certificate verification for the tests.
1618
if ssl is not None:
@@ -214,3 +216,40 @@ def socket_handler(listener):
214216
assert data == b'hellotherehello'
215217

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

0 commit comments

Comments
 (0)