diff --git a/include/tools/archiveTools.h b/include/tools/archiveTools.h index 08c36de16..55b105f7b 100644 --- a/include/tools/archiveTools.h +++ b/include/tools/archiveTools.h @@ -40,6 +40,7 @@ namespace kiwix std::string getMetaDate(const zim::Archive* const archive); std::string getMetaCreator(const zim::Archive* const archive); std::string getMetaPublisher(const zim::Archive* const archive); + zim::Entry getFinalEntry(const zim::Archive* const archive, const zim::Entry& entry); } #endif diff --git a/src/server/internalServer.cpp b/src/server/internalServer.cpp index c41433a30..98ac18785 100644 --- a/src/server/internalServer.cpp +++ b/src/server/internalServer.cpp @@ -58,6 +58,8 @@ extern "C" { #include #include #include +#include +#include #include @@ -363,20 +365,6 @@ SuggestionsList_t getSuggestions(const zim::Archive* const archive, return suggestions; } -zim::Entry getFinalEntry(const zim::Archive* const archive, const zim::Entry& entry) -{ - int loopCounter = 42; - auto final_entry = entry; - while (final_entry.isRedirect() && loopCounter--) { - final_entry = final_entry.getRedirectEntry(); - } - // Prevent infinite loops. - if (final_entry.isRedirect()) { - throw zim::EntryNotFound("Unable to resolve entry redirects."); - } - return final_entry; -} - zim::Entry getEntryFromPath(const zim::Archive* const archive, const std::string& path) { if (path.empty() || path == "/") { @@ -428,6 +416,20 @@ SuggestionsList_t getSuggestions(const zim::Archive* const archive, return suggestions; } +zim::Entry getFinalEntry(const zim::Archive* const archive, const zim::Entry& entry) +{ + int loopCounter = 42; + auto final_entry = entry; + while (final_entry.isRedirect() && loopCounter--) { + final_entry = final_entry.getRedirectEntry(); + } + // Prevent infinite loops. + if (final_entry.isRedirect()) { + throw zim::EntryNotFound("Unable to resolve entry redirects."); + } + return final_entry; +} + /** * Archive and Zim handlers end **/ @@ -683,23 +685,23 @@ std::unique_ptr InternalServer::handle_random(const RequestContext& re std::string bookName; std::string bookId; - std::shared_ptr reader; + std::shared_ptr archive; try { bookName = request.get_argument("content"); bookId = mp_nameMapper->getIdForName(bookName); - reader = mp_library->getReaderById(bookId); + archive = mp_library->getArchiveById(bookId); } catch (const std::out_of_range&) { return Response::build_404(*this, request, bookName, ""); } - if (reader == nullptr) { + if (archive == nullptr) { return Response::build_404(*this, request, bookName, ""); } try { - auto entry = reader->getRandomPage(); - return build_redirect(bookName, entry.getFinalEntry()); - } catch(kiwix::NoEntry& e) { + auto entry = archive->getRandomEntry(); + return build_redirect(bookName, getFinalEntry(archive.get(), entry)); + } catch(zim::EntryNotFound& e) { return Response::build_404(*this, request, bookName, ""); } } diff --git a/src/tools/archiveTools.cpp b/src/tools/archiveTools.cpp index 930bc8916..1287dd1bc 100644 --- a/src/tools/archiveTools.cpp +++ b/src/tools/archiveTools.cpp @@ -100,4 +100,9 @@ std::string getMetaPublisher(const zim::Archive* const archive) { return getMetadata(archive, "Publisher"); } +zim::Entry getFinalEntry(const zim::Archive* const archive, const zim::Entry& entry) +{ + return archive->getEntryByPath(entry.getItem(true).getPath()); +} + } // kiwix