コード例 #1
0
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())
コード例 #2
0
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")
コード例 #3
0
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"
コード例 #4
0
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"
コード例 #5
0
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
コード例 #6
0
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")
コード例 #7
0
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")
コード例 #8
0
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"),
    )
コード例 #9
0
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"
コード例 #10
0
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
コード例 #11
0
ファイル: test_server.py プロジェクト: repo-forker/wsproto
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")
コード例 #12
0
ファイル: test_server.py プロジェクト: repo-forker/wsproto
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"