diff --git a/packages/client-python/src/rocketride/mixins/connection.py b/packages/client-python/src/rocketride/mixins/connection.py index 7354d93ab..5fae506f1 100644 --- a/packages/client-python/src/rocketride/mixins/connection.py +++ b/packages/client-python/src/rocketride/mixins/connection.py @@ -314,8 +314,12 @@ def _get_websocket_uri(uri: str) -> str: parsed = urllib.parse.urlparse(normalized) ws_scheme = 'wss' if parsed.scheme in ('https', 'wss') else 'ws' - ws_uri = parsed._replace(scheme=ws_scheme) - return f'{ws_uri.geturl()}/task/service' + + path = parsed.path.rstrip('/') + if not path.endswith('/task/service'): + path = path + '/task/service' + + return urllib.parse.urlunparse((ws_scheme, parsed.netloc, path, '', '', '')) def _set_uri(self, uri: str) -> None: """Update the server URI (internal).""" diff --git a/packages/client-python/tests/RocketRideClient_test.py b/packages/client-python/tests/RocketRideClient_test.py index 7f3d835e8..7bd32f55d 100644 --- a/packages/client-python/tests/RocketRideClient_test.py +++ b/packages/client-python/tests/RocketRideClient_test.py @@ -2370,6 +2370,10 @@ async def _check(): ('https://cloud.rocketride.ai', 'wss://cloud.rocketride.ai/task/service'), ('ws://localhost:5565', 'ws://localhost:5565/task/service'), ('http://localhost:5565', 'ws://localhost:5565/task/service'), + # Path already contains /task/service - must not duplicate + ('wss://cloud.rocketride.ai/task/service', 'wss://cloud.rocketride.ai/task/service'), + # Trailing slash must not produce double slash + ('http://localhost:5565/', 'ws://localhost:5565/task/service'), ], ) def test_get_websocket_uri_normalization(input_uri: str, expected_uri: str) -> None: