diff --git a/core/functional_tests/websocket_client/service.cpp b/core/functional_tests/websocket_client/service.cpp index bfb47302464d..617e7c380cd2 100644 --- a/core/functional_tests/websocket_client/service.cpp +++ b/core/functional_tests/websocket_client/service.cpp @@ -106,6 +106,8 @@ class TestClientHandler final : public server::handlers::HttpHandlerBase { return TestUnauth(request); } else if (test_name == "connection_already_extracted") { return TestConnectionAlreadyExtracted(request); + } else if (test_name == "remote_addr") { + return TestRemoteAddr(request); } else if (test_name == "large_server_message_default_limit") { return TestLargeServerMessageDefaultLimit(request); } else if (test_name == "large_server_message_custom_limit") { @@ -125,6 +127,16 @@ class TestClientHandler final : public server::handlers::HttpHandlerBase { return client_.CreateRequest().url(fmt::format("ws://localhost:{}{}", port, uri)).PerformWebSocketHandshake(); } + std::string TestRemoteAddr(const server::http::HttpRequest& request) const { + const auto port = std::stoi(request.GetArg("port")); + auto conn = PerformWebSocket(request, "/echo").MakeWebSocketConnection(); + + const auto remote_port = conn->RemoteAddr().Port(); + conn->Close(websocket::CloseStatus::kNormal); + + return remote_port == port ? "OK" : fmt::format("FAIL: remote port is {}", remote_port); + } + std::string TestEcho(const server::http::HttpRequest& request) const { auto conn = PerformWebSocket(request, "/echo").MakeWebSocketConnection(); diff --git a/core/functional_tests/websocket_client/tests/test_websocket_client.py b/core/functional_tests/websocket_client/tests/test_websocket_client.py index 2a62058d8a92..9dee6e47fec9 100644 --- a/core/functional_tests/websocket_client/tests/test_websocket_client.py +++ b/core/functional_tests/websocket_client/tests/test_websocket_client.py @@ -13,6 +13,7 @@ 'nonblocking_write', 'unauth', 'connection_already_extracted', + 'remote_addr', 'large_server_message_default_limit', 'large_server_message_custom_limit', ], diff --git a/core/src/clients/http/websocket_response.cpp b/core/src/clients/http/websocket_response.cpp index ba039e248f60..53f5149e1fea 100644 --- a/core/src/clients/http/websocket_response.cpp +++ b/core/src/clients/http/websocket_response.cpp @@ -191,7 +191,8 @@ std::shared_ptr WebSocketResponse::MakeWebSocket } auto socket = std::make_unique(socket_.GetNative()); - auto addr = socket->Getsockname(); + auto addr = socket->Getpeername(); + std::move(socket_).Release(); std::unique_ptr rw = std::move(socket);