@@ -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
@@ -4128,14 +4135,23 @@ inline void Server::set_file_request_handler(Handler handler) {
4128
4135
file_request_handler_ = std::move (handler);
4129
4136
}
4130
4137
4131
- inline void Server::set_error_handler (Handler handler) {
4138
+ inline void Server::set_error_handler (HandlerWithReturn handler) {
4132
4139
error_handler_ = std::move (handler);
4133
4140
}
4134
4141
4135
- inline void Server::set_tcp_nodelay (bool on) { tcp_nodelay_ = on; }
4142
+ inline void Server::set_error_handler (Handler handler) {
4143
+ error_handler_ = [handler](const Request &req, Response &res) {
4144
+ handler (req, res);
4145
+ return true ;
4146
+ };
4147
+ }
4136
4148
4137
- inline void Server::set_socket_options (SocketOptions socket_options) {
4138
- socket_options_ = std::move (socket_options);
4149
+ inline void Server::set_pre_routing_handler (HandlerWithReturn handler) {
4150
+ pre_routing_handler_ = std::move (handler);
4151
+ }
4152
+
4153
+ inline void Server::set_post_routing_handler (Handler handler) {
4154
+ post_routing_handler_ = std::move (handler);
4139
4155
}
4140
4156
4141
4157
inline void Server::set_logger (Logger logger) { logger_ = std::move (logger); }
@@ -4145,6 +4161,12 @@ Server::set_expect_100_continue_handler(Expect100ContinueHandler handler) {
4145
4161
expect_100_continue_handler_ = std::move (handler);
4146
4162
}
4147
4163
4164
+ inline void Server::set_tcp_nodelay (bool on) { tcp_nodelay_ = on; }
4165
+
4166
+ inline void Server::set_socket_options (SocketOptions socket_options) {
4167
+ socket_options_ = std::move (socket_options);
4168
+ }
4169
+
4148
4170
inline void Server::set_keep_alive_max_count (size_t count) {
4149
4171
keep_alive_max_count_ = count;
4150
4172
}
@@ -4236,16 +4258,15 @@ inline bool Server::write_response_core(Stream &strm, bool close_connection,
4236
4258
bool need_apply_ranges) {
4237
4259
assert (res.status != -1 );
4238
4260
4239
- if (400 <= res.status && error_handler_) {
4240
- error_handler_ (req, res);
4261
+ if (400 <= res.status && error_handler_ && error_handler_ (req, res)) {
4241
4262
need_apply_ranges = true ;
4242
4263
}
4243
4264
4244
4265
std::string content_type;
4245
4266
std::string boundary;
4246
4267
if (need_apply_ranges) { apply_ranges (req, res, content_type, boundary); }
4247
4268
4248
- // Preapre additional headers
4269
+ // Prepare additional headers
4249
4270
if (close_connection || req.get_header_value (" Connection" ) == " close" ) {
4250
4271
res.set_header (" Connection" , " close" );
4251
4272
} else {
@@ -4269,6 +4290,8 @@ inline bool Server::write_response_core(Stream &strm, bool close_connection,
4269
4290
res.set_header (" Accept-Ranges" , " bytes" );
4270
4291
}
4271
4292
4293
+ if (post_routing_handler_) { post_routing_handler_ (req, res); }
4294
+
4272
4295
// Response line and headers
4273
4296
{
4274
4297
detail::BufferStream bstrm;
@@ -4572,6 +4595,10 @@ inline bool Server::listen_internal() {
4572
4595
}
4573
4596
4574
4597
inline bool Server::routing (Request &req, Response &res, Stream &strm) {
4598
+ if (pre_routing_handler_ && pre_routing_handler_ (req, res)) {
4599
+ return true ;
4600
+ }
4601
+
4575
4602
// File handler
4576
4603
bool is_head_request = req.method == " HEAD" ;
4577
4604
if ((req.method == " GET" || is_head_request) &&
@@ -5270,7 +5297,7 @@ inline bool ClientImpl::write_content_with_provider(Stream &strm,
5270
5297
5271
5298
inline bool ClientImpl::write_request (Stream &strm, const Request &req,
5272
5299
bool close_connection, Error &error) {
5273
- // Prepare additonal headers
5300
+ // Prepare additional headers
5274
5301
Headers headers;
5275
5302
if (close_connection) { headers.emplace (" Connection" , " close" ); }
5276
5303
0 commit comments