]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[5649] Manage HTTP connection timeout for progressing transaction.
authorMarcin Siodelski <marcin@isc.org>
Wed, 13 Jun 2018 20:53:14 +0000 (22:53 +0200)
committerMarcin Siodelski <marcin@isc.org>
Wed, 13 Jun 2018 20:53:14 +0000 (22:53 +0200)
src/lib/http/connection.cc
src/lib/http/connection.h

index 6f10a8538a33dae0d6c8a5ad736a0cd437e2c3b2..4be0663a879cb13bbde4532f84e3f78da5aeafd9 100644 (file)
@@ -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);
index fd387244e98d36ce7f9a9cc04d5dbf7cddb57626..0a5b450587aaafc7cc58c3d4f2a0f0817fe574f4 100644 (file)
@@ -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_;