From 378e4b69a6ca819a5361f5e5f4305fd7c2e576ba Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Wed, 22 Jul 2020 10:06:58 +0200 Subject: [PATCH] An attempt at better connection error-handling --- syndicate/mini/core.py | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/syndicate/mini/core.py b/syndicate/mini/core.py index 5ba49ce..c897b78 100644 --- a/syndicate/mini/core.py +++ b/syndicate/mini/core.py @@ -549,6 +549,10 @@ class WebsocketConnection(Connection): self.loop.create_task(self.ws.close()) self.loop.call_soon_threadsafe(_do_disconnect) + def __connection_error(self, e): + log.error('%s: Could not connect to server: %s' % (self.__class__.__qualname__, e)) + return False + async def main(self, loop, on_connected=None): if self.ws is not None: raise Exception('Cannot run connection twice!') @@ -556,19 +560,20 @@ class WebsocketConnection(Connection): self.loop = loop try: - async with websockets.connect(self.url) as ws: - if on_connected: await on_connected() - self.ws = ws - self._on_connected() - try: - while True: - chunk = await ws.recv() - self._on_event(protocol.Decoder(chunk).next()) - except websockets.exceptions.ConnectionClosed: - pass + self.ws = await websockets.connect(self.url) except OSError as e: - log.error('%s: Could not connect to server: %s' % (self.__class__.__qualname__, e)) - return False + return self.__connection_error(e) + except websockets.exceptions.InvalidHandshake as e: + return self.__connection_error(e) + + try: + if on_connected: await on_connected() + self._on_connected() + while True: + chunk = await self.ws.recv() + self._on_event(protocol.Decoder(chunk).next()) + except websockets.exceptions.WebSocketException: + pass finally: self._on_disconnected()