From cffca3ad859d40852db16acb45a3f4b661935f56 Mon Sep 17 00:00:00 2001 From: Vighnesh Date: Thu, 30 Oct 2025 21:23:36 +0530 Subject: [PATCH 1/3] Sync m_addr of Server and InternalServer --- src/server.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/server.cpp b/src/server.cpp index 82dc1b54..65f4071a 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -56,7 +56,13 @@ bool Server::start() { m_ipConnectionLimit, m_catalogOnlyMode, m_contentServerUrl)); - return mp_server->start(); + if (mp_server->start()) { + // this syncs m_addr of InternalServer and Server as they may diverge + m_addr = mp_server->getAddress(); + return true; + } else { + return false; + } } void Server::stop() { @@ -93,12 +99,12 @@ void Server::setAddress(const std::string& addr) int Server::getPort() const { - return mp_server->getPort(); + return m_port; } IpAddress Server::getAddress() const { - return mp_server->getAddress(); + return m_addr; } IpMode Server::getIpMode() const From c2df0a99fe373fe40f645c854f709d158ebd9738 Mon Sep 17 00:00:00 2001 From: Vighnesh Date: Thu, 30 Oct 2025 23:27:14 +0530 Subject: [PATCH 2/3] Normalize m_root in Server itself --- src/server.cpp | 12 ++++++------ src/server/internalServer.cpp | 12 +----------- 2 files changed, 7 insertions(+), 17 deletions(-) diff --git a/src/server.cpp b/src/server.cpp index 65f4071a..950ea774 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -75,12 +75,12 @@ void Server::stop() { void Server::setRoot(const std::string& root) { m_root = root; - if (m_root[0] != '/') { - m_root = "/" + m_root; - } - if (m_root.back() == '/') { - m_root.erase(m_root.size() - 1); - } + while (!m_root.empty() && m_root.back() == '/') + m_root.pop_back(); + + while (!m_root.empty() && m_root.front() == '/') + m_root = m_root.substr(1); + m_root = m_root.empty() ? m_root : "/" + m_root; } void Server::setAddress(const std::string& addr) diff --git a/src/server/internalServer.cpp b/src/server/internalServer.cpp index d907f0e8..8c0ee059 100644 --- a/src/server/internalServer.cpp +++ b/src/server/internalServer.cpp @@ -99,16 +99,6 @@ bool ipAvailable(const std::string addr) return false; } -inline std::string normalizeRootUrl(std::string rootUrl) -{ - while ( !rootUrl.empty() && rootUrl.back() == '/' ) - rootUrl.pop_back(); - - while ( !rootUrl.empty() && rootUrl.front() == '/' ) - rootUrl = rootUrl.substr(1); - return rootUrl.empty() ? rootUrl : "/" + rootUrl; -} - std::string fullURL2LocalURL(const std::string& fullUrl, const std::string& rootLocation) { @@ -440,7 +430,7 @@ InternalServer::InternalServer(LibraryPtr library, std::string contentServerUrl) : m_addr(addr), m_port(port), - m_root(normalizeRootUrl(root)), + m_root(root), m_rootPrefixOfDecodedURL(m_root), m_nbThreads(nbThreads), m_multizimSearchLimit(multizimSearchLimit), From 4928509991ac0bec75da1300442624ae3b1b9b2d Mon Sep 17 00:00:00 2001 From: Vighnesh Date: Sun, 26 Oct 2025 20:56:36 +0530 Subject: [PATCH 3/3] Implement a function which returns server access url --- include/server.h | 1 + src/server.cpp | 28 ++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/include/server.h b/include/server.h index 0fbdfab6..11a33d54 100644 --- a/include/server.h +++ b/include/server.h @@ -69,6 +69,7 @@ namespace kiwix int getPort() const; IpAddress getAddress() const; IpMode getIpMode() const; + std::vector getServerAccessUrls() const; protected: std::shared_ptr mp_library; diff --git a/src/server.cpp b/src/server.cpp index 950ea774..658b5cce 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -29,6 +29,22 @@ namespace kiwix { +namespace +{ + +std::string makeServerUrl(std::string host, int port, std::string root) +{ + const int httpDefaultPort = 80; + + if (port == httpDefaultPort) { + return "http://" + host + root; + } else { + return "http://" + host + ":" + std::to_string(port) + root; + } +} + +} // unnamed namespace + Server::Server(LibraryPtr library, std::shared_ptr nameMapper) : mp_library(library), mp_nameMapper(nameMapper), @@ -112,4 +128,16 @@ IpMode Server::getIpMode() const return mp_server->getIpMode(); } +std::vector Server::getServerAccessUrls() const +{ + std::vector result; + if (!m_addr.addr.empty()) { + result.push_back(makeServerUrl(m_addr.addr, m_port, m_root)); + } + if (!m_addr.addr6.empty()) { + result.push_back(makeServerUrl("[" + m_addr.addr6 + "]", m_port, m_root)); + } + return result; +} + }