Skip to content

Commit f56ef6f

Browse files
Fixed disconnect implementation when using a message queue (Fixes miguelgrinberg#1002)
1 parent ce1afd7 commit f56ef6f

5 files changed

Lines changed: 18 additions & 6 deletions

File tree

src/socketio/base_manager.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ def pre_disconnect(self, sid, namespace):
9494
self.pending_disconnect[namespace].append(sid)
9595
return self.rooms[namespace][None].get(sid)
9696

97-
def disconnect(self, sid, namespace):
97+
def disconnect(self, sid, namespace, **kwargs):
9898
"""Register a client disconnect from a namespace."""
9999
if namespace not in self.rooms:
100100
return

src/socketio/pubsub_manager.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,10 @@ def can_disconnect(self, sid, namespace):
7575
self._publish({'method': 'disconnect', 'sid': sid,
7676
'namespace': namespace or '/'})
7777

78-
def disconnect(self, sid, namespace=None):
78+
def disconnect(self, sid, namespace=None, **kwargs):
79+
if kwargs.get('ignore_queue'):
80+
return super(PubSubManager, self).disconnect(
81+
sid, namespace=namespace)
7982
self._publish({'method': 'disconnect', 'sid': sid,
8083
'namespace': namespace or '/'})
8184

src/socketio/server.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -565,7 +565,8 @@ def disconnect(self, sid, namespace=None, ignore_queue=False):
565565
self._send_packet(eio_sid, self.packet_class(
566566
packet.DISCONNECT, namespace=namespace))
567567
self._trigger_event('disconnect', namespace, sid)
568-
self.manager.disconnect(sid, namespace=namespace)
568+
self.manager.disconnect(sid, namespace=namespace,
569+
ignore_queue=True)
569570

570571
def transport(self, sid):
571572
"""Return the name of the transport used by the client.
@@ -693,7 +694,7 @@ def _handle_connect(self, eio_sid, namespace, data):
693694
self._send_packet(eio_sid, self.packet_class(
694695
packet.CONNECT_ERROR, data=fail_reason,
695696
namespace=namespace))
696-
self.manager.disconnect(sid, namespace)
697+
self.manager.disconnect(sid, namespace, ignore_queue=True)
697698
elif not self.always_connect:
698699
self._send_packet(eio_sid, self.packet_class(
699700
packet.CONNECT, {'sid': sid}, namespace=namespace))
@@ -706,7 +707,7 @@ def _handle_disconnect(self, eio_sid, namespace):
706707
return
707708
self.manager.pre_disconnect(sid, namespace=namespace)
708709
self._trigger_event('disconnect', namespace, sid)
709-
self.manager.disconnect(sid, namespace)
710+
self.manager.disconnect(sid, namespace, ignore_queue=True)
710711

711712
def _handle_event(self, eio_sid, namespace, id, data):
712713
"""Handle an incoming client event."""

tests/common/test_pubsub_manager.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,13 @@ def test_disconnect(self):
175175
{'method': 'disconnect', 'sid': 'foo', 'namespace': '/'}
176176
)
177177

178+
def test_disconnect_ignore_queue(self):
179+
sid = self.pm.connect('123', '/')
180+
self.pm.pre_disconnect(sid, '/')
181+
self.pm.disconnect(sid, ignore_queue=True)
182+
self.pm._publish.assert_not_called()
183+
assert not self.pm.is_connected(sid, '/')
184+
178185
def test_close_room(self):
179186
self.pm.close_room('foo')
180187
self.pm._publish.assert_called_once_with(

tests/common/test_server.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -532,7 +532,8 @@ def test_handle_disconnect(self, eio):
532532
s._handle_eio_message('123', '0')
533533
s._handle_eio_disconnect('123')
534534
handler.assert_called_once_with('1')
535-
s.manager.disconnect.assert_called_once_with('1', '/')
535+
s.manager.disconnect.assert_called_once_with('1', '/',
536+
ignore_queue=True)
536537
assert s.environ == {}
537538

538539
def test_handle_disconnect_namespace(self, eio):

0 commit comments

Comments
 (0)