diff --git a/docs/usage.md b/docs/usage.md index 0bea92de..c56f3c43 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -219,6 +219,8 @@ headers["foo"] = "bar"; webSocket.setExtraHeaders(headers); ``` +You may also prevent header fields from being sent - like User-Agent or Origin - by setting the corresponding HTTP header fields to "". + ### Subprotocols You can specify subprotocols to be set during the WebSocket handshake. For more info you can refer to [this doc](https://hpbn.co/websocket/#subprotocol-negotiation). diff --git a/ixwebsocket/IXWebSocketHandshake.cpp b/ixwebsocket/IXWebSocketHandshake.cpp index 986b270c..79fbafdf 100644 --- a/ixwebsocket/IXWebSocketHandshake.cpp +++ b/ixwebsocket/IXWebSocketHandshake.cpp @@ -143,6 +143,7 @@ namespace ix for (auto& it : extraHeaders) { + if (it.second.empty()) continue; ss << it.first << ": " << it.second << "\r\n"; } diff --git a/test/IXWebSocketHostTest.cpp b/test/IXWebSocketHostTest.cpp index 94025ffb..aa214b47 100644 --- a/test/IXWebSocketHostTest.cpp +++ b/test/IXWebSocketHostTest.cpp @@ -14,10 +14,11 @@ using namespace ix; -bool startServer(ix::WebSocketServer& server, std::string& subProtocols) +bool startServer(ix::WebSocketServer& server, std::string& subProtocols, + WebSocketHttpHeaders& receivedHeaders) { server.setOnClientMessageCallback( - [&server, &subProtocols](std::shared_ptr connectionState, + [&server, &subProtocols, &receivedHeaders](std::shared_ptr connectionState, WebSocket& webSocket, const ix::WebSocketMessagePtr& msg) { auto remoteIp = connectionState->getRemoteIp(); @@ -34,6 +35,7 @@ bool startServer(ix::WebSocketServer& server, std::string& subProtocols) } subProtocols = msg->openInfo.headers["Sec-WebSocket-Protocol"]; + receivedHeaders = msg->openInfo.headers; } else if (msg->type == ix::WebSocketMessageType::Close) { @@ -62,12 +64,14 @@ bool startServer(ix::WebSocketServer& server, std::string& subProtocols) return true; } -void runTest(int port, const ix::WebSocketHttpHeaders & headers) +WebSocketHttpHeaders runTest(int port, const ix::WebSocketHttpHeaders & headers) { ix::WebSocketServer server(port); std::string subProtocols; - startServer(server, subProtocols); + WebSocketHttpHeaders receivedHeaders; + + startServer(server, subProtocols, receivedHeaders); std::atomic connected(false); ix::WebSocket webSocket; @@ -107,6 +111,7 @@ void runTest(int port, const ix::WebSocketHttpHeaders & headers) server.stop(); REQUIRE(subProtocols == "json,msgpack"); + return receivedHeaders; } @@ -141,4 +146,12 @@ TEST_CASE("host", "[websocket_host]") int port = getFreePort(); runTest(port, {{"Host", "localhost"}}); } + + SECTION("Connect with User-Agent and Origin header removed") + { + int port = getFreePort(); + WebSocketHttpHeaders received = runTest(port, {{"User-Agent", ""}, {"Origin", ""}}); + CHECK(received.count("User-Agent") == 0); + CHECK(received.count("Origin") == 0); + } }