From 52c021ee0b0c6ad2128ed550c694aad0d11d4c3f Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 21 Apr 2024 16:53:22 +0200 Subject: Adding upstream version 2.5.7. Signed-off-by: Daniel Baumann --- src/lib/http/connection_pool.h | 77 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 src/lib/http/connection_pool.h (limited to 'src/lib/http/connection_pool.h') diff --git a/src/lib/http/connection_pool.h b/src/lib/http/connection_pool.h new file mode 100644 index 0000000..ab6a7cf --- /dev/null +++ b/src/lib/http/connection_pool.h @@ -0,0 +1,77 @@ +// Copyright (C) 2017-2024 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#ifndef HTTP_CONNECTION_POOL_H +#define HTTP_CONNECTION_POOL_H + +#include + +#include +#include + +namespace isc { +namespace http { + +/// @brief Pool of active HTTP connections. +/// +/// The HTTP server is designed to handle many connections simultaneously. +/// The communication between the client and the server may take long time +/// and the server must be able to react on other events while the communication +/// with the clients is in progress. Thus, the server must track active +/// connections and gracefully close them when needed. An obvious case when the +/// connections must be terminated by the server is when the shutdown signal +/// is received. +/// +/// This object is a simple container for the server connections which provides +/// means to terminate them on request. +class HttpConnectionPool { +public: + + /// @brief Start new connection. + /// + /// The connection is inserted to the pool and the + /// @ref HttpConnection::asyncAccept is invoked. + /// + /// @param connection Pointer to the new connection. + void start(const HttpConnectionPtr& connection); + + /// @brief Removes a connection from the pool and shutdown it. + /// + /// Shutdown is specific to TLS and is a first part of graceful close (note it is + /// NOT the same as TCP shutdown system call). + /// + /// @note if the TLS connection stalls e.g. the peer does not try I/O + /// on it the connection has to be explicitly stopped. + /// + /// @param connection Pointer to the connection. + void shutdown(const HttpConnectionPtr& connection); + + /// @brief Removes a connection from the pool and stops it. + /// + /// @param connection Pointer to the connection. + void stop(const HttpConnectionPtr& connection); + + /// @brief Stops all connections and removes them from the pool. + void stopAll(); + +protected: + + /// @brief Stops all connections and removes them from the pool. + /// + /// Must be called from with a thread-safe context. + void stopAllInternal(); + + /// @brief Set of connections. + std::list connections_; + + /// @brief Mutex to protect the internal state. + std::mutex mutex_; +}; + +} +} + +#endif -- cgit v1.2.3