def _make_handshake( response_status: int, response_headers: Headers, subprotocols: Optional[List[str]] = None, extensions: Optional[List[Extension]] = None, auto_accept_key: bool = True, ) -> List[Event]: client = WSConnection(CLIENT) assert client.state is ConnectionState.CONNECTING server = h11.Connection(h11.SERVER) server.receive_data( client.send( Request( host="localhost", target="/", subprotocols=subprotocols or [], extensions=extensions or [], ))) request = server.next_event() if auto_accept_key: full_request_headers = normed_header_dict(request.headers) response_headers.append(( b"Sec-WebSocket-Accept", generate_accept_token(full_request_headers[b"sec-websocket-key"]), )) response = h11.InformationalResponse(status_code=response_status, headers=response_headers) client.receive_data(server.send(response)) assert client.state is not ConnectionState.CONNECTING return list(client.events())
def test_handshake_with_subprotocol(accept_subprotocol): response, _ = _make_handshake( [(b"Sec-Websocket-Protocol", b"one, two")], subprotocol=accept_subprotocol ) headers = normed_header_dict(response.headers) assert headers[b"sec-websocket-protocol"] == accept_subprotocol.encode("ascii")
def test_upgrade_request(): server = WSConnection(SERVER) server.initiate_upgrade_connection( [ (b"Host", b"localhost"), (b"Connection", b"Keep-Alive, Upgrade"), (b"Upgrade", b"WebSocket"), (b"Sec-WebSocket-Version", b"13"), (b"Sec-WebSocket-Key", generate_nonce()), (b"X-Foo", b"bar"), ], "/", ) event = next(server.events()) assert event.extensions == [] assert event.host == "localhost" assert event.subprotocols == [] assert event.target == "/" headers = normed_header_dict(event.extra_headers) assert b"host" not in headers assert b"sec-websocket-extensions" not in headers assert b"sec-websocket-protocol" not in headers assert headers[b"connection"] == b"Keep-Alive, Upgrade" assert headers[b"sec-websocket-version"] == b"13" assert headers[b"upgrade"] == b"WebSocket" assert headers[b"x-foo"] == b"bar"
def test_connection_request_subprotocols() -> None: request = _make_connection_request( Request(host="localhost", target="/", subprotocols=["one", "two"]) ) headers = normed_header_dict(request.headers) assert headers[b"sec-websocket-protocol"] == b"one, two"
def test_connection_request_simple_extension_no_offer(): extension = FakeExtension(offer_response=False) request = _make_connection_request( Request(host="localhost", target="/", extensions=[extension]) ) headers = normed_header_dict(request.headers) assert b"sec-websocket-extensions" not in headers
def test_connection_request_simple_extension(): extension = FakeExtension(offer_response=True) request = _make_connection_request( Request(host="localhost", target="/", extensions=[extension]) ) headers = normed_header_dict(request.headers) assert headers[b"sec-websocket-extensions"] == extension.name.encode("ascii")
def test_handshake_with_extension() -> None: extension = FakeExtension(accept_response=True) response, _ = _make_handshake( [(b"Sec-Websocket-Extensions", extension.name.encode("ascii"))], extensions=[extension], ) headers = normed_header_dict(response.headers) assert headers[b"sec-websocket-extensions"] == extension.name.encode("ascii")
def test_connection_request_parametrised_extension(): extension = FakeExtension(offer_response="parameter1=value1; parameter2=value2") request = _make_connection_request( Request(host="localhost", target="/", extensions=[extension]) ) headers = normed_header_dict(request.headers) assert headers[b"sec-websocket-extensions"] == b"%s; %s" % ( extension.name.encode("ascii"), extension.offer_response.encode("ascii"), )
def test_connection_request_additional_headers() -> None: request = _make_connection_request( Request( host="localhost", target="/", extra_headers=[(b"X-Foo", b"Bar"), (b"X-Bar", b"Foo")], )) headers = normed_header_dict(request.headers) assert headers[b"x-foo"] == b"Bar" assert headers[b"x-bar"] == b"Foo"
def test_connection_request(): request = _make_connection_request(Request(host="localhost", target="/")) assert request.http_version == b"1.1" assert request.method == b"GET" assert request.target == b"/" headers = normed_header_dict(request.headers) assert headers[b"connection"] == b"Upgrade" assert headers[b"host"] == b"localhost" assert headers[b"sec-websocket-version"] == b"13" assert headers[b"upgrade"] == b"WebSocket" assert b"sec-websocket-key" in headers
def test_handshake_with_extension_params() -> None: offered_params = "parameter1=value3; parameter2=value4" accepted_params = "parameter1=value1; parameter2=value2" extension = FakeExtension(accept_response=accepted_params) response, _ = _make_handshake( [( b"Sec-Websocket-Extensions", (f"{extension.name}; {offered_params}").encode("ascii"), )], extensions=[extension], ) headers = normed_header_dict(response.headers) assert extension.offered == f"{extension.name}; {offered_params}" assert headers[b"sec-websocket-extensions"] == ( f"{extension.name}; {accepted_params}").encode("ascii")
def test_connection_request() -> None: event = _make_connection_request([ (b"Host", b"localhost"), (b"Connection", b"Keep-Alive, Upgrade"), (b"Upgrade", b"WebSocket"), (b"Sec-WebSocket-Version", b"13"), (b"Sec-WebSocket-Key", generate_nonce()), (b"X-Foo", b"bar"), ]) assert event.extensions == [] assert event.host == "localhost" assert event.subprotocols == [] assert event.target == "/" headers = normed_header_dict(event.extra_headers) assert b"host" not in headers assert b"sec-websocket-extensions" not in headers assert b"sec-websocket-protocol" not in headers assert headers[b"connection"] == b"Keep-Alive, Upgrade" assert headers[b"sec-websocket-version"] == b"13" assert headers[b"upgrade"] == b"WebSocket" assert headers[b"x-foo"] == b"bar"