From 5a241d77392d304ed2bec4bfcce9f840d6a79b0a Mon Sep 17 00:00:00 2001 From: Thinh Nguyen Date: Mon, 29 Oct 2018 13:55:09 +1100 Subject: [PATCH] Only setting session username/password if it is not already set. This is to prevent failures when the broker is reconnecting without username/password --- hbmqtt/client.py | 4 ++-- tests/test_client.py | 25 +++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/hbmqtt/client.py b/hbmqtt/client.py index ec25bb6..b8e8098 100644 --- a/hbmqtt/client.py +++ b/hbmqtt/client.py @@ -349,8 +349,8 @@ class MQTTClient: uri_attributes = urlparse(self.session.broker_uri) scheme = uri_attributes.scheme secure = True if scheme in ('mqtts', 'wss') else False - self.session.username = uri_attributes.username - self.session.password = uri_attributes.password + self.session.username = self.session.username if self.session.username else uri_attributes.username + self.session.password = self.session.password if self.session.password else uri_attributes.password self.session.remote_address = uri_attributes.hostname self.session.remote_port = uri_attributes.port if scheme in ('mqtt', 'mqtts') and not self.session.remote_port: diff --git a/tests/test_client.py b/tests/test_client.py index 9f028a7..cdc3f8b 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -111,6 +111,31 @@ class MQTTClientTest(unittest.TestCase): except Exception as ae: future.set_exception(ae) + future = asyncio.Future(loop=self.loop) + self.loop.run_until_complete(test_coro()) + if future.exception(): + raise future.exception() + raise future.exception() + + def test_reconnect_ws_retain_username_password(self): + @asyncio.coroutine + def test_coro(): + try: + broker = Broker(broker_config, plugin_namespace="hbmqtt.test.plugins") + yield from broker.start() + client = MQTTClient() + yield from client.connect('ws://fred:password@127.0.0.1:8080/') + self.assertIsNotNone(client.session) + yield from client.disconnect() + yield from client.reconnect() + + self.assertIsNotNone(client.session.username) + self.assertIsNotNone(client.session.password) + yield from broker.shutdown() + future.set_result(True) + except Exception as ae: + future.set_exception(ae) + future = asyncio.Future(loop=self.loop) self.loop.run_until_complete(test_coro()) if future.exception():