diff --git a/include/server.h b/include/server.h index 8572003a9..b3cd240fd 100644 --- a/include/server.h +++ b/include/server.h @@ -54,6 +54,7 @@ namespace kiwix void setAddress(const std::string& addr) { m_addr = addr; } void setPort(int port) { m_port = port; } void setNbThreads(int threads) { m_nbThreads = threads; } + void setIpConnectionLimit(int limit) { m_ipConnectionLimit = limit; } void setVerbose(bool verbose) { m_verbose = verbose; } void setIndexTemplateString(const std::string& indexTemplateString) { m_indexTemplateString = indexTemplateString; } void setTaskbar(bool withTaskbar, bool withLibraryButton) @@ -75,6 +76,7 @@ namespace kiwix bool m_withTaskbar = true; bool m_withLibraryButton = true; bool m_blockExternalLinks = false; + int m_ipConnectionLimit = 0; std::unique_ptr mp_server; }; } diff --git a/src/server.cpp b/src/server.cpp index e630515ce..52355afe7 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -49,7 +49,8 @@ bool Server::start() { m_withTaskbar, m_withLibraryButton, m_blockExternalLinks, - m_indexTemplateString)); + m_indexTemplateString, + m_ipConnectionLimit)); return mp_server->start(); } diff --git a/src/server/internalServer.cpp b/src/server/internalServer.cpp index 96fcd5f2a..ff0fea8bb 100644 --- a/src/server/internalServer.cpp +++ b/src/server/internalServer.cpp @@ -120,7 +120,8 @@ InternalServer::InternalServer(Library* library, bool withTaskbar, bool withLibraryButton, bool blockExternalLinks, - std::string indexTemplateString) : + std::string indexTemplateString, + int ipConnectionLimit) : m_addr(addr), m_port(port), m_root(normalizeRootUrl(root)), @@ -130,6 +131,7 @@ InternalServer::InternalServer(Library* library, m_withLibraryButton(withLibraryButton), m_blockExternalLinks(blockExternalLinks), m_indexTemplateString(indexTemplateString.empty() ? RESOURCE::templates::index_html : indexTemplateString), + m_ipConnectionLimit(ipConnectionLimit), mp_daemon(nullptr), mp_library(library), mp_nameMapper(nameMapper ? nameMapper : &defaultNameMapper) @@ -168,6 +170,7 @@ bool InternalServer::start() { this, MHD_OPTION_SOCK_ADDR, &sockAddr, MHD_OPTION_THREAD_POOL_SIZE, m_nbThreads, + MHD_OPTION_PER_IP_CONNECTION_LIMIT, m_ipConnectionLimit, MHD_OPTION_END); if (mp_daemon == nullptr) { std::cerr << "Unable to instantiate the HTTP daemon. The port " << m_port diff --git a/src/server/internalServer.h b/src/server/internalServer.h index 09f591f0c..f4ae08eea 100644 --- a/src/server/internalServer.h +++ b/src/server/internalServer.h @@ -55,7 +55,8 @@ class InternalServer { bool withTaskbar, bool withLibraryButton, bool blockExternalLinks, - std::string indexTemplateString); + std::string indexTemplateString, + int ipConnectionLimit); virtual ~InternalServer() = default; MHD_Result handlerCallback(struct MHD_Connection* connection, @@ -108,6 +109,7 @@ class InternalServer { bool m_withLibraryButton; bool m_blockExternalLinks; std::string m_indexTemplateString; + int m_ipConnectionLimit; struct MHD_Daemon* mp_daemon; Library* mp_library;