diff --git a/httplib.h b/httplib.h index d02e4c3..2ca8f3b 100644 --- a/httplib.h +++ b/httplib.h @@ -614,7 +614,7 @@ public: using Handler = std::function; using ExceptionHandler = - std::function; + std::function; enum class HandlerResponse { Handled, @@ -5721,15 +5721,22 @@ Server::process_request(Stream &strm, bool close_connection, routed = routing(req, res, strm); } catch (std::exception &e) { if (exception_handler_) { - exception_handler_(req, res, e); + auto ep = std::current_exception(); + exception_handler_(req, res, ep); routed = true; } else { res.status = 500; res.set_header("EXCEPTION_WHAT", e.what()); } } catch (...) { - res.status = 500; - res.set_header("EXCEPTION_WHAT", "UNKNOWN"); + if (exception_handler_) { + auto ep = std::current_exception(); + exception_handler_(req, res, ep); + routed = true; + } else { + res.status = 500; + res.set_header("EXCEPTION_WHAT", "UNKNOWN"); + } } #endif diff --git a/test/test.cc b/test/test.cc index aa1d2c8..58dc5b2 100644 --- a/test/test.cc +++ b/test/test.cc @@ -1249,8 +1249,13 @@ TEST(ExceptionHandlerTest, ContentLength) { Server svr; svr.set_exception_handler([](const Request & /*req*/, Response &res, - std::exception &e) { - EXPECT_EQ("abc", std::string(e.what())); + std::exception_ptr ep) { + EXPECT_FALSE(ep == nullptr); + try{ + std::rethrow_exception(ep); + }catch(std::exception& e){ + EXPECT_EQ("abc", std::string(e.what())); + } res.status = 500; res.set_content("abcdefghijklmnopqrstuvwxyz", "text/html"); // <= Content-Length still 13 at this point