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.
1.7 KiB
title, order, status
| title | order | status |
|---|---|---|
| S13. Return a Custom Error Page | 32 | draft |
To customize the response for 4xx or 5xx errors, use set_error_handler(). By default, an error response has an empty body; an error handler lets you fill it with your own HTML or JSON.
Basic usage
svr.set_error_handler([](const httplib::Request &req, httplib::Response &res) {
auto body = "<h1>Error " + std::to_string(res.status) + "</h1>";
res.set_content(body, "text/html");
});
The error handler runs right before an error response is sent — any time res.status is 4xx or 5xx. Replace the body with res.set_content() and every error response uses the same template.
Branch by status code
svr.set_error_handler([](const httplib::Request &req, httplib::Response &res) {
if (res.status == 404) {
res.set_content("<h1>Not Found</h1><p>" + req.path + "</p>", "text/html");
} else if (res.status >= 500) {
res.set_content("<h1>Server Error</h1>", "text/html");
}
});
Checking res.status lets you show a custom message for 404s and a "contact support" link for 5xx errors.
JSON error responses
For an API server, you probably want errors as JSON.
svr.set_error_handler([](const httplib::Request &req, httplib::Response &res) {
nlohmann::json j = {
{"error", true},
{"status", res.status},
{"path", req.path},
};
res.set_content(j.dump(), "application/json");
});
Now every error comes back in a consistent JSON shape.
Note:
set_error_handler()also fires for 500 responses caused by exceptions thrown from a route handler. To get at the exception itself, combine it withset_exception_handler(). See S14. Catch exceptions.