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

Commit

Permalink
Merge pull request #138 from fredthomsen/add_missing_http2_tests
Browse files Browse the repository at this point in the history
Start of http11 upgrade test
  • Loading branch information
Lukasa committed Jun 11, 2015
2 parents 3ed87b4 + b4000ca commit 765ee13
Show file tree
Hide file tree
Showing 3 changed files with 98 additions and 10 deletions.
28 changes: 18 additions & 10 deletions test/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,24 +39,29 @@ def __init__(self,
socket_handler,
host='localhost',
ready_event=None,
h2=True):
h2=True,
secure=True):
threading.Thread.__init__(self)

self.socket_handler = socket_handler
self.host = host
self.secure = secure
self.ready_event = ready_event

self.cxt = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
if ssl.HAS_NPN and h2:
self.cxt.set_npn_protocols([NPN_PROTOCOL])
self.cxt.load_cert_chain(certfile='test/certs/server.crt',
keyfile='test/certs/server.key')
if self.secure:
self.cxt = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
if ssl.HAS_NPN and h2:
self.cxt.set_npn_protocols([NPN_PROTOCOL])
self.cxt.load_cert_chain(certfile='test/certs/server.crt',
keyfile='test/certs/server.key')

def _start_server(self):
sock = socket.socket(socket.AF_INET6)
if sys.platform != 'win32':
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock = self.cxt.wrap_socket(sock, server_side=True)

if self.secure:
sock = self.cxt.wrap_socket(sock, server_side=True)
sock.bind((self.host, 0))
self.port = sock.getsockname()[1]

Expand All @@ -81,9 +86,10 @@ class SocketLevelTest(object):
A test-class that defines a few helper methods for running socket-level
tests.
"""
def set_up(self):
def set_up(self, secure=True):
self.host = None
self.port = None
self.secure = secure
self.server_thread = None

def _start_server(self, socket_handler):
Expand All @@ -95,17 +101,19 @@ def _start_server(self, socket_handler):
socket_handler=socket_handler,
ready_event=ready_event,
h2=self.h2,
secure=self.secure
)
self.server_thread.start()
ready_event.wait()
self.host = self.server_thread.host
self.port = self.server_thread.port
self.secure = self.server_thread.secure

def get_connection(self):
if self.h2:
return HTTP20Connection(self.host, self.port, secure=True)
return HTTP20Connection(self.host, self.port, self.secure)
else:
return HTTP11Connection(self.host, self.port, secure=True)
return HTTP11Connection(self.host, self.port, self.secure)

def get_encoder(self):
"""
Expand Down
41 changes: 41 additions & 0 deletions test/test_integration.py
Original file line number Diff line number Diff line change
Expand Up @@ -452,6 +452,47 @@ def socket_handler(listener):

self.tear_down()

def test_insecure_connection(self):
self.set_up(secure=False)

data = []
send_event = threading.Event()

def socket_handler(listener):
sock = listener.accept()[0]

receive_preamble(sock)

data.append(sock.recv(65535))
send_event.wait()

h = HeadersFrame(1)
h.data = self.get_encoder().encode({':status': 200, 'Content-Type': 'not/real', 'Content-Length': 14, 'Server': 'socket-level-server'})
h.flags.add('END_HEADERS')
sock.send(h.serialize())

d = DataFrame(1)
d.data = b'nsaislistening'
d.flags.add('END_STREAM')
sock.send(d.serialize())

sock.close()

self._start_server(socket_handler)
c = self.get_connection()
c.request('GET', '/')
send_event.set()
r = c.get_response()

assert r.status == 200
assert len(r.headers) == 3
assert r.headers[b'server'] == [b'socket-level-server']
assert r.headers[b'content-length'] == [b'14']
assert r.headers[b'content-type'] == [b'not/real']

assert r.read() == b'nsaislistening'

self.tear_down()

class TestRequestsAdapter(SocketLevelTest):
# This uses HTTP/2.
Expand Down
39 changes: 39 additions & 0 deletions test/test_integration_http11.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,11 @@
"""
import hyper
import threading
import pytest

from hyper.compat import ssl
from server import SocketLevelTest
from hyper.common.exceptions import HTTPUpgrade

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

assert c._sock is None

def test_upgrade_response(self):
self.set_up()
self.secure = False

send_event = threading.Event()

def socket_handler(listener):
sock = listener.accept()[0]

# We should get the initial request.
data = b''
while not data.endswith(b'\r\n\r\n'):
data += sock.recv(65535)

send_event.wait()

# We need to send back a response.
resp = (
b'HTTP/1.1 101 Upgrade\r\n'
b'Server: socket-level-server\r\n'
b'Content-Length: 0\r\n'
b'Connection: upgrade\r\n'
b'Upgrade: h2c\r\n'
b'\r\n'
)
sock.send(resp)

sock.close()

self._start_server(socket_handler)
c = self.get_connection()
c.request('GET', '/')
send_event.set()

with pytest.raises(HTTPUpgrade):
r = c.get_response()

0 comments on commit 765ee13

Please sign in to comment.