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] namespaces = [namespaces]
self.connection_namespaces = namespaces self.connection_namespaces = namespaces
self.namespaces = {} self.namespaces = {}
self.failed_namespaces = []
if self._connect_event is None: if self._connect_event is None:
self._connect_event = self.eio.create_event() self._connect_event = self.eio.create_event()
else: else:
@ -166,14 +167,16 @@ class AsyncClient(base_client.BaseClient):
await asyncio.wait_for(self._connect_event.wait(), await asyncio.wait_for(self._connect_event.wait(),
wait_timeout) wait_timeout)
self._connect_event.clear() 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 break
except asyncio.TimeoutError: except asyncio.TimeoutError:
pass pass
if set(self.namespaces) != set(self.connection_namespaces): if set(self.namespaces) != set(self.connection_namespaces):
await self.disconnect() await self.disconnect()
raise exceptions.ConnectionError( raise exceptions.ConnectionError(
'One or more namespaces failed to connect') 'One or more namespaces failed to connect'
', '.join(self.failed_namespaces))
self.connected = True self.connected = True
@ -448,6 +451,7 @@ class AsyncClient(base_client.BaseClient):
elif not isinstance(data, (tuple, list)): elif not isinstance(data, (tuple, list)):
data = (data,) data = (data,)
await self._trigger_event('connect_error', namespace, *data) await self._trigger_event('connect_error', namespace, *data)
self.failed_namespaces.append(namespace)
self._connect_event.set() self._connect_event.set()
if namespace in self.namespaces: if namespace in self.namespaces:
del self.namespaces[namespace] 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.connected = False #: Indicates if the client is connected or not.
self.namespaces = {} #: set of connected namespaces. self.namespaces = {} #: set of connected namespaces.
self.failed_namespaces = []
self.handlers = {} self.handlers = {}
self.namespace_handlers = {} self.namespace_handlers = {}
self.callbacks = {} self.callbacks = {}

10
src/socketio/client.py

@ -137,6 +137,7 @@ class Client(base_client.BaseClient):
namespaces = [namespaces] namespaces = [namespaces]
self.connection_namespaces = namespaces self.connection_namespaces = namespaces
self.namespaces = {} self.namespaces = {}
self.failed_namespaces = []
if self._connect_event is None: if self._connect_event is None:
self._connect_event = self.eio.create_event() self._connect_event = self.eio.create_event()
else: else:
@ -161,12 +162,14 @@ class Client(base_client.BaseClient):
if wait: if wait:
while self._connect_event.wait(timeout=wait_timeout): while self._connect_event.wait(timeout=wait_timeout):
self._connect_event.clear() 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 break
if set(self.namespaces) != set(self.connection_namespaces): if set(self.namespaces) != set(self.connection_namespaces):
self.disconnect() self.disconnect()
raise exceptions.ConnectionError( raise exceptions.ConnectionError(
'One or more namespaces failed to connect') 'One or more namespaces failed to connect: '
', '.join(self.failed_namespaces))
self.connected = True self.connected = True
@ -425,6 +428,7 @@ class Client(base_client.BaseClient):
elif not isinstance(data, (tuple, list)): elif not isinstance(data, (tuple, list)):
data = (data,) data = (data,)
self._trigger_event('connect_error', namespace, *data) self._trigger_event('connect_error', namespace, *data)
self.failed_namespaces.append(namespace)
self._connect_event.set() self._connect_event.set()
if namespace in self.namespaces: if namespace in self.namespaces:
del self.namespaces[namespace] del self.namespaces[namespace]
@ -439,7 +443,7 @@ class Client(base_client.BaseClient):
if handler: if handler:
try: try:
return handler(*args) return handler(*args)
except TypeError: except TypeError: # pragma: no cover
# the legacy disconnect event does not take a reason argument # the legacy disconnect event does not take a reason argument
if event == 'disconnect': if event == 'disconnect':
return handler(*args[:-1]) return handler(*args[:-1])

Loading…
Cancel
Save