From 3e906a9b8cc88ad7b54ef9a7c53c07010a6f254f Mon Sep 17 00:00:00 2001 From: yhirose Date: Thu, 30 Jul 2020 18:26:18 -0400 Subject: [PATCH] Fix #591 --- httplib.h | 2 +- test/test.cc | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/httplib.h b/httplib.h index d1a6620..3dbbc4d 100644 --- a/httplib.h +++ b/httplib.h @@ -4518,7 +4518,7 @@ inline bool ClientImpl::send(const Request &req, Response &res) { return handle_request(strm, req, res, close_connection); }); - if (close_connection) { stop(); } + if (close_connection || !ret) { stop(); } return ret; } diff --git a/test/test.cc b/test/test.cc index cbcc72f..22230ca 100644 --- a/test/test.cc +++ b/test/test.cc @@ -2720,6 +2720,43 @@ TEST(ExceptionTest, ThrowExceptionInHandler) { ASSERT_FALSE(svr.is_running()); } +TEST(KeepAliveTest, ReadTimeout) { + Server svr; + + svr.Get("/a", [&](const Request & /*req*/, Response &res) { + std::this_thread::sleep_for(std::chrono::seconds(2)); + res.set_content("a", "text/plain"); + }); + + svr.Get("/b", [&](const Request & /*req*/, Response &res) { + res.set_content("b", "text/plain"); + }); + + auto listen_thread = std::thread([&svr]() { svr.listen("localhost", PORT); }); + while (!svr.is_running()) { + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + } + + // Give GET time to get a few messages. + std::this_thread::sleep_for(std::chrono::seconds(1)); + + Client cli("localhost", PORT); + cli.set_keep_alive(true); + cli.set_read_timeout(1); + + auto resa = cli.Get("/a"); + ASSERT_TRUE(resa == nullptr); + + auto resb = cli.Get("/b"); + ASSERT_TRUE(resb != nullptr); + EXPECT_EQ(200, resb->status); + EXPECT_EQ("b", resb->body); + + svr.stop(); + listen_thread.join(); + ASSERT_FALSE(svr.is_running()); +} + class ServerTestWithAI_PASSIVE : public ::testing::Test { protected: ServerTestWithAI_PASSIVE()