Browse Source

keep track of which namespaces failed to connect (#1496)

pull/1499/head
Miguel Grinberg 3 weeks ago
committed by GitHub
parent
commit
5dc2aea077
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 8
      src/socketio/async_client.py
  2. 1
      src/socketio/base_client.py
  3. 10
      src/socketio/client.py

8
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]

1
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 = {}

10
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])

Loading…
Cancel
Save