diff --git a/src/server/internalServer.cpp b/src/server/internalServer.cpp index 11333f30c..b2f4ead56 100644 --- a/src/server/internalServer.cpp +++ b/src/server/internalServer.cpp @@ -271,7 +271,7 @@ std::unique_ptr InternalServer::handle_request(const RequestContext& r { try { if (! request.is_valid_url()) - return Response::build_404(*this, request, "", ""); + return Response::build_404(*this, request.get_full_url(), "", ""); const ETag etag = get_matching_if_none_match_etag(request); if ( etag ) @@ -394,11 +394,11 @@ std::unique_ptr InternalServer::handle_meta(const RequestContext& requ meta_name = request.get_argument("name"); archive = mp_library->getArchiveById(bookId); } catch (const std::out_of_range& e) { - return Response::build_404(*this, request, bookName, ""); + // error handled by the archive == nullptr check below } if (archive == nullptr) { - return Response::build_404(*this, request, bookName, ""); + return Response::build_404(*this, request.get_full_url(), bookName, ""); } std::string content; @@ -425,7 +425,7 @@ std::unique_ptr InternalServer::handle_meta(const RequestContext& requ } else if (const unsigned illustrationSize = parseIllustration(meta_name)) { getArchiveFavicon(*archive, illustrationSize, content, mimeType); } else { - return Response::build_404(*this, request, bookName, ""); + return Response::build_404(*this, request.get_full_url(), bookName, ""); } auto response = ContentResponse::build(*this, content, mimeType); @@ -452,7 +452,7 @@ std::unique_ptr InternalServer::handle_suggest(const RequestContext& r queryString = request.get_argument("term"); archive = mp_library->getArchiveById(bookId); } catch (const std::out_of_range&) { - return Response::build_404(*this, request, bookName, ""); + return Response::build_404(*this, "", bookName, ""); } auto start = 0; @@ -470,7 +470,7 @@ std::unique_ptr InternalServer::handle_suggest(const RequestContext& r } if (archive == nullptr) { - return Response::build_404(*this, request, bookName, ""); + return Response::build_404(*this, "", bookName, ""); } if (m_verbose.load()) { @@ -532,7 +532,7 @@ std::unique_ptr InternalServer::handle_skin(const RequestContext& requ response->set_cacheable(); return std::move(response); } catch (const ResourceNotFound& e) { - return Response::build_404(*this, request, "", ""); + return Response::build_404(*this, request.get_full_url(), "", ""); } } @@ -673,7 +673,7 @@ std::unique_ptr InternalServer::handle_random(const RequestContext& re if (archive == nullptr) { const std::string error_details = "No such book: " + bookName; - return Response::build_404(*this, request, bookName, "", error_details); + return Response::build_404(*this, "", bookName, "", error_details); } try { @@ -681,7 +681,7 @@ std::unique_ptr InternalServer::handle_random(const RequestContext& re return build_redirect(bookName, getFinalItem(*archive, entry)); } catch(zim::EntryNotFound& e) { const std::string error_details = "Oops! Failed to pick a random article :("; - return Response::build_404(*this, request, bookName, getArchiveTitle(*archive), error_details); + return Response::build_404(*this, "", bookName, getArchiveTitle(*archive), error_details); } } @@ -693,7 +693,7 @@ std::unique_ptr InternalServer::handle_captured_external(const Request } catch (const std::out_of_range& e) {} if (source.empty()) - return Response::build_404(*this, request, "", ""); + return Response::build_404(*this, request.get_full_url(), "", ""); auto data = get_default_data(); data.set("source", source); @@ -712,7 +712,7 @@ std::unique_ptr InternalServer::handle_catalog(const RequestContext& r host = request.get_header("Host"); url = request.get_url_part(1); } catch (const std::out_of_range&) { - return Response::build_404(*this, request, "", ""); + return Response::build_404(*this, request.get_full_url(), "", ""); } if (url == "v2") { @@ -720,7 +720,7 @@ std::unique_ptr InternalServer::handle_catalog(const RequestContext& r } if (url != "searchdescription.xml" && url != "root.xml" && url != "search") { - return Response::build_404(*this, request, "", ""); + return Response::build_404(*this, request.get_full_url(), "", ""); } if (url == "searchdescription.xml") { @@ -856,7 +856,7 @@ std::unique_ptr InternalServer::handle_content(const RequestContext& r std::string searchURL = m_root+"/search?pattern="+pattern; // Make a full search on the entire library. const std::string details = searchSuggestionHTML(searchURL, kiwix::urlDecode(pattern)); - return Response::build_404(*this, request, bookName, "", details); + return Response::build_404(*this, request.get_full_url(), bookName, "", details); } auto urlStr = request.get_url().substr(bookName.size()+1); @@ -889,7 +889,7 @@ std::unique_ptr InternalServer::handle_content(const RequestContext& r std::string searchURL = m_root+"/search?content="+bookName+"&pattern="+pattern; // Make a search on this specific book only. const std::string details = searchSuggestionHTML(searchURL, kiwix::urlDecode(pattern)); - return Response::build_404(*this, request, bookName, getArchiveTitle(*archive), details); + return Response::build_404(*this, request.get_full_url(), bookName, getArchiveTitle(*archive), details); } } diff --git a/src/server/internalServer_catalog_v2.cpp b/src/server/internalServer_catalog_v2.cpp index 7e49f76ea..475e16cb4 100644 --- a/src/server/internalServer_catalog_v2.cpp +++ b/src/server/internalServer_catalog_v2.cpp @@ -43,7 +43,7 @@ std::unique_ptr InternalServer::handle_catalog_v2(const RequestContext try { url = request.get_url_part(2); } catch (const std::out_of_range&) { - return Response::build_404(*this, request, "", ""); + return Response::build_404(*this, request.get_full_url(), "", ""); } if (url == "root.xml") { @@ -67,7 +67,7 @@ std::unique_ptr InternalServer::handle_catalog_v2(const RequestContext } else if (url == "languages") { return handle_catalog_v2_languages(request); } else { - return Response::build_404(*this, request, "", ""); + return Response::build_404(*this, request.get_full_url(), "", ""); } } @@ -108,7 +108,7 @@ std::unique_ptr InternalServer::handle_catalog_v2_complete_entry(const try { mp_library->getBookById(entryId); } catch (const std::out_of_range&) { - return Response::build_404(*this, request, "", ""); + return Response::build_404(*this, request.get_full_url(), "", ""); } OPDSDumper opdsDumper(mp_library); diff --git a/src/server/response.cpp b/src/server/response.cpp index 9fefd5f88..36f9339f8 100644 --- a/src/server/response.cpp +++ b/src/server/response.cpp @@ -83,11 +83,11 @@ std::unique_ptr Response::build_304(const InternalServer& server, cons return response; } -std::unique_ptr Response::build_404(const InternalServer& server, const RequestContext& request, const std::string& bookName, const std::string& bookTitle, const std::string& details) +std::unique_ptr Response::build_404(const InternalServer& server, const std::string& url, const std::string& bookName, const std::string& bookTitle, const std::string& details) { MustacheData results; - if ( request.get_url() != "/random" ) { - results.set("url", request.get_full_url()); + if ( !url.empty() ) { + results.set("url", url); } results.set("details", details); diff --git a/src/server/response.h b/src/server/response.h index 49d4d11e6..2a8f6de4a 100644 --- a/src/server/response.h +++ b/src/server/response.h @@ -47,7 +47,7 @@ class Response { static std::unique_ptr build(const InternalServer& server); static std::unique_ptr build_304(const InternalServer& server, const ETag& etag); - static std::unique_ptr build_404(const InternalServer& server, const RequestContext& request, const std::string& bookName, const std::string& bookTitle, const std::string& details=""); + static std::unique_ptr build_404(const InternalServer& server, const std::string& url, const std::string& bookName, const std::string& bookTitle, const std::string& details=""); static std::unique_ptr build_416(const InternalServer& server, size_t resourceLength); static std::unique_ptr build_500(const InternalServer& server, const std::string& msg); static std::unique_ptr build_redirect(const InternalServer& server, const std::string& redirectUrl);