From 37cc16ce103bfd2f408f8adc48209a70fcc0d6a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abraa=CC=83o=20Alca=CC=82ntara?= Date: Tue, 9 Mar 2021 15:39:44 +0000 Subject: [PATCH 1/5] queue websocket disconnect if exc is None on connection lost --- uvicorn/protocols/websockets/wsproto_impl.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/uvicorn/protocols/websockets/wsproto_impl.py b/uvicorn/protocols/websockets/wsproto_impl.py index 627e32ef8..6e4f505f1 100644 --- a/uvicorn/protocols/websockets/wsproto_impl.py +++ b/uvicorn/protocols/websockets/wsproto_impl.py @@ -70,8 +70,7 @@ def connection_made(self, transport): self.logger.log(TRACE_LOG_LEVEL, "%sWebSocket connection made", prefix) def connection_lost(self, exc): - if exc is not None: - self.queue.put_nowait({"type": "websocket.disconnect"}) + self.queue.put_nowait({"type": "websocket.disconnect"}) self.connections.remove(self) if self.logger.level <= TRACE_LOG_LEVEL: From 27276ec97b844917d59edaa4ad4b42c19a0f7eec Mon Sep 17 00:00:00 2001 From: Marcelo Trylesinski Date: Sat, 29 Oct 2022 12:20:33 +0200 Subject: [PATCH 2/5] Add test for connection lost --- tests/protocols/test_websocket.py | 36 ++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/tests/protocols/test_websocket.py b/tests/protocols/test_websocket.py index 7b0619cae..a5fe93d5b 100644 --- a/tests/protocols/test_websocket.py +++ b/tests/protocols/test_websocket.py @@ -10,6 +10,7 @@ try: import websockets + import websockets.client import websockets.exceptions from websockets.extensions.permessage_deflate import ClientPerMessageDeflateFactory @@ -64,7 +65,6 @@ def app(scope): "connection": "upgrade", "sec-webSocket-version": "11", }, - timeout=5, ) if response.status_code == 426: # response.text == "" @@ -517,6 +517,40 @@ async def websocket_session(url): await websocket_session("ws://127.0.0.1:8000") +@pytest.mark.anyio +@pytest.mark.parametrize("ws_protocol_cls", WS_PROTOCOLS) +@pytest.mark.parametrize("http_protocol_cls", HTTP_PROTOCOLS) +async def test_client_connection_lost(ws_protocol_cls, http_protocol_cls): + got_disconnect_event = False + + async def app(scope, receive, send): + nonlocal got_disconnect_event + while True: + message = await receive() + if message["type"] == "websocket.connect": + print("accepted") + await send({"type": "websocket.accept"}) + elif message["type"] == "websocket.disconnect": + break + + got_disconnect_event = True + + config = Config( + app=app, + ws=ws_protocol_cls, + http=http_protocol_cls, + lifespan="off", + ws_ping_interval=0.0, + ) + async with run_server(config): + async with websockets.client.connect("ws://127.0.0.1:8000") as websocket: + websocket.transport.close() + await asyncio.sleep(0.1) + got_disconnect_event_before_shutdown = got_disconnect_event + + assert got_disconnect_event_before_shutdown is True + + @pytest.mark.anyio @pytest.mark.parametrize("ws_protocol_cls", WS_PROTOCOLS) @pytest.mark.parametrize("http_protocol_cls", HTTP_PROTOCOLS) From 8914d184cb700dd1af059852e735c8b687a12d54 Mon Sep 17 00:00:00 2001 From: Marcelo Trylesinski Date: Sat, 29 Oct 2022 12:20:54 +0200 Subject: [PATCH 3/5] Improve coverage --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index 8ec8fbbf6..683e6d64b 100644 --- a/setup.cfg +++ b/setup.cfg @@ -82,7 +82,7 @@ plugins = [coverage:report] precision = 2 -fail_under = 97.79 +fail_under = 97.85 show_missing = true skip_covered = true exclude_lines = From 4802f1e6f0b677b838c29d4ee641732891791303 Mon Sep 17 00:00:00 2001 From: Marcelo Trylesinski Date: Sat, 29 Oct 2022 12:24:56 +0200 Subject: [PATCH 4/5] Update setup.cfg --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index 683e6d64b..61fea1fda 100644 --- a/setup.cfg +++ b/setup.cfg @@ -82,7 +82,7 @@ plugins = [coverage:report] precision = 2 -fail_under = 97.85 +fail_under = 97.84 show_missing = true skip_covered = true exclude_lines = From 9e48de9a4cf0ecd616c5b3ab1aa6778d3b4d0073 Mon Sep 17 00:00:00 2001 From: Marcelo Trylesinski Date: Sat, 29 Oct 2022 12:46:39 +0200 Subject: [PATCH 5/5] Update setup.cfg --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index 61fea1fda..46f4e3b99 100644 --- a/setup.cfg +++ b/setup.cfg @@ -82,7 +82,7 @@ plugins = [coverage:report] precision = 2 -fail_under = 97.84 +fail_under = 97.82 show_missing = true skip_covered = true exclude_lines =