diff --git a/ably/transport/websockettransport.py b/ably/transport/websockettransport.py index ad4f2856..cd048475 100644 --- a/ably/transport/websockettransport.py +++ b/ably/transport/websockettransport.py @@ -11,6 +11,7 @@ import msgpack from ably.http.httputils import HttpUtils +from ably.transport.defaults import Defaults from ably.types.connectiondetails import ConnectionDetails from ably.types.operations import PublishResult from ably.util.eventemitter import EventEmitter @@ -81,7 +82,8 @@ def connect(self): headers = HttpUtils.default_headers() query_params = urllib.parse.urlencode(self.params) scheme = 'wss' if self.options.tls else 'ws' - ws_url = f'{scheme}://{self.host}?{query_params}' + port = Defaults.get_port(self.options) + ws_url = f'{scheme}://{self.host}:{port}?{query_params}' log.info(f'connect(): attempting to connect to {ws_url}') self.ws_connect_task = asyncio.create_task(self.ws_connect(ws_url, headers)) self.ws_connect_task.add_done_callback(self.on_ws_connect_done) diff --git a/test/ably/realtime/realtimeconnection_test.py b/test/ably/realtime/realtimeconnection_test.py index dbd20698..d187a378 100644 --- a/test/ably/realtime/realtimeconnection_test.py +++ b/test/ably/realtime/realtimeconnection_test.py @@ -67,8 +67,8 @@ async def close_active_connection(self): @property def endpoint(self) -> str: - """Endpoint string to pass to AblyRealtime (combine with tls=False).""" - return f"127.0.0.1:{self.port}" + """Host to pass to AblyRealtime (combine with tls=False and port=self.port).""" + return "127.0.0.1" async def __aenter__(self): self.server = await ws_serve(self._handler, "127.0.0.1", 0, ping_interval=None) @@ -242,6 +242,7 @@ async def test_ping_survives_connection_drop(self): realtime_request_timeout=20000, tls=False, endpoint=proxy.endpoint, + port=proxy.port, ) try: await asyncio.wait_for(ably.connection.once_async(ConnectionState.CONNECTED), timeout=10) @@ -654,6 +655,7 @@ async def test_normal_ws_close_triggers_immediate_reconnection(self): suspended_retry_timeout=500_000, tls=False, endpoint=proxy.endpoint, + port=proxy.port, ) try: diff --git a/test/unit/websockettransport_test.py b/test/unit/websockettransport_test.py new file mode 100644 index 00000000..d45c3ca8 --- /dev/null +++ b/test/unit/websockettransport_test.py @@ -0,0 +1,39 @@ +from unittest.mock import MagicMock, patch + +from ably.transport.websockettransport import WebSocketTransport +from ably.types.options import Options + + +def _connect_url(host='example.com', **option_kwargs): + connection_manager = MagicMock() + connection_manager.options = Options(auth_token='foo', **option_kwargs) + transport = WebSocketTransport(connection_manager, host, {'format': 'json'}) + with patch.object(transport, 'ws_connect', MagicMock()) as mock_ws_connect: + with patch('ably.transport.websockettransport.asyncio.create_task') as mock_create_task: + mock_create_task.return_value = MagicMock() + transport.connect() + return mock_ws_connect.call_args[0][0] + + +# TO3d, TO3o +def test_websocket_url_uses_wss_and_tls_port_when_tls_enabled(): + url = _connect_url(tls=True, tls_port=9999) + assert url == 'wss://example.com:9999?format=json' + + +# TO3d, TO3n +def test_websocket_url_uses_ws_and_port_when_tls_disabled(): + url = _connect_url(tls=False, port=9998) + assert url == 'ws://example.com:9998?format=json' + + +# TO3d, TO3o +def test_websocket_url_defaults_to_wss_and_443(): + url = _connect_url() + assert url == 'wss://example.com:443?format=json' + + +# TO3d, TO3n +def test_websocket_url_defaults_to_ws_and_80_when_tls_disabled(): + url = _connect_url(tls=False) + assert url == 'ws://example.com:80?format=json'