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

Commit 9b5b34f

Browse files
committed
Add test for plaintext upgrade.
1 parent 23d1c29 commit 9b5b34f

File tree

1 file changed

+76
-0
lines changed

1 file changed

+76
-0
lines changed

test/test_integration.py

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -859,6 +859,82 @@ def socket_handler(listener):
859859

860860
self.tear_down()
861861

862+
def test_upgrade(self):
863+
self.set_up(secure=False)
864+
865+
recv_event = threading.Event()
866+
wait_event = threading.Event()
867+
868+
def socket_handler(listener):
869+
sock = listener.accept()[0]
870+
871+
# First read the HTTP/1.1 request
872+
data = b''
873+
while not data.endswith(b'\r\n\r\n'):
874+
data += sock.recv(65535)
875+
876+
# Check it's an upgrade.
877+
assert b'upgrade: h2c\r\n' in data
878+
879+
# Send back an upgrade message.
880+
data = (
881+
b'HTTP/1.1 101 Switching Protocols\r\n'
882+
b'Server: some-server\r\n'
883+
b'Connection: upgrade\r\n'
884+
b'Upgrade: h2c\r\n'
885+
b'\r\n'
886+
)
887+
sock.sendall(data)
888+
889+
# We get a message for connection open, specifically the preamble.
890+
receive_preamble(sock)
891+
892+
# Now, send the headers for the response. This response has a body.
893+
f = build_headers_frame([(':status', '200')])
894+
f.stream_id = 1
895+
sock.sendall(f.serialize())
896+
897+
# Send the first two chunks.
898+
f = DataFrame(1)
899+
f.data = b'hello'
900+
sock.sendall(f.serialize())
901+
f = DataFrame(1)
902+
f.data = b'there'
903+
sock.sendall(f.serialize())
904+
905+
# Now, delay a bit. We want to wait a half a second before we send
906+
# the next frame.
907+
wait_event.wait(5)
908+
time.sleep(0.5)
909+
f = DataFrame(1)
910+
f.data = b'world'
911+
f.flags.add('END_STREAM')
912+
sock.sendall(f.serialize())
913+
914+
# Wait for the message from the main thread.
915+
recv_event.set()
916+
sock.close()
917+
918+
self._start_server(socket_handler)
919+
conn = hyper.HTTPConnection(self.host, self.port, self.secure)
920+
conn.request('GET', '/')
921+
resp = conn.get_response()
922+
923+
# Confirm the status code.
924+
assert resp.status == 200
925+
926+
first_chunk = resp.read(10)
927+
wait_event.set()
928+
second_chunk = resp.read(5)
929+
930+
assert first_chunk == b'hellothere'
931+
assert second_chunk == b'world'
932+
933+
# Awesome, we're done now.
934+
recv_event.wait(5)
935+
936+
self.tear_down()
937+
862938

863939
class TestRequestsAdapter(SocketLevelTest):
864940
# This uses HTTP/2.

0 commit comments

Comments
 (0)