Browse Source

Added 'set_keep_alive_max_count' method on Server

yhirose 7 years ago
parent
commit
5a78e1c457
1 changed files with 21 additions and 12 deletions
  1. 21 12
      httplib.h

+ 21 - 12
httplib.h

@@ -77,7 +77,6 @@ typedef int socket_t;
 /*
  * Configuration
  */
-#define CPPHTTPLIB_KEEPALIVE_MAX_COUNT 5
 #define CPPHTTPLIB_KEEPALIVE_TIMEOUT_SECOND 5
 #define CPPHTTPLIB_KEEPALIVE_TIMEOUT_USECOND 0
 
@@ -207,6 +206,8 @@ public:
     void set_error_handler(Handler handler);
     void set_logger(Logger logger);
 
+    void set_keep_alive_max_count(size_t count);
+
     int bind_to_any_port(const char* host, int socket_flags = 0);
     bool listen_after_bind();
 
@@ -218,6 +219,8 @@ public:
 protected:
     bool process_request(Stream& strm, bool last_connection, bool& connection_close);
 
+    size_t keep_alive_max_count_;
+
 private:
     typedef std::vector<std::pair<std::regex, Handler>> Handlers;
 
@@ -493,12 +496,12 @@ inline bool wait_until_socket_is_ready(socket_t sock, size_t sec, size_t usec)
 }
 
 template <typename T>
-inline bool read_and_close_socket(socket_t sock, bool keep_alive, T callback)
+inline bool read_and_close_socket(socket_t sock, size_t keep_alive_max_count, T callback)
 {
     bool ret = false;
 
-    if (keep_alive) {
-        auto count = CPPHTTPLIB_KEEPALIVE_MAX_COUNT;
+    if (keep_alive_max_count > 0) {
+        auto count = keep_alive_max_count;
         while (count > 0 &&
                detail::select_read(sock,
                    CPPHTTPLIB_KEEPALIVE_TIMEOUT_SECOND,
@@ -1410,7 +1413,8 @@ inline std::string SocketStream::get_remote_addr() {
 
 // HTTP server implementation
 inline Server::Server()
-    : is_running_(false)
+    : keep_alive_max_count_(5)
+    , is_running_(false)
     , svr_sock_(INVALID_SOCKET)
     , running_threads_(0)
 {
@@ -1472,6 +1476,11 @@ inline void Server::set_logger(Logger logger)
     logger_ = logger;
 }
 
+inline void Server::set_keep_alive_max_count(size_t count)
+{
+    keep_alive_max_count_ = count;
+}
+
 inline int Server::bind_to_any_port(const char* host, int socket_flags)
 {
     return bind_internal(host, 0, socket_flags);
@@ -1822,7 +1831,7 @@ inline bool Server::read_and_close_socket(socket_t sock)
 {
     return detail::read_and_close_socket(
         sock,
-        true,
+        keep_alive_max_count_,
         [this](Stream& strm, bool last_connection, bool& connection_close) {
             return process_request(strm, last_connection, connection_close);
         });
@@ -1986,7 +1995,7 @@ inline bool Client::read_and_close_socket(socket_t sock, Request& req, Response&
 {
     return detail::read_and_close_socket(
         sock,
-        false,
+        0,
         [&](Stream& strm, bool /*last_connection*/, bool& connection_close) {
             return process_request(strm, req, res, connection_close);
         });
@@ -2133,7 +2142,7 @@ namespace detail {
 
 template <typename U, typename V, typename T>
 inline bool read_and_close_socket_ssl(
-    socket_t sock, bool keep_alive,
+    socket_t sock, size_t keep_alive_max_count,
     // TODO: OpenSSL 1.0.2 occasionally crashes...
     // The upcoming 1.1.0 is going to be thread safe.
     SSL_CTX* ctx, std::mutex& ctx_mutex,
@@ -2159,8 +2168,8 @@ inline bool read_and_close_socket_ssl(
 
     bool ret = false;
 
-    if (keep_alive) {
-        auto count = CPPHTTPLIB_KEEPALIVE_MAX_COUNT;
+    if (keep_alive_max_count > 0) {
+        auto count = keep_alive_max_count;
         while (count > 0 &&
                detail::select_read(sock,
                    CPPHTTPLIB_KEEPALIVE_TIMEOUT_SECOND,
@@ -2274,7 +2283,7 @@ inline bool SSLServer::read_and_close_socket(socket_t sock)
 {
     return detail::read_and_close_socket_ssl(
         sock,
-        true,
+        keep_alive_max_count_,
         ctx_, ctx_mutex_,
         SSL_accept,
         [](SSL* /*ssl*/) {},
@@ -2305,7 +2314,7 @@ inline bool SSLClient::is_valid() const
 inline bool SSLClient::read_and_close_socket(socket_t sock, Request& req, Response& res)
 {
     return is_valid() && detail::read_and_close_socket_ssl(
-        sock, false,
+        sock, 0,
         ctx_, ctx_mutex_,
         SSL_connect,
         [&](SSL* ssl) {