Ignore a subprotocol the WebSocket client did not offer

A SubProtocolSelector could return a value outside the client's
Sec-WebSocket-Protocol list, and the server sent it back as is. The
server now treats such a value as no selection.
This commit is contained in:
yhirose
2026-10-04 18:34:21 -04:00
parent 4fcbc08f2d
commit 6d1049462d
3 changed files with 31 additions and 1 deletions
+24
View File
@@ -24061,6 +24061,18 @@ protected:
}
return "";
});
server_->WebSocket(
"/ws-subprotocol-unoffered",
[](const Request &, ws::WebSocket &ws) {
std::string msg;
while (ws.read(msg)) {
ws.send(msg);
}
},
[](const std::vector<std::string> &) -> std::string {
return "admin";
});
}
void start_server() {
@@ -24403,6 +24415,18 @@ TEST_F(WebSocketIntegrationTest, SubProtocolNoMatch) {
client.close();
}
TEST_F(WebSocketIntegrationTest, SubProtocolSelectorReturnsUnoffered) {
Headers headers = {{"Sec-WebSocket-Protocol", "chat"}};
ws::WebSocketClient client("ws://localhost:" + std::to_string(port_) +
"/ws-subprotocol-unoffered",
headers);
ASSERT_TRUE(client.connect());
EXPECT_TRUE(client.subprotocol().empty());
client.close();
}
TEST_F(WebSocketIntegrationTest, SubProtocolNotRequested) {
// Connect without requesting any subprotocol
ws::WebSocketClient client("ws://localhost:" + std::to_string(port_) +