def test_close_code(ws_testdata): tctx, playbook, flow = ws_testdata assert (playbook << websocket.WebsocketStartHook(flow) >> reply() >> DataReceived(tctx.server, b"\x88\x02\x0f\xa0") << SendData( tctx.server, masked(b"\x88\x02\x0f\xa0")) << CloseConnection( tctx.server) << SendData(tctx.client, b"\x88\x02\x0f\xa0") << CloseConnection( tctx.client) << websocket.WebsocketEndHook(flow) >> reply()) assert flow.websocket.close_code == 4000
def test_close_disconnect(ws_testdata): tctx, playbook, flow = ws_testdata assert (playbook << websocket.WebsocketStartHook(flow) >> reply() >> ConnectionClosed(tctx.server) << CloseConnection(tctx.server) << SendData(tctx.client, b"\x88\x02\x03\xe8") << CloseConnection( tctx.client) << websocket.WebsocketEndHook(flow) >> reply() >> ConnectionClosed(tctx.client)) # The \x03\xe8 above is code 1000 (normal closure). # But 1006 (ABNORMAL_CLOSURE) is expected, because the connection was already closed. assert flow.websocket.close_code == 1006
def test_protocol_error(ws_testdata): tctx, playbook, flow = ws_testdata assert ( playbook << websocket.WebsocketStartHook(flow) >> reply() >> DataReceived(tctx.server, b"\x01\x03foo") >> DataReceived(tctx.server, b"\x02\x03bar") << SendData( tctx.server, masked( b"\x88/\x03\xeaexpected CONTINUATION, got <Opcode.BINARY: 2>")) << CloseConnection(tctx.server) << SendData( tctx.client, b"\x88/\x03\xeaexpected CONTINUATION, got <Opcode.BINARY: 2>") << CloseConnection( tctx.client) << websocket.WebsocketEndHook(flow) >> reply()) assert not flow.websocket.messages
def test_close_normal(ws_testdata): tctx, playbook, flow = ws_testdata masked_close = Placeholder(bytes) close = Placeholder(bytes) assert (playbook << websocket.WebsocketStartHook(flow) >> reply() >> DataReceived(tctx.client, masked_bytes(b"\x88\x00")) << SendData( tctx.server, masked_close) << CloseConnection(tctx.server) << SendData(tctx.client, close) << CloseConnection( tctx.client) << websocket.WebsocketEndHook(flow) >> reply()) # wsproto currently handles this inconsistently, see # https://github.com/python-hyper/wsproto/pull/153/files assert masked_close() == masked( b"\x88\x02\x03\xe8") or masked_close() == masked(b"\x88\x00") assert close() == b"\x88\x02\x03\xe8" or close() == b"\x88\x00" assert flow.websocket.close_code == 1005