@@ -231,6 +231,7 @@ using socket_t = int;
231
231
#include < string>
232
232
#include < sys/stat.h>
233
233
#include < thread>
234
+ #include < type_traits>
234
235
#include < unordered_map>
235
236
#include < unordered_set>
236
237
#include < utility>
@@ -871,8 +872,13 @@ class Server {
871
872
Server &set_default_file_mimetype (const std::string &mime);
872
873
Server &set_file_request_handler (Handler handler);
873
874
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
+
876
882
Server &set_exception_handler (ExceptionHandler handler);
877
883
Server &set_pre_routing_handler (HandlerWithResponse handler);
878
884
Server &set_post_routing_handler (Handler handler);
@@ -934,6 +940,9 @@ class Server {
934
940
size_t payload_max_length_ = CPPHTTPLIB_PAYLOAD_MAX_LENGTH;
935
941
936
942
private:
943
+ Server &set_error_handler_impl (HandlerWithResponse handler, std::true_type);
944
+ Server &set_error_handler_impl (Handler handler, std::false_type);
945
+
937
946
using Handlers =
938
947
std::vector<std::pair<std::unique_ptr<detail::MatcherBase>, Handler>>;
939
948
using HandlersForContentReader =
@@ -5808,12 +5817,14 @@ inline Server &Server::set_file_request_handler(Handler handler) {
5808
5817
return *this ;
5809
5818
}
5810
5819
5811
- inline Server &Server::set_error_handler (HandlerWithResponse handler) {
5820
+ inline Server &Server::set_error_handler_impl (HandlerWithResponse handler,
5821
+ std::true_type) {
5812
5822
error_handler_ = std::move (handler);
5813
5823
return *this ;
5814
5824
}
5815
5825
5816
- inline Server &Server::set_error_handler (Handler handler) {
5826
+ inline Server &Server::set_error_handler_impl (Handler handler,
5827
+ std::false_type) {
5817
5828
error_handler_ = [handler](const Request &req, Response &res) {
5818
5829
handler (req, res);
5819
5830
return HandlerResponse::Handled;
0 commit comments