From eb29d0ac999f3220db9e29fdd531c7cc9514d64b Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Mon, 21 Oct 2019 21:51:31 +0200 Subject: [PATCH] protect websocket handling from any exceptions --- owrx/controllers.py | 2 +- owrx/websocket.py | 36 ++++++++++++++++++++---------------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/owrx/controllers.py b/owrx/controllers.py index 639b07d..3553240 100644 --- a/owrx/controllers.py +++ b/owrx/controllers.py @@ -152,4 +152,4 @@ class WebSocketController(Controller): def handle_request(self): conn = WebSocketConnection(self.handler, WebSocketMessageHandler()) # enter read loop - conn.read_loop() + conn.handle() diff --git a/owrx/websocket.py b/owrx/websocket.py index e780ab9..24ab02b 100644 --- a/owrx/websocket.py +++ b/owrx/websocket.py @@ -149,6 +149,26 @@ class WebSocketConnection(object): def interrupt(self): self.interruptPipeSend.send(bytes(0x00)) + def handle(self): + WebSocketConnection.connections.append(self) + try: + self.read_loop() + finally: + logger.debug("websocket loop ended; shutting down") + + self.messageHandler.handleClose() + self.cancelPing() + + logger.debug("websocket loop ended; sending close frame") + + header = self.get_header(0, OPCODE_CLOSE) + self._sendBytes(header) + + try: + WebSocketConnection.connections.remove(self) + except ValueError: + pass + def read_loop(self): def protected_read(num): data = self.handler.rfile.read(num) @@ -158,7 +178,6 @@ class WebSocketConnection(object): raise IncompleteRead() return data - WebSocketConnection.connections.append(self) self.open = True while self.open: (read, _, _) = select.select([self.interruptPipeRecv, self.handler.rfile], [], [], 15) @@ -203,21 +222,6 @@ class WebSocketConnection(object): logger.exception("OSError while reading data; closing connection") self.open = False - logger.debug("websocket loop ended; shutting down") - - self.messageHandler.handleClose() - self.cancelPing() - - logger.debug("websocket loop ended; sending close frame") - - header = self.get_header(0, OPCODE_CLOSE) - self._sendBytes(header) - - try: - WebSocketConnection.connections.remove(self) - except ValueError: - pass - def close(self): self.open = False self.interrupt()