@@ -597,6 +597,7 @@ inline void default_socket_options(socket_t sock) {
597
597
class Server {
598
598
public:
599
599
using Handler = std::function<void (const Request &, Response &)>;
600
+ using HandlerWithReturn = std::function<bool (const Request &, Response &)>;
600
601
using HandlerWithContentReader = std::function<void (
601
602
const Request &, Response &, const ContentReader &content_reader)>;
602
603
using Expect100ContinueHandler =
@@ -627,7 +628,11 @@ class Server {
627
628
const char *mime);
628
629
void set_file_request_handler (Handler handler);
629
630
631
+ void set_error_handler (HandlerWithReturn handler);
630
632
void set_error_handler (Handler handler);
633
+ void set_pre_routing_handler (HandlerWithReturn handler);
634
+ void set_post_routing_handler (Handler handler);
635
+
631
636
void set_expect_100_continue_handler (Expect100ContinueHandler handler);
632
637
void set_logger (Logger logger);
633
638
@@ -734,7 +739,9 @@ class Server {
734
739
Handlers delete_handlers_;
735
740
HandlersForContentReader delete_handlers_for_content_reader_;
736
741
Handlers options_handlers_;
737
- Handler error_handler_;
742
+ HandlerWithReturn error_handler_;
743
+ HandlerWithReturn pre_routing_handler_;
744
+ Handler post_routing_handler_;
738
745
Logger logger_;
739
746
Expect100ContinueHandler expect_100_continue_handler_;
740
747
@@ -4160,14 +4167,23 @@ inline void Server::set_file_request_handler(Handler handler) {
4160
4167
file_request_handler_ = std::move (handler);
4161
4168
}
4162
4169
4163
- inline void Server::set_error_handler (Handler handler) {
4170
+ inline void Server::set_error_handler (HandlerWithReturn handler) {
4164
4171
error_handler_ = std::move (handler);
4165
4172
}
4166
4173
4167
- inline void Server::set_tcp_nodelay (bool on) { tcp_nodelay_ = on; }
4174
+ inline void Server::set_error_handler (Handler handler) {
4175
+ error_handler_ = [handler](const Request &req, Response &res) {
4176
+ handler (req, res);
4177
+ return true ;
4178
+ };
4179
+ }
4168
4180
4169
- inline void Server::set_socket_options (SocketOptions socket_options) {
4170
- socket_options_ = std::move (socket_options);
4181
+ inline void Server::set_pre_routing_handler (HandlerWithReturn handler) {
4182
+ pre_routing_handler_ = std::move (handler);
4183
+ }
4184
+
4185
+ inline void Server::set_post_routing_handler (Handler handler) {
4186
+ post_routing_handler_ = std::move (handler);
4171
4187
}
4172
4188
4173
4189
inline void Server::set_logger (Logger logger) { logger_ = std::move (logger); }
@@ -4177,6 +4193,12 @@ Server::set_expect_100_continue_handler(Expect100ContinueHandler handler) {
4177
4193
expect_100_continue_handler_ = std::move (handler);
4178
4194
}
4179
4195
4196
+ inline void Server::set_tcp_nodelay (bool on) { tcp_nodelay_ = on; }
4197
+
4198
+ inline void Server::set_socket_options (SocketOptions socket_options) {
4199
+ socket_options_ = std::move (socket_options);
4200
+ }
4201
+
4180
4202
inline void Server::set_keep_alive_max_count (size_t count) {
4181
4203
keep_alive_max_count_ = count;
4182
4204
}
@@ -4268,16 +4290,15 @@ inline bool Server::write_response_core(Stream &strm, bool close_connection,
4268
4290
bool need_apply_ranges) {
4269
4291
assert (res.status != -1 );
4270
4292
4271
- if (400 <= res.status && error_handler_) {
4272
- error_handler_ (req, res);
4293
+ if (400 <= res.status && error_handler_ && error_handler_ (req, res)) {
4273
4294
need_apply_ranges = true ;
4274
4295
}
4275
4296
4276
4297
std::string content_type;
4277
4298
std::string boundary;
4278
4299
if (need_apply_ranges) { apply_ranges (req, res, content_type, boundary); }
4279
4300
4280
- // Preapre additional headers
4301
+ // Prepare additional headers
4281
4302
if (close_connection || req.get_header_value (" Connection" ) == " close" ) {
4282
4303
res.set_header (" Connection" , " close" );
4283
4304
} else {
@@ -4301,6 +4322,8 @@ inline bool Server::write_response_core(Stream &strm, bool close_connection,
4301
4322
res.set_header (" Accept-Ranges" , " bytes" );
4302
4323
}
4303
4324
4325
+ if (post_routing_handler_) { post_routing_handler_ (req, res); }
4326
+
4304
4327
// Response line and headers
4305
4328
{
4306
4329
detail::BufferStream bstrm;
@@ -4604,6 +4627,8 @@ inline bool Server::listen_internal() {
4604
4627
}
4605
4628
4606
4629
inline bool Server::routing (Request &req, Response &res, Stream &strm) {
4630
+ if (pre_routing_handler_ && pre_routing_handler_ (req, res)) { return true ; }
4631
+
4607
4632
// File handler
4608
4633
bool is_head_request = req.method == " HEAD" ;
4609
4634
if ((req.method == " GET" || is_head_request) &&
@@ -5302,7 +5327,7 @@ inline bool ClientImpl::write_content_with_provider(Stream &strm,
5302
5327
5303
5328
inline bool ClientImpl::write_request (Stream &strm, const Request &req,
5304
5329
bool close_connection, Error &error) {
5305
- // Prepare additonal headers
5330
+ // Prepare additional headers
5306
5331
Headers headers;
5307
5332
if (close_connection) { headers.emplace (" Connection" , " close" ); }
5308
5333
0 commit comments