From 5fe2e5158268c13f20d103c052fc8fe927cbeae6 Mon Sep 17 00:00:00 2001 From: Andrew Mirsky Date: Mon, 8 Dec 2025 11:19:40 -0500 Subject: [PATCH 1/2] if peer info is not available, return None (#300) --- amqtt/adapters.py | 4 +++- tests/test_broker.py | 11 +++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/amqtt/adapters.py b/amqtt/adapters.py index 62ee96ab..2c18a837 100644 --- a/amqtt/adapters.py +++ b/amqtt/adapters.py @@ -176,8 +176,10 @@ async def drain(self) -> None: if not self.is_closed: await self._writer.drain() - def get_peer_info(self) -> tuple[str, int]: + def get_peer_info(self) -> tuple[str, int] | None: extra_info = self._writer.get_extra_info("peername") + if not extra_info or len(extra_info) < 2: + return None return extra_info[0], extra_info[1] def get_ssl_info(self) -> ssl.SSLObject | None: diff --git a/tests/test_broker.py b/tests/test_broker.py index ea68097c..0abbf67c 100644 --- a/tests/test_broker.py +++ b/tests/test_broker.py @@ -1028,3 +1028,14 @@ async def test_broker_with_absent_auth_plugin_filter(): await mqtt_client.connect() await broker.shutdown() + + +@pytest.mark.asyncio +async def test_client_without_peer_info(broker, mock_plugin_manager): + client = MQTTClient(config={'auto_reconnect':False}) + + # if the broker's stream writer for this client does not have peer info, the client should fail to connect + with patch.object(asyncio.streams.StreamWriter, 'get_extra_info', return_value=None) as mock_extra_info: + with pytest.raises(ConnectError): + await client.connect("mqtt://127.0.0.1/") + await asyncio.sleep(0.01) From 46b9e57375f289b4a3d5f83540057bec1420a2ac Mon Sep 17 00:00:00 2001 From: Andrew Mirsky Date: Tue, 9 Dec 2025 15:37:09 -0500 Subject: [PATCH 2/2] in python 3.10, streamwriter doesn't close when it's gc, need to explictly call --- amqtt/broker.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/amqtt/broker.py b/amqtt/broker.py index 48cd2e41..c9e83a7e 100644 --- a/amqtt/broker.py +++ b/amqtt/broker.py @@ -444,6 +444,8 @@ async def _client_connected(self, listener_name: str, reader: ReaderAdapter, wri remote_info = writer.get_peer_info() if remote_info is None: self.logger.warning("Remote info could not be retrieved from peer info") + await writer.close() # python 3.10 needs explicit close + server.release_connection() return remote_address, remote_port = remote_info