Drop Reader from InternalServer::handle_random

This commit is contained in:
Maneesh P M 2021-05-23 11:54:58 +05:30
parent a236751c74
commit 75b4d311d7
3 changed files with 28 additions and 20 deletions

View File

@ -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

View File

@ -58,6 +58,8 @@ extern "C" {
#include <zim/uuid.h>
#include <zim/error.h>
#include <zim/search.h>
#include <zim/entry.h>
#include <zim/item.h>
#include <mustache.hpp>
@ -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<Response> InternalServer::handle_random(const RequestContext& re
std::string bookName;
std::string bookId;
std::shared_ptr<Reader> reader;
std::shared_ptr<zim::Archive> 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, "");
}
}

View File

@ -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