diff --git a/src/socketio/async_server.py b/src/socketio/async_server.py index 7e9c872..bcffb35 100644 --- a/src/socketio/async_server.py +++ b/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) diff --git a/src/socketio/server.py b/src/socketio/server.py index 143d27e..6af30f3 100644 --- a/src/socketio/server.py +++ b/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) diff --git a/tests/async/test_server.py b/tests/async/test_server.py index c3c0903..97c804a 100644 --- a/tests/async/test_server.py +++ b/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 = {} diff --git a/tests/common/test_server.py b/tests/common/test_server.py index d8d80dc..251d661 100644 --- a/tests/common/test_server.py +++ b/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 = {}