Skip to content

Commit faf358a

Browse files
Copilotlawtancool
andcommitted
Create new session sharing caller's connector to avoid closing caller's session on disconnect
Co-authored-by: lawtancool <26829131+lawtancool@users.noreply.github.com>
1 parent cc6562e commit faf358a

2 files changed

Lines changed: 24 additions & 4 deletions

File tree

pyControl4/websocket.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,8 +198,14 @@ async def sio_connect(self, director_bearer_token):
198198
await self.sio_disconnect()
199199

200200
if self.session is not None:
201+
# Create a new session using the caller's connector so engineio
202+
# can safely close it in _reset() without affecting the caller's
203+
# session.
204+
http_session = aiohttp.ClientSession(
205+
connector=self.session.connector, connector_owner=False
206+
)
201207
self._sio = socketio.AsyncClient(
202-
ssl_verify=False, http_session=self.session
208+
ssl_verify=False, http_session=http_session
203209
)
204210
else:
205211
self._sio = socketio.AsyncClient(ssl_verify=False)

tests/test_websocket_ssl.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from unittest.mock import AsyncMock, MagicMock, patch
44

5+
import aiohttp
56
import socketio_v4
67
import pytest
78

@@ -26,15 +27,28 @@ async def test_sio_connect_without_session():
2627

2728
@pytest.mark.asyncio
2829
async def test_sio_connect_with_session():
29-
"""Test that sio_connect passes the caller's session as http_session."""
30+
"""Test that sio_connect creates a new session sharing the caller's
31+
connector and passes it as http_session, so engineio can safely close
32+
it without affecting the caller's session."""
33+
mock_connector = MagicMock()
3034
mock_session = MagicMock()
35+
mock_session.connector = mock_connector
3136
ws = C4Websocket("192.168.1.1", session_no_verify_ssl=mock_session)
3237
with patch.object(
3338
socketio_v4.AsyncClient, "__init__", return_value=None
3439
) as mock_init, patch.object(
3540
socketio_v4.AsyncClient, "register_namespace"
3641
), patch.object(
3742
socketio_v4.AsyncClient, "connect", new_callable=AsyncMock
38-
):
43+
), patch.object(
44+
aiohttp, "ClientSession"
45+
) as mock_session_cls:
46+
mock_http_session = MagicMock()
47+
mock_session_cls.return_value = mock_http_session
3948
await ws.sio_connect("test-token")
40-
mock_init.assert_called_once_with(ssl_verify=False, http_session=mock_session)
49+
mock_session_cls.assert_called_once_with(
50+
connector=mock_connector, connector_owner=False
51+
)
52+
mock_init.assert_called_once_with(
53+
ssl_verify=False, http_session=mock_http_session
54+
)

0 commit comments

Comments
 (0)