diff --git a/httplib.h b/httplib.h index 0509d92..698849c 100644 --- a/httplib.h +++ b/httplib.h @@ -231,6 +231,7 @@ using socket_t = int; #include #include #include +#include #include #include #include @@ -871,8 +872,13 @@ public: Server &set_default_file_mimetype(const std::string &mime); Server &set_file_request_handler(Handler handler); - Server &set_error_handler(HandlerWithResponse handler); - Server &set_error_handler(Handler handler); + template + Server &set_error_handler(ErrorHandlerFunc &&handler) { + return set_error_handler_impl( + std::forward(handler), + std::is_convertible{}); + } + Server &set_exception_handler(ExceptionHandler handler); Server &set_pre_routing_handler(HandlerWithResponse handler); Server &set_post_routing_handler(Handler handler); @@ -934,6 +940,9 @@ protected: size_t payload_max_length_ = CPPHTTPLIB_PAYLOAD_MAX_LENGTH; private: + Server &set_error_handler_impl(HandlerWithResponse handler, std::true_type); + Server &set_error_handler_impl(Handler handler, std::false_type); + using Handlers = std::vector, Handler>>; using HandlersForContentReader = @@ -5808,12 +5817,14 @@ inline Server &Server::set_file_request_handler(Handler handler) { return *this; } -inline Server &Server::set_error_handler(HandlerWithResponse handler) { +inline Server &Server::set_error_handler_impl(HandlerWithResponse handler, + std::true_type) { error_handler_ = std::move(handler); return *this; } -inline Server &Server::set_error_handler(Handler handler) { +inline Server &Server::set_error_handler_impl(Handler handler, + std::false_type) { error_handler_ = [handler](const Request &req, Response &res) { handler(req, res); return HandlerResponse::Handled;