From 24e93ecd6766fec3280228c91f31ec05a55647a1 Mon Sep 17 00:00:00 2001 From: Marcin Siodelski Date: Wed, 13 Jun 2018 22:53:14 +0200 Subject: [PATCH] [5649] Manage HTTP connection timeout for progressing transaction. --- src/lib/http/connection.cc | 22 +++++++++++++--------- src/lib/http/connection.h | 2 -- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/lib/http/connection.cc b/src/lib/http/connection.cc index 6f10a8538a..4be0663a87 100644 --- a/src/lib/http/connection.cc +++ b/src/lib/http/connection.cc @@ -44,7 +44,6 @@ HttpConnection:: HttpConnection(asiolink::IOService& io_service, const long request_timeout, const long idle_timeout) : request_timer_(io_service), - request_timer_setup_(false), request_timeout_(request_timeout), idle_timeout_(idle_timeout), socket_(io_service), @@ -65,7 +64,6 @@ HttpConnection::~HttpConnection() { void HttpConnection::close() { - request_timer_setup_ = false; request_timer_.cancel(); socket_.close(); } @@ -199,6 +197,9 @@ HttpConnection::socketReadCallback(boost::system::error_code ec, size_t length) } } + // Receiving is in progress, so push back the timeout. + setupRequestTimer(); + if (length != 0) { LOG_DEBUG(http_logger, isc::log::DBGLVL_TRACE_DETAIL_DATA, HTTP_DATA_RECEIVED) @@ -271,11 +272,18 @@ HttpConnection::socketWriteCallback(boost::system::error_code ec, size_t length) // We got EWOULDBLOCK or EAGAIN which indicate that we may be able to // read something from the socket on the next attempt. } else { + // Sending is in progress, so push back the timeout. + setupRequestTimer(); + doWrite(); } } + if (length <= output_buf_.size()) { + // Sending is in progress, so push back the timeout. + setupRequestTimer(); + output_buf_.erase(0, length); doWrite(); @@ -306,17 +314,13 @@ HttpConnection::setupRequestTimer() { // because IntervalTimer already passes shared pointer to the // IntervalTimerImpl to make sure that the callback remains // valid. - if (!request_timer_setup_) { - request_timer_setup_ = true; - request_timer_.setup(boost::bind(&HttpConnection::requestTimeoutCallback, - this), - request_timeout_, IntervalTimer::ONE_SHOT); - } + request_timer_.setup(boost::bind(&HttpConnection::requestTimeoutCallback, + this), + request_timeout_, IntervalTimer::ONE_SHOT); } void HttpConnection::setupIdleTimer() { - request_timer_setup_ = false; request_timer_.setup(boost::bind(&HttpConnection::idleTimeoutCallback, this), idle_timeout_, IntervalTimer::ONE_SHOT); diff --git a/src/lib/http/connection.h b/src/lib/http/connection.h index fd387244e9..0a5b450587 100644 --- a/src/lib/http/connection.h +++ b/src/lib/http/connection.h @@ -200,8 +200,6 @@ private: /// @brief Timer used to detect Request Timeout. asiolink::IntervalTimer request_timer_; - bool request_timer_setup_; - /// @brief Configured Request Timeout in milliseconds. long request_timeout_; -- 2.47.2