@@ -1019,12 +1019,14 @@ class HttpResponseWriter
1019
1019
inline asio::awaitable<void > toSocket (
1020
1020
auto socket,
1021
1021
std::shared_ptr<Http2Channel> ch,
1022
- std::shared_ptr<std::chrono::steady_clock::time_point> deadline)
1022
+ std::shared_ptr<std::chrono::steady_clock::time_point> deadline,
1023
+ std::chrono::seconds max_idle_time)
1023
1024
{
1024
1025
std::vector<std::shared_ptr<std::string>> vec;
1025
1026
bool force_close = false ;
1026
1027
for (;;)
1027
1028
{
1029
+ *deadline = std::chrono::steady_clock::now () + max_idle_time;
1028
1030
while (true )
1029
1031
{
1030
1032
std::variant<std::shared_ptr<std::string>, Disconnect> data;
@@ -1043,7 +1045,6 @@ inline asio::awaitable<void> toSocket(
1043
1045
auto &info_ptr = std::get<std::shared_ptr<std::string>>(data);
1044
1046
vec.emplace_back (std::move (info_ptr));
1045
1047
}
1046
- *deadline = std::chrono::steady_clock::now ();
1047
1048
}
1048
1049
1049
1050
if (vec.empty () && !force_close)
@@ -1095,19 +1096,20 @@ inline asio::awaitable<void> toSocket(
1095
1096
inline asio::awaitable<void > toH2Parse (
1096
1097
auto socket,
1097
1098
auto h2p,
1098
- std::shared_ptr<std::chrono::steady_clock::time_point> deadline)
1099
+ std::shared_ptr<std::chrono::steady_clock::time_point> deadline,
1100
+ std::chrono::seconds max_idle_time)
1099
1101
{
1100
1102
char buffer[4096 ];
1101
1103
for (;;)
1102
1104
{
1105
+ *deadline = std::chrono::steady_clock::now () + max_idle_time;
1103
1106
auto [ec, nread] = co_await socket->async_read_some (
1104
1107
asio::buffer (buffer, sizeof (buffer)),
1105
1108
asio::as_tuple (asio::use_awaitable));
1106
1109
if (ec)
1107
1110
{
1108
1111
break ;
1109
1112
}
1110
- *deadline = std::chrono::steady_clock::now ();
1111
1113
auto ret = h2p->feedRecvData (buffer, nread);
1112
1114
if (ret == -1 )
1113
1115
{
@@ -1138,20 +1140,16 @@ void shutdown(const auto &socket)
1138
1140
}
1139
1141
1140
1142
inline asio::awaitable<void > watchdog (
1141
- std::shared_ptr<std::chrono::steady_clock::time_point> deadline,
1142
- std::chrono::seconds interval)
1143
+ std::shared_ptr<std::chrono::steady_clock::time_point> deadline)
1143
1144
{
1144
1145
asio::steady_timer timer (co_await asio::this_coro::executor);
1145
- while (true )
1146
+
1147
+ auto now = std::chrono::steady_clock::now ();
1148
+ while (*deadline > now)
1146
1149
{
1147
- timer.expires_at (std::chrono::steady_clock::now () + interval );
1150
+ timer.expires_at (*deadline );
1148
1151
co_await timer.async_wait (asio::as_tuple (asio::use_awaitable));
1149
- auto now = std::chrono::steady_clock::now ();
1150
- if (now - *deadline >= interval)
1151
- {
1152
- SIMPLE_HTTP_INFO_LOG (" timeout" );
1153
- break ;
1154
- }
1152
+ now = std::chrono::steady_clock::now ();
1155
1153
}
1156
1154
co_return ;
1157
1155
}
@@ -1423,9 +1421,9 @@ class HttpServer final
1423
1421
}
1424
1422
auto deadline = std::make_shared<std::chrono::steady_clock::time_point>(
1425
1423
std::chrono::steady_clock::now ());
1426
- co_await (toH2Parse (socket, h2p, deadline) ||
1427
- toSocket (socket, ch, deadline) ||
1428
- watchdog (deadline, m_cfg. max_idle_time ));
1424
+ co_await (toH2Parse (socket, h2p, deadline, m_cfg. max_idle_time ) ||
1425
+ toSocket (socket, ch, deadline, m_cfg. max_idle_time ) ||
1426
+ watchdog (deadline));
1429
1427
shutdown (socket);
1430
1428
}
1431
1429
@@ -1465,9 +1463,9 @@ class HttpServer final
1465
1463
}
1466
1464
auto deadline = std::make_shared<std::chrono::steady_clock::time_point>(
1467
1465
std::chrono::steady_clock::now ());
1468
- co_await (toH2Parse (socket, h2p, deadline) ||
1469
- toSocket (socket, ch, deadline) ||
1470
- watchdog (deadline, m_cfg. max_idle_time ));
1466
+ co_await (toH2Parse (socket, h2p, deadline, m_cfg. max_idle_time ) ||
1467
+ toSocket (socket, ch, deadline, m_cfg. max_idle_time ) ||
1468
+ watchdog (deadline));
1471
1469
shutdown (socket);
1472
1470
}
1473
1471
@@ -1476,11 +1474,14 @@ class HttpServer final
1476
1474
std::shared_ptr<Http2Parse> h2p,
1477
1475
Version version)
1478
1476
{
1479
- auto recv_request = [this ](auto socket,
1480
- auto h2p,
1481
- auto deadline) -> asio::awaitable<void > {
1477
+ auto recv_request =
1478
+ [this ](auto socket,
1479
+ auto h2p,
1480
+ auto deadline,
1481
+ auto max_idle_time) -> asio::awaitable<void > {
1482
1482
for (;;)
1483
1483
{
1484
+ *deadline = std::chrono::steady_clock::now () + max_idle_time;
1484
1485
beast::flat_buffer buffer;
1485
1486
http::request<http::string_body> req;
1486
1487
auto [ec, count] = co_await http::async_read (
@@ -1489,7 +1490,6 @@ class HttpServer final
1489
1490
{
1490
1491
co_return ;
1491
1492
}
1492
- *deadline = std::chrono::steady_clock::now ();
1493
1493
auto version =
1494
1494
(req.version () == 11 ? Version::Http11 : Version::Http1);
1495
1495
callHandler (m_handler_functions,
@@ -1503,16 +1503,17 @@ class HttpServer final
1503
1503
auto send_response = [](auto socket,
1504
1504
auto http1_ch,
1505
1505
Version version,
1506
- auto deadline) -> asio::awaitable<void > {
1506
+ auto deadline,
1507
+ auto max_idle_time) -> asio::awaitable<void > {
1507
1508
for (;;)
1508
1509
{
1510
+ *deadline = std::chrono::steady_clock::now () + max_idle_time;
1509
1511
auto [ec, h1_rsp] = co_await http1_ch->async_receive (
1510
1512
asio::as_tuple (asio::use_awaitable));
1511
1513
if (ec)
1512
1514
{
1513
1515
break ;
1514
1516
}
1515
- *deadline = std::chrono::steady_clock::now ();
1516
1517
if (std::holds_alternative<std::string>(h1_rsp))
1517
1518
{
1518
1519
auto &body = std::get<std::string>(h1_rsp);
@@ -1551,9 +1552,11 @@ class HttpServer final
1551
1552
};
1552
1553
auto deadline = std::make_shared<std::chrono::steady_clock::time_point>(
1553
1554
std::chrono::steady_clock::now ());
1554
- co_await (recv_request (socket, h2p, deadline) ||
1555
- send_response (socket, http1_ch, version, deadline) ||
1556
- watchdog (deadline, m_cfg.max_idle_time ));
1555
+ co_await (
1556
+ recv_request (socket, h2p, deadline, m_cfg.max_idle_time ) ||
1557
+ send_response (
1558
+ socket, http1_ch, version, deadline, m_cfg.max_idle_time ) ||
1559
+ watchdog (deadline));
1557
1560
shutdown (socket);
1558
1561
co_return ;
1559
1562
}
@@ -2067,10 +2070,15 @@ class HttpsClient final : public HttpClient,
2067
2070
auto deadline =
2068
2071
std::make_shared<std::chrono::steady_clock::time_point>(
2069
2072
std::chrono::steady_clock::now ());
2070
- co_await (toH2Parse (socket, sp, deadline) ||
2071
- toSocket (socket, h2_channel, deadline) ||
2072
- sp->forwardRequest () ||
2073
- watchdog (deadline, std::chrono::seconds (timeout)));
2073
+ co_await (toH2Parse (socket,
2074
+ sp,
2075
+ deadline,
2076
+ std::chrono::seconds (timeout)) ||
2077
+ toSocket (socket,
2078
+ h2_channel,
2079
+ deadline,
2080
+ std::chrono::seconds (timeout)) ||
2081
+ sp->forwardRequest () || watchdog (deadline));
2074
2082
sp->m_connected = false ;
2075
2083
// disconnect
2076
2084
for (auto &[id, rsp] : sp->m_streams )
0 commit comments