From 492d7990e21eb3f80a7af1d6230ff1755993e6d0 Mon Sep 17 00:00:00 2001 From: Pierre Fersing Date: Sun, 7 Jan 2024 21:09:21 +0100 Subject: [PATCH] Correctly mark connection as broken on SSL error and don't crash loop_forever --- ChangeLog.txt | 2 ++ src/paho/mqtt/client.py | 22 +++++++++++----------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/ChangeLog.txt b/ChangeLog.txt index c86f40c4..bc67c4ac 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -5,6 +5,8 @@ v2.0.0 - 2023-xx-xx Minimum tested version is Python 3.7 - Add on_pre_connect() callback, which is called immediately before a connection attempt is made. +- Correctly mark connection as broken on SSL error and don't crash loop_forever. + Closes #750. v1.6.1 - 2021-10-21 diff --git a/src/paho/mqtt/client.py b/src/paho/mqtt/client.py index c792ca3f..202a49d1 100644 --- a/src/paho/mqtt/client.py +++ b/src/paho/mqtt/client.py @@ -160,7 +160,7 @@ sockpair_data = b"0" -class WebsocketConnectionError(ValueError): +class WebsocketConnectionError(ConnectionError): pass @@ -1747,7 +1747,7 @@ def loop_forever(self, timeout=1.0, max_packets=1, retry_first_connection=False) if self._state == mqtt_cs_connect_async: try: self.reconnect() - except (OSError, WebsocketConnectionError): + except OSError: self._handle_on_connect_fail() if not retry_first_connection: raise @@ -1788,7 +1788,7 @@ def should_exit(): else: try: self.reconnect() - except (OSError, WebsocketConnectionError): + except OSError: self._handle_on_connect_fail() self._easy_log( MQTT_LOG_DEBUG, "Connection failed, retrying") @@ -2410,14 +2410,14 @@ def _packet_read(self): command = self._sock_recv(1) except BlockingIOError: return MQTT_ERR_AGAIN - except ConnectionError as err: - self._easy_log( - MQTT_LOG_ERR, 'failed to receive on socket: %s', err) - return MQTT_ERR_CONN_LOST except TimeoutError as err: self._easy_log( MQTT_LOG_ERR, 'timeout on socket: %s', err) return MQTT_ERR_CONN_LOST + except OSError as err: + self._easy_log( + MQTT_LOG_ERR, 'failed to receive on socket: %s', err) + return MQTT_ERR_CONN_LOST else: if len(command) == 0: return MQTT_ERR_CONN_LOST @@ -2433,7 +2433,7 @@ def _packet_read(self): byte = self._sock_recv(1) except BlockingIOError: return MQTT_ERR_AGAIN - except ConnectionError as err: + except OSError as err: self._easy_log( MQTT_LOG_ERR, 'failed to receive on socket: %s', err) return MQTT_ERR_CONN_LOST @@ -2463,7 +2463,7 @@ def _packet_read(self): data = self._sock_recv(self._in_packet['to_process']) except BlockingIOError: return MQTT_ERR_AGAIN - except ConnectionError as err: + except OSError as err: self._easy_log( MQTT_LOG_ERR, 'failed to receive on socket: %s', err) return MQTT_ERR_CONN_LOST @@ -2513,7 +2513,7 @@ def _packet_write(self): except BlockingIOError: self._out_packet.appendleft(packet) return MQTT_ERR_AGAIN - except ConnectionError as err: + except OSError as err: self._out_packet.appendleft(packet) self._easy_log( MQTT_LOG_ERR, 'failed to receive on socket: %s', err) @@ -4000,7 +4000,7 @@ def _recv_impl(self, length): else: raise BlockingIOError - except ConnectionError: + except OSError: self.connected = False return b''