This commit is contained in:
yhirose 2022-11-27 10:05:30 -05:00
parent 5758769ad3
commit 9d0a9d4e23
2 changed files with 30 additions and 8 deletions

View file

@ -5855,7 +5855,16 @@ Server::process_request(Stream &strm, bool close_connection,
routed = true; routed = true;
} else { } else {
res.status = 500; res.status = 500;
res.set_header("EXCEPTION_WHAT", e.what()); std::string val;
auto s = e.what();
for (size_t i = 0; s[i]; i++) {
switch (s[i]) {
case '\r': val += "\\r"; break;
case '\n': val += "\\n"; break;
default: val += s[i]; break;
}
}
res.set_header("EXCEPTION_WHAT", val);
} }
} catch (...) { } catch (...) {
if (exception_handler_) { if (exception_handler_) {

View file

@ -3839,9 +3839,12 @@ TEST(MountTest, Unmount) {
TEST(ExceptionTest, ThrowExceptionInHandler) { TEST(ExceptionTest, ThrowExceptionInHandler) {
Server svr; Server svr;
svr.Get("/hi", [&](const Request & /*req*/, Response & /*res*/) { svr.Get("/exception", [&](const Request & /*req*/, Response & /*res*/) {
throw std::runtime_error("exception..."); throw std::runtime_error("exception...");
// res.set_content("Hello World!", "text/plain"); });
svr.Get("/unknown", [&](const Request & /*req*/, Response & /*res*/) {
throw std::runtime_error("exception\r\n...");
}); });
auto listen_thread = std::thread([&svr]() { svr.listen("localhost", PORT); }); auto listen_thread = std::thread([&svr]() { svr.listen("localhost", PORT); });
@ -3854,11 +3857,21 @@ TEST(ExceptionTest, ThrowExceptionInHandler) {
Client cli("localhost", PORT); Client cli("localhost", PORT);
auto res = cli.Get("/hi"); {
ASSERT_TRUE(res); auto res = cli.Get("/exception");
EXPECT_EQ(500, res->status); ASSERT_TRUE(res);
ASSERT_TRUE(res->has_header("EXCEPTION_WHAT")); EXPECT_EQ(500, res->status);
EXPECT_EQ("exception...", res->get_header_value("EXCEPTION_WHAT")); ASSERT_TRUE(res->has_header("EXCEPTION_WHAT"));
EXPECT_EQ("exception...", res->get_header_value("EXCEPTION_WHAT"));
}
{
auto res = cli.Get("/unknown");
ASSERT_TRUE(res);
EXPECT_EQ(500, res->status);
ASSERT_TRUE(res->has_header("EXCEPTION_WHAT"));
EXPECT_EQ("exception\\r\\n...", res->get_header_value("EXCEPTION_WHAT"));
}
svr.stop(); svr.stop();
listen_thread.join(); listen_thread.join();