Skip to content

Commit 2099c47

Browse files
committed
Added middleware support
1 parent 3f88a46 commit 2099c47

File tree

1 file changed

+36
-9
lines changed

1 file changed

+36
-9
lines changed

httplib.h

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -597,6 +597,7 @@ inline void default_socket_options(socket_t sock) {
597597
class Server {
598598
public:
599599
using Handler = std::function<void(const Request &, Response &)>;
600+
using HandlerWithReturn = std::function<bool(const Request &, Response &)>;
600601
using HandlerWithContentReader = std::function<void(
601602
const Request &, Response &, const ContentReader &content_reader)>;
602603
using Expect100ContinueHandler =
@@ -627,7 +628,11 @@ class Server {
627628
const char *mime);
628629
void set_file_request_handler(Handler handler);
629630

631+
void set_error_handler(HandlerWithReturn handler);
630632
void set_error_handler(Handler handler);
633+
void set_pre_routing_handler(HandlerWithReturn handler);
634+
void set_post_routing_handler(Handler handler);
635+
631636
void set_expect_100_continue_handler(Expect100ContinueHandler handler);
632637
void set_logger(Logger logger);
633638

@@ -734,7 +739,9 @@ class Server {
734739
Handlers delete_handlers_;
735740
HandlersForContentReader delete_handlers_for_content_reader_;
736741
Handlers options_handlers_;
737-
Handler error_handler_;
742+
HandlerWithReturn error_handler_;
743+
HandlerWithReturn pre_routing_handler_;
744+
Handler post_routing_handler_;
738745
Logger logger_;
739746
Expect100ContinueHandler expect_100_continue_handler_;
740747

@@ -4128,14 +4135,23 @@ inline void Server::set_file_request_handler(Handler handler) {
41284135
file_request_handler_ = std::move(handler);
41294136
}
41304137

4131-
inline void Server::set_error_handler(Handler handler) {
4138+
inline void Server::set_error_handler(HandlerWithReturn handler) {
41324139
error_handler_ = std::move(handler);
41334140
}
41344141

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+
}
41364148

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);
41394155
}
41404156

41414157
inline void Server::set_logger(Logger logger) { logger_ = std::move(logger); }
@@ -4145,6 +4161,12 @@ Server::set_expect_100_continue_handler(Expect100ContinueHandler handler) {
41454161
expect_100_continue_handler_ = std::move(handler);
41464162
}
41474163

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+
41484170
inline void Server::set_keep_alive_max_count(size_t count) {
41494171
keep_alive_max_count_ = count;
41504172
}
@@ -4236,16 +4258,15 @@ inline bool Server::write_response_core(Stream &strm, bool close_connection,
42364258
bool need_apply_ranges) {
42374259
assert(res.status != -1);
42384260

4239-
if (400 <= res.status && error_handler_) {
4240-
error_handler_(req, res);
4261+
if (400 <= res.status && error_handler_ && error_handler_(req, res)) {
42414262
need_apply_ranges = true;
42424263
}
42434264

42444265
std::string content_type;
42454266
std::string boundary;
42464267
if (need_apply_ranges) { apply_ranges(req, res, content_type, boundary); }
42474268

4248-
// Preapre additional headers
4269+
// Prepare additional headers
42494270
if (close_connection || req.get_header_value("Connection") == "close") {
42504271
res.set_header("Connection", "close");
42514272
} else {
@@ -4269,6 +4290,8 @@ inline bool Server::write_response_core(Stream &strm, bool close_connection,
42694290
res.set_header("Accept-Ranges", "bytes");
42704291
}
42714292

4293+
if (post_routing_handler_) { post_routing_handler_(req, res); }
4294+
42724295
// Response line and headers
42734296
{
42744297
detail::BufferStream bstrm;
@@ -4572,6 +4595,10 @@ inline bool Server::listen_internal() {
45724595
}
45734596

45744597
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+
45754602
// File handler
45764603
bool is_head_request = req.method == "HEAD";
45774604
if ((req.method == "GET" || is_head_request) &&
@@ -5270,7 +5297,7 @@ inline bool ClientImpl::write_content_with_provider(Stream &strm,
52705297

52715298
inline bool ClientImpl::write_request(Stream &strm, const Request &req,
52725299
bool close_connection, Error &error) {
5273-
// Prepare additonal headers
5300+
// Prepare additional headers
52745301
Headers headers;
52755302
if (close_connection) { headers.emplace("Connection", "close"); }
52765303

0 commit comments

Comments
 (0)