Browse Source

Delete incomplete binary packet when client disconnects

main
Miguel Grinberg 2 weeks ago
parent
commit
4bec3ef87b
Failed to extract signature
  1. 2
      src/socketio/async_server.py
  2. 2
      src/socketio/server.py
  3. 19
      tests/async/test_server.py
  4. 17
      tests/common/test_server.py

2
src/socketio/async_server.py

@ -590,6 +590,8 @@ class AsyncServer(base_server.BaseServer):
if not self.manager.is_connected(sid, namespace): # pragma: no cover
return
self.manager.pre_disconnect(sid, namespace=namespace)
if eio_sid in self._binary_packet:
del self._binary_packet[eio_sid]
await self._trigger_event('disconnect', namespace, sid,
reason or self.reason.CLIENT_DISCONNECT)
await self.manager.disconnect(sid, namespace, ignore_queue=True)

2
src/socketio/server.py

@ -571,6 +571,8 @@ class Server(base_server.BaseServer):
if not self.manager.is_connected(sid, namespace): # pragma: no cover
return
self.manager.pre_disconnect(sid, namespace=namespace)
if eio_sid in self._binary_packet:
del self._binary_packet[eio_sid]
self._trigger_event('disconnect', namespace, sid,
reason or self.reason.CLIENT_DISCONNECT)
self.manager.disconnect(sid, namespace, ignore_queue=True)

19
tests/async/test_server.py

@ -937,7 +937,7 @@ class TestAsyncServer:
await s.disconnect('1', namespace='/foo')
assert calls == s.eio.send.await_count
async def test_disconnect_with_partial_binary_packet(self, eio):
async def test_server_disconnect_with_partial_binary_packet(self, eio):
eio.return_value.send = mock.AsyncMock()
eio.return_value.disconnect = mock.AsyncMock()
s = async_server.AsyncServer()
@ -955,6 +955,23 @@ class TestAsyncServer:
s.eio.send.assert_any_await('123', '1')
assert '123' not in s._binary_packet
async def test_client_disconnect_with_partial_binary_packet(self, eio):
eio.return_value.send = mock.AsyncMock()
eio.return_value.disconnect = mock.AsyncMock()
s = async_server.AsyncServer()
await s._handle_eio_connect('123', 'environ')
await s._handle_eio_message('123', '0')
await s._handle_eio_message(
'123',
'52-["my message","a",'
'{"_placeholder":true,"num":1},'
'{"_placeholder":true,"num":0}]',
)
await s._handle_eio_message('123', b'foo')
assert s._binary_packet['123'] is not None
await s._handle_disconnect('123', '/')
assert '123' not in s._binary_packet
async def test_namespace_handler(self, eio):
eio.return_value.send = mock.AsyncMock()
result = {}

17
tests/common/test_server.py

@ -862,7 +862,7 @@ class TestServer:
s.disconnect('123', namespace='/foo')
assert calls == s.eio.send.call_count
def test_disconnect_with_partial_binary_packet(self, eio):
def test_disconnect_server_with_partial_binary_packet(self, eio):
s = server.Server()
s._handle_eio_connect('123', 'environ')
s._handle_eio_message('123', '0')
@ -878,6 +878,21 @@ class TestServer:
s.eio.send.assert_any_call('123', '1')
assert '123' not in s._binary_packet
def test_disconnect_client_with_partial_binary_packet(self, eio):
s = server.Server()
s._handle_eio_connect('123', 'environ')
s._handle_eio_message('123', '0')
s._handle_eio_message(
'123',
'52-["my message","a",'
'{"_placeholder":true,"num":1},'
'{"_placeholder":true,"num":0}]',
)
s._handle_eio_message('123', b'foo')
assert s._binary_packet['123'] is not None
s._handle_disconnect('123', '/')
assert '123' not in s._binary_packet
def test_namespace_handler(self, eio):
result = {}

Loading…
Cancel
Save