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 82dc1b54..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), @@ -56,7 +72,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() { @@ -69,12 +91,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) @@ -93,12 +115,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 @@ -106,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; +} + } 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),