diff --git a/src/socketio/async_client.py b/src/socketio/async_client.py index 0a0137c..d84988a 100644 --- a/src/socketio/async_client.py +++ b/src/socketio/async_client.py @@ -139,6 +139,7 @@ class AsyncClient(base_client.BaseClient): namespaces = [namespaces] self.connection_namespaces = namespaces self.namespaces = {} + self.failed_namespaces = [] if self._connect_event is None: self._connect_event = self.eio.create_event() else: @@ -166,14 +167,16 @@ class AsyncClient(base_client.BaseClient): await asyncio.wait_for(self._connect_event.wait(), wait_timeout) self._connect_event.clear() - if set(self.namespaces) == set(self.connection_namespaces): + if len(self.namespaces) + len(self.failed_namespaces) == \ + len(self.connection_namespaces): break except asyncio.TimeoutError: pass if set(self.namespaces) != set(self.connection_namespaces): await self.disconnect() raise exceptions.ConnectionError( - 'One or more namespaces failed to connect') + 'One or more namespaces failed to connect' + ', '.join(self.failed_namespaces)) self.connected = True @@ -448,6 +451,7 @@ class AsyncClient(base_client.BaseClient): elif not isinstance(data, (tuple, list)): data = (data,) await self._trigger_event('connect_error', namespace, *data) + self.failed_namespaces.append(namespace) self._connect_event.set() if namespace in self.namespaces: del self.namespaces[namespace] diff --git a/src/socketio/base_client.py b/src/socketio/base_client.py index 7bf4420..0232dca 100644 --- a/src/socketio/base_client.py +++ b/src/socketio/base_client.py @@ -93,6 +93,7 @@ class BaseClient: self.connected = False #: Indicates if the client is connected or not. self.namespaces = {} #: set of connected namespaces. + self.failed_namespaces = [] self.handlers = {} self.namespace_handlers = {} self.callbacks = {} diff --git a/src/socketio/client.py b/src/socketio/client.py index 84b1643..1935821 100644 --- a/src/socketio/client.py +++ b/src/socketio/client.py @@ -137,6 +137,7 @@ class Client(base_client.BaseClient): namespaces = [namespaces] self.connection_namespaces = namespaces self.namespaces = {} + self.failed_namespaces = [] if self._connect_event is None: self._connect_event = self.eio.create_event() else: @@ -161,12 +162,14 @@ class Client(base_client.BaseClient): if wait: while self._connect_event.wait(timeout=wait_timeout): self._connect_event.clear() - if set(self.namespaces) == set(self.connection_namespaces): + if len(self.namespaces) + len(self.failed_namespaces) == \ + len(self.connection_namespaces): break if set(self.namespaces) != set(self.connection_namespaces): self.disconnect() raise exceptions.ConnectionError( - 'One or more namespaces failed to connect') + 'One or more namespaces failed to connect: ' + ', '.join(self.failed_namespaces)) self.connected = True @@ -425,6 +428,7 @@ class Client(base_client.BaseClient): elif not isinstance(data, (tuple, list)): data = (data,) self._trigger_event('connect_error', namespace, *data) + self.failed_namespaces.append(namespace) self._connect_event.set() if namespace in self.namespaces: del self.namespaces[namespace] @@ -439,7 +443,7 @@ class Client(base_client.BaseClient): if handler: try: return handler(*args) - except TypeError: + except TypeError: # pragma: no cover # the legacy disconnect event does not take a reason argument if event == 'disconnect': return handler(*args[:-1])