From 986a20fb7d368115324c6c456961dbdafdf5c0bf Mon Sep 17 00:00:00 2001 From: yhirose Date: Fri, 17 Jan 2025 17:37:07 -0500 Subject: [PATCH] Resolve #2017 (#2022) * Resolve #2017 * Fix warning * Update README --- README.md | 15 +++++++++++++++ httplib.h | 8 +++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6165702..2c569c7 100644 --- a/README.md +++ b/README.md @@ -125,6 +125,21 @@ int main(void) res.set_content(req.body, "text/plain"); }); + // If the handler takes time to finish, you can also poll the connection state + svr.Get("/task", [&](const Request& req, Response& res) { + const char * result = nullptr; + process.run(); // for example, starting an external process + while (result == nullptr) { + sleep(1); + if (req.is_connection_closed()) { + process.kill(); // kill the process + return; + } + result = process.stdout(); // != nullptr if the process finishes + } + res.set_content(result, "text/plain"); + }); + svr.Get("/stop", [&](const Request& req, Response& res) { svr.stop(); }); diff --git a/httplib.h b/httplib.h index c5c8f3f..2ec2c9e 100644 --- a/httplib.h +++ b/httplib.h @@ -628,6 +628,7 @@ struct Request { Ranges ranges; Match matches; std::unordered_map path_params; + std::function is_connection_closed = []() { return true; }; // for client ResponseHandler response_handler; @@ -2572,7 +2573,7 @@ inline bool is_field_content(const std::string &s) { inline bool is_field_value(const std::string &s) { return is_field_content(s); } -}; // namespace fields +} // namespace fields } // namespace detail @@ -7217,6 +7218,11 @@ Server::process_request(Stream &strm, const std::string &remote_addr, } } + // Setup `is_connection_closed` method + req.is_connection_closed = [&]() { + return !detail::is_socket_alive(strm.socket()); + }; + // Routing auto routed = false; #ifdef CPPHTTPLIB_NO_EXCEPTIONS