From f2135d7483662ebd7804956e6268542bae937b67 Mon Sep 17 00:00:00 2001 From: Arksine Date: Mon, 15 Feb 2021 11:26:54 -0500 Subject: [PATCH] websockets: improve closed websocket handling When a closed websocket is detected set a flag to prevent further status updates until the websocket is removed. Also make sure that the associated subscriptions are removed if a closed websocket is detected during a notification. Signed-off-by: Eric Callahan --- moonraker/websockets.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/moonraker/websockets.py b/moonraker/websockets.py index 2135633..c8df2ad 100644 --- a/moonraker/websockets.py +++ b/moonraker/websockets.py @@ -276,6 +276,7 @@ class WebsocketManager: ws.write_message(msg) except WebSocketClosedError: self.websockets.pop(ws.uid, None) + self.server.remove_subscription(ws) logging.info(f"Websocket Removed: {ws.uid}") except Exception: logging.exception( @@ -294,6 +295,7 @@ class WebSocket(WebSocketHandler): self.wsm = app.get_websocket_manager() self.rpc = self.wsm.rpc self.uid = id(self) + self.is_closed = False async def open(self): await self.wsm.add_websocket(self) @@ -311,7 +313,7 @@ class WebSocket(WebSocketHandler): logging.exception("Websocket Command Error") def send_status(self, status): - if not status: + if not status or self.is_closed: return try: self.write_message({ @@ -319,6 +321,7 @@ class WebSocket(WebSocketHandler): 'method': "notify_status_update", 'params': [status]}) except WebSocketClosedError: + self.is_closed = True logging.info( f"Websocket Closed During Status Update: {self.uid}") except Exception: