@@ -231,6 +231,7 @@ using socket_t = int;
231231#include < string>
232232#include < sys/stat.h>
233233#include < thread>
234+ #include < type_traits>
234235#include < unordered_map>
235236#include < unordered_set>
236237#include < utility>
@@ -871,8 +872,13 @@ class Server {
871872 Server &set_default_file_mimetype (const std::string &mime);
872873 Server &set_file_request_handler (Handler handler);
873874
874- Server &set_error_handler (HandlerWithResponse handler);
875- Server &set_error_handler (Handler handler);
875+ template <class ErrorHandlerFunc >
876+ Server &set_error_handler (ErrorHandlerFunc &&handler) {
877+ return set_error_handler_impl (
878+ std::forward<ErrorHandlerFunc>(handler),
879+ std::is_convertible<ErrorHandlerFunc, HandlerWithResponse>{});
880+ }
881+
876882 Server &set_exception_handler (ExceptionHandler handler);
877883 Server &set_pre_routing_handler (HandlerWithResponse handler);
878884 Server &set_post_routing_handler (Handler handler);
@@ -934,6 +940,9 @@ class Server {
934940 size_t payload_max_length_ = CPPHTTPLIB_PAYLOAD_MAX_LENGTH;
935941
936942private:
943+ Server &set_error_handler_impl (HandlerWithResponse handler, std::true_type);
944+ Server &set_error_handler_impl (Handler handler, std::false_type);
945+
937946 using Handlers =
938947 std::vector<std::pair<std::unique_ptr<detail::MatcherBase>, Handler>>;
939948 using HandlersForContentReader =
@@ -5797,12 +5806,14 @@ inline Server &Server::set_file_request_handler(Handler handler) {
57975806 return *this ;
57985807}
57995808
5800- inline Server &Server::set_error_handler (HandlerWithResponse handler) {
5809+ inline Server &Server::set_error_handler_impl (HandlerWithResponse handler,
5810+ std::true_type) {
58015811 error_handler_ = std::move (handler);
58025812 return *this ;
58035813}
58045814
5805- inline Server &Server::set_error_handler (Handler handler) {
5815+ inline Server &Server::set_error_handler_impl (Handler handler,
5816+ std::false_type) {
58065817 error_handler_ = [handler](const Request &req, Response &res) {
58075818 handler (req, res);
58085819 return HandlerResponse::Handled;
0 commit comments