mirror of
https://github.com/yhirose/cpp-httplib.git
synced 2026-10-14 10:29:35 +00:00
Run pre_request_handler for WebSocket routes
The WebSocket upgrade path matched the route and switched protocols without setting req.matched_route or calling pre_request_handler, so a check placed there (e.g. authentication) never ran for WebSocket routes. Set matched_route and run the handler before the upgrade; if it handles the request, reply with a regular HTTP response instead of 101. Also write rejected upgrade responses (from pre_routing_handler too) with write_response_with_content, so they carry Content-Length. Without it, a client reading the body waited until the keep-alive timeout.
This commit is contained in:
1 parent
deb520e26b
commit
4cb363e3f2
2 files changed
+89
-4
No files matched your search
@@ -14411,18 +14411,25 @@ Server::process_request(Stream &strm, const std::string &remote_addr,
|
||||
};
|
||||
|
||||
// WebSocket upgrade
|
||||
// Check pre_routing_handler_ before upgrading so that authentication
|
||||
// and other middleware can reject the request with an HTTP response
|
||||
// (e.g., 401) before the protocol switches.
|
||||
// Run pre_routing_handler_ and pre_request_handler_ before upgrading so
|
||||
// that authentication and other middleware can reject the request with an
|
||||
// HTTP response (e.g., 401) before the protocol switches.
|
||||
if (detail::is_websocket_upgrade(req)) {
|
||||
if (pre_routing_handler_ &&
|
||||
pre_routing_handler_(req, res) == HandlerResponse::Handled) {
|
||||
if (res.status == -1) { res.status = StatusCode::OK_200; }
|
||||
return write_response(strm, close_connection, req, res);
|
||||
return write_response_with_content(strm, close_connection, req, res);
|
||||
}
|
||||
// Find matching WebSocket handler
|
||||
for (const auto &entry : websocket_handlers_) {
|
||||
if (entry.matcher->match(req)) {
|
||||
req.matched_route = entry.matcher->pattern();
|
||||
if (pre_request_handler_ &&
|
||||
pre_request_handler_(req, res) == HandlerResponse::Handled) {
|
||||
if (res.status == -1) { res.status = StatusCode::OK_200; }
|
||||
return write_response_with_content(strm, close_connection, req, res);
|
||||
}
|
||||
|
||||
// Compute accept key
|
||||
auto client_key = req.get_header_value("Sec-WebSocket-Key");
|
||||
auto accept_key = detail::websocket_accept_key(client_key);
|
||||
|
||||
Reference in new issue
Block a user