Skip to content

Commit a58c184

Browse files
do not disconnect an already disconnected client
See miguelgrinberg/Flask-SocketIO#312
1 parent 0107123 commit a58c184

File tree

2 files changed

+23
-5
lines changed

2 files changed

+23
-5
lines changed

socketio/server.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -296,11 +296,12 @@ def disconnect(self, sid, namespace=None):
296296
argument is omitted the default namespace is used.
297297
"""
298298
namespace = namespace or '/'
299-
self.logger.info('Disconnecting %s [%s]', sid, namespace)
300-
self._send_packet(sid, packet.Packet(packet.DISCONNECT,
301-
namespace=namespace))
302-
self._trigger_event('disconnect', namespace, sid)
303-
self.manager.disconnect(sid, namespace=namespace)
299+
if self.manager.is_connected(sid, namespace=namespace):
300+
self.logger.info('Disconnecting %s [%s]', sid, namespace)
301+
self._send_packet(sid, packet.Packet(packet.DISCONNECT,
302+
namespace=namespace))
303+
self._trigger_event('disconnect', namespace, sid)
304+
self.manager.disconnect(sid, namespace=namespace)
304305

305306
def transport(self, sid):
306307
"""Return the name of the transport used by the client.

tests/test_server.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,23 @@ def test_disconnect_namespace(self, eio):
389389
s.disconnect('123', namespace='/foo')
390390
s.eio.send.assert_any_call('123', '1/foo', binary=False)
391391

392+
def test_disconnect_twice(self, eio):
393+
s = server.Server()
394+
s._handle_eio_connect('123', 'environ')
395+
s.disconnect('123')
396+
calls = s.eio.send.call_count
397+
s.disconnect('123')
398+
self.assertEqual(calls, s.eio.send.call_count)
399+
400+
def test_disconnect_twice_namespace(self, eio):
401+
s = server.Server()
402+
s._handle_eio_connect('123', 'environ')
403+
s._handle_eio_message('123', '0/foo')
404+
s.disconnect('123', namespace='/foo')
405+
calls = s.eio.send.call_count
406+
s.disconnect('123', namespace='/foo')
407+
self.assertEqual(calls, s.eio.send.call_count)
408+
392409
def test_namespace_handler(self, eio):
393410
result = {}
394411

0 commit comments

Comments
 (0)