mirror of
https://github.com/yhirose/cpp-httplib.git
synced 2026-10-20 11:29:38 +00:00
Bring the READMEs and the docs pages (en and ja) in line with the current header: - Fix the client sample that does not compile, the Transfer-Encoding statement for default headers, the verifier callback comment, the thread pool spawn rule, the sanitize_filename description, and the inverted Accept-Encoding sentence. - Describe recent behaviour: TLS errors behind Read/Write failures, Host validation, Connection: close for a body without length, content_reader rules, refused CONNECT, WebSocketClient proxies, CPPHTTPLIB_INTERIM_RESPONSE_MAX_COUNT, the SSE event size limit, and the payload limit of the Stream API. - Complete the API references of WebSocket, WebSocketClient and the stream:: helpers, and the SSE reconnect rules. - Fix cookbook pages: keychain loading on every backend, received Close status, a multipart sample that trusted the client's file name, an echo sample that sent binary as text, SNI, pre-request handler scope, stop() with WebSocket handlers, and the thread pool notes. - Restore the mutex in the LLM app's Chapter 5 code.
55 lines
2.1 KiB
Markdown
55 lines
2.1 KiB
Markdown
---
|
|
title: "S09. Add Pre-Processing to All Routes"
|
|
order: 28
|
|
status: "draft"
|
|
---
|
|
|
|
Sometimes you want the same logic to run before every request — auth checks, logging, rate limiting. Register those with `set_pre_routing_handler()`.
|
|
|
|
## Basic usage
|
|
|
|
```cpp
|
|
svr.set_pre_routing_handler(
|
|
[](const httplib::Request &req, httplib::Response &res) {
|
|
std::cout << req.method << " " << req.path << std::endl;
|
|
return httplib::Server::HandlerResponse::Unhandled;
|
|
});
|
|
```
|
|
|
|
The pre-routing handler runs **before routing**. It catches every request — including ones that don't match any handler. The exception is a request rejected while its request line and headers are parsed (400 for a malformed request, 414 for an overlong URI, 416 for a malformed `Range`); the server answers those before this handler runs.
|
|
|
|
The `HandlerResponse` return value is key:
|
|
|
|
- Return `Unhandled` → continue normally (routing and the actual handler run)
|
|
- Return `Handled` → the response is considered complete, skip the rest
|
|
|
|
## Use it for authentication
|
|
|
|
Put your shared auth check in one place.
|
|
|
|
```cpp
|
|
svr.set_pre_routing_handler(
|
|
[](const httplib::Request &req, httplib::Response &res) {
|
|
if (req.path.rfind("/public", 0) == 0) {
|
|
return httplib::Server::HandlerResponse::Unhandled; // no auth needed
|
|
}
|
|
|
|
auto auth = req.get_header_value("Authorization");
|
|
if (auth.empty()) {
|
|
res.status = 401;
|
|
res.set_content("unauthorized", "text/plain");
|
|
return httplib::Server::HandlerResponse::Handled;
|
|
}
|
|
|
|
return httplib::Server::HandlerResponse::Unhandled;
|
|
});
|
|
```
|
|
|
|
If auth fails, return `Handled` to respond with 401 immediately. If it passes, return `Unhandled` and let routing take over.
|
|
|
|
## For per-route auth
|
|
|
|
If you want different auth rules per route rather than a single global check, `set_pre_request_handler()` is a better fit. See [S11. Authenticate per route with a pre-request handler](../s11-pre-request).
|
|
|
|
> **Note:** If all you want is to modify the response, `set_post_routing_handler()` is the right tool. See [S10. Add response headers with a post-routing handler](../s10-post-routing).
|