Skip to content

Commit cb1b8ec

Browse files
Return error packet if client connects to an already connected namespace
1 parent e5e7c8e commit cb1b8ec

File tree

3 files changed

+25
-2
lines changed

3 files changed

+25
-2
lines changed

src/socketio/base_manager.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import itertools
22
import logging
33

4-
from bidict import bidict
4+
from bidict import bidict, ValueDuplicationError
55

66
default_logger = logging.getLogger('socketio')
77

@@ -51,7 +51,11 @@ def get_participants(self, namespace, room):
5151
def connect(self, eio_sid, namespace):
5252
"""Register a client connection to a namespace."""
5353
sid = self.server.eio.generate_id()
54-
self.enter_room(sid, namespace, None, eio_sid=eio_sid)
54+
try:
55+
self.enter_room(sid, namespace, None, eio_sid=eio_sid)
56+
except ValueDuplicationError:
57+
# already connected
58+
return None
5559
self.enter_room(sid, namespace, sid, eio_sid=eio_sid)
5660
return sid
5761

src/socketio/server.py

+6
Original file line numberDiff line numberDiff line change
@@ -641,6 +641,12 @@ def _handle_connect(self, eio_sid, namespace, data):
641641
"""Handle a client connection request."""
642642
namespace = namespace or '/'
643643
sid = self.manager.connect(eio_sid, namespace)
644+
if sid is None:
645+
self._send_packet(eio_sid, self.packet_class(
646+
packet.CONNECT_ERROR, data='Unable to connect',
647+
namespace=namespace))
648+
return
649+
644650
if self.always_connect:
645651
self._send_packet(eio_sid, self.packet_class(
646652
packet.CONNECT, {'sid': sid}, namespace=namespace))

tests/common/test_server.py

+13
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,19 @@ def test_handle_connect_namespace(self, eio):
366366
handler.assert_called_once_with('1', 'environ')
367367
s.eio.send.assert_called_once_with('123', '0/foo,{"sid":"1"}')
368368

369+
def test_handle_connect_namespace_twice(self, eio):
370+
s = server.Server()
371+
handler = mock.MagicMock()
372+
s.on('connect', handler, namespace='/foo')
373+
s._handle_eio_connect('123', 'environ')
374+
s._handle_eio_message('123', '0/foo,')
375+
s._handle_eio_message('123', '0/foo,')
376+
assert s.manager.is_connected('1', '/foo')
377+
handler.assert_called_once_with('1', 'environ')
378+
s.eio.send.assert_any_call('123', '0/foo,{"sid":"1"}')
379+
print(s.eio.send.call_args_list)
380+
s.eio.send.assert_any_call('123', '4/foo,"Unable to connect"')
381+
369382
def test_handle_connect_always_connect(self, eio):
370383
s = server.Server(always_connect=True)
371384
s.manager.initialize = mock.MagicMock()

0 commit comments

Comments
 (0)