Dropped root from HTTPErrorResponse & friends

This commit is contained in:
Veloman Yunkan 2023-11-29 18:43:58 +04:00
parent 6e2be481fd
commit 7a85c92025
4 changed files with 45 additions and 62 deletions

View File

@ -587,7 +587,7 @@ std::unique_ptr<Response> InternalServer::handle_request(const RequestContext& r
{ {
try { try {
if (! request.is_valid_url()) { if (! request.is_valid_url()) {
return UrlNotFoundResponse(m_root, request); return UrlNotFoundResponse(request);
} }
if ( request.get_url() == "" ) { if ( request.get_url() == "" ) {
@ -643,11 +643,11 @@ std::unique_ptr<Response> InternalServer::handle_request(const RequestContext& r
return Response::build_redirect(contentUrl + query); return Response::build_redirect(contentUrl + query);
} catch (std::exception& e) { } catch (std::exception& e) {
fprintf(stderr, "===== Unhandled error : %s\n", e.what()); fprintf(stderr, "===== Unhandled error : %s\n", e.what());
return HTTP500Response(m_root, request) return HTTP500Response(request)
+ ParameterizedMessage("non-translated-text", {{"MSG", e.what()}}); + ParameterizedMessage("non-translated-text", {{"MSG", e.what()}});
} catch (...) { } catch (...) {
fprintf(stderr, "===== Unhandled unknown error\n"); fprintf(stderr, "===== Unhandled unknown error\n");
return HTTP500Response(m_root, request) return HTTP500Response(request)
+ nonParameterizedMessage("unknown-error"); + nonParameterizedMessage("unknown-error");
} }
} }
@ -690,7 +690,7 @@ std::unique_ptr<Response> InternalServer::handle_suggest(const RequestContext& r
} }
if ( startsWith(request.get_url(), "/suggest/") ) { if ( startsWith(request.get_url(), "/suggest/") ) {
return UrlNotFoundResponse(m_root, request); return UrlNotFoundResponse(request);
} }
std::string bookName, bookId; std::string bookName, bookId;
@ -704,7 +704,7 @@ std::unique_ptr<Response> InternalServer::handle_suggest(const RequestContext& r
} }
if (archive == nullptr) { if (archive == nullptr) {
return HTTP404Response(m_root, request) return HTTP404Response(request)
+ noSuchBookErrorMsg(bookName); + noSuchBookErrorMsg(bookName);
} }
@ -809,10 +809,10 @@ std::unique_ptr<Response> InternalServer::handle_no_js(const RequestContext& req
const auto bookId = mp_nameMapper->getIdForName(urlParts[2]); const auto bookId = mp_nameMapper->getIdForName(urlParts[2]);
content = getNoJSDownloadPageHTML(bookId, userLang); content = getNoJSDownloadPageHTML(bookId, userLang);
} catch (const std::out_of_range&) { } catch (const std::out_of_range&) {
return UrlNotFoundResponse(m_root, request); return UrlNotFoundResponse(request);
} }
} else { } else {
return UrlNotFoundResponse(m_root, request); return UrlNotFoundResponse(request);
} }
return ContentResponse::build(content, "text/html; charset=utf-8"); return ContentResponse::build(content, "text/html; charset=utf-8");
@ -858,7 +858,7 @@ std::unique_ptr<Response> InternalServer::handle_skin(const RequestContext& requ
response->set_kind(accessType); response->set_kind(accessType);
return std::move(response); return std::move(response);
} catch (const ResourceNotFound& e) { } catch (const ResourceNotFound& e) {
return UrlNotFoundResponse(m_root, request); return UrlNotFoundResponse(request);
} }
} }
@ -875,13 +875,13 @@ std::unique_ptr<Response> InternalServer::handle_search(const RequestContext& re
get_default_data(), get_default_data(),
"application/opensearchdescription+xml"); "application/opensearchdescription+xml");
} }
return UrlNotFoundResponse(m_root, request); return UrlNotFoundResponse(request);
} }
try { try {
return handle_search_request(request); return handle_search_request(request);
} catch (const Error& e) { } catch (const Error& e) {
return HTTP400Response(m_root, request) return HTTP400Response(request)
+ e.message(); + e.message();
} }
} }
@ -923,7 +923,7 @@ std::unique_ptr<Response> InternalServer::handle_search_request(const RequestCon
// Searcher->search will throw a runtime error if there is no valid xapian database to do the search. // Searcher->search will throw a runtime error if there is no valid xapian database to do the search.
// (in case of zim file not containing a index) // (in case of zim file not containing a index)
const auto cssUrl = renderUrl(m_root, RESOURCE::templates::url_of_search_results_css); const auto cssUrl = renderUrl(m_root, RESOURCE::templates::url_of_search_results_css);
HTTPErrorResponse response(m_root, request, MHD_HTTP_NOT_FOUND, HTTPErrorResponse response(request, MHD_HTTP_NOT_FOUND,
"fulltext-search-unavailable", "fulltext-search-unavailable",
"404-page-heading", "404-page-heading",
cssUrl); cssUrl);
@ -980,7 +980,7 @@ std::unique_ptr<Response> InternalServer::handle_random(const RequestContext& re
} }
if ( startsWith(request.get_url(), "/random/") ) { if ( startsWith(request.get_url(), "/random/") ) {
return UrlNotFoundResponse(m_root, request); return UrlNotFoundResponse(request);
} }
std::string bookName; std::string bookName;
@ -994,7 +994,7 @@ std::unique_ptr<Response> InternalServer::handle_random(const RequestContext& re
} }
if (archive == nullptr) { if (archive == nullptr) {
return HTTP404Response(m_root, request) return HTTP404Response(request)
+ noSuchBookErrorMsg(bookName); + noSuchBookErrorMsg(bookName);
} }
@ -1002,7 +1002,7 @@ std::unique_ptr<Response> InternalServer::handle_random(const RequestContext& re
auto entry = archive->getRandomEntry(); auto entry = archive->getRandomEntry();
return build_redirect(bookName, getFinalItem(*archive, entry)); return build_redirect(bookName, getFinalItem(*archive, entry));
} catch(zim::EntryNotFound& e) { } catch(zim::EntryNotFound& e) {
return HTTP404Response(m_root, request) return HTTP404Response(request)
+ nonParameterizedMessage("random-article-failure"); + nonParameterizedMessage("random-article-failure");
} }
} }
@ -1015,7 +1015,7 @@ std::unique_ptr<Response> InternalServer::handle_captured_external(const Request
} catch (const std::out_of_range& e) {} } catch (const std::out_of_range& e) {}
if (source.empty()) { if (source.empty()) {
return UrlNotFoundResponse(m_root, request); return UrlNotFoundResponse(request);
} }
auto data = get_default_data(); auto data = get_default_data();
@ -1033,7 +1033,7 @@ std::unique_ptr<Response> InternalServer::handle_catch(const RequestContext& req
return handle_captured_external(request); return handle_captured_external(request);
} }
return UrlNotFoundResponse(m_root, request); return UrlNotFoundResponse(request);
} }
std::vector<std::string> std::vector<std::string>
@ -1117,7 +1117,7 @@ std::unique_ptr<Response> InternalServer::handle_content(const RequestContext& r
if (archive == nullptr) { if (archive == nullptr) {
const std::string searchURL = m_root + "/search?pattern=" + kiwix::urlEncode(pattern); const std::string searchURL = m_root + "/search?pattern=" + kiwix::urlEncode(pattern);
return UrlNotFoundResponse(m_root, request) return UrlNotFoundResponse(request)
+ suggestSearchMsg(searchURL, kiwix::urlDecode(pattern)); + suggestSearchMsg(searchURL, kiwix::urlDecode(pattern));
} }
@ -1164,7 +1164,7 @@ std::unique_ptr<Response> InternalServer::handle_content(const RequestContext& r
printf("Failed to find %s\n", urlStr.c_str()); printf("Failed to find %s\n", urlStr.c_str());
std::string searchURL = m_root + "/search?content=" + bookName + "&pattern=" + kiwix::urlEncode(pattern); std::string searchURL = m_root + "/search?content=" + bookName + "&pattern=" + kiwix::urlEncode(pattern);
return UrlNotFoundResponse(m_root, request) return UrlNotFoundResponse(request)
+ suggestSearchMsg(searchURL, kiwix::urlDecode(pattern)); + suggestSearchMsg(searchURL, kiwix::urlDecode(pattern));
} }
} }
@ -1182,11 +1182,11 @@ std::unique_ptr<Response> InternalServer::handle_raw(const RequestContext& reque
bookName = request.get_url_part(1); bookName = request.get_url_part(1);
kind = request.get_url_part(2); kind = request.get_url_part(2);
} catch (const std::out_of_range& e) { } catch (const std::out_of_range& e) {
return UrlNotFoundResponse(m_root, request); return UrlNotFoundResponse(request);
} }
if (kind != "meta" && kind!= "content") { if (kind != "meta" && kind!= "content") {
return UrlNotFoundResponse(m_root, request) return UrlNotFoundResponse(request)
+ invalidRawAccessMsg(kind); + invalidRawAccessMsg(kind);
} }
@ -1197,7 +1197,7 @@ std::unique_ptr<Response> InternalServer::handle_raw(const RequestContext& reque
} catch (const std::out_of_range& e) {} } catch (const std::out_of_range& e) {}
if (archive == nullptr) { if (archive == nullptr) {
return UrlNotFoundResponse(m_root, request) return UrlNotFoundResponse(request)
+ noSuchBookErrorMsg(bookName); + noSuchBookErrorMsg(bookName);
} }
@ -1231,7 +1231,7 @@ std::unique_ptr<Response> InternalServer::handle_raw(const RequestContext& reque
if (m_verbose.load()) { if (m_verbose.load()) {
printf("Failed to find %s\n", itemPath.c_str()); printf("Failed to find %s\n", itemPath.c_str());
} }
return UrlNotFoundResponse(m_root, request) return UrlNotFoundResponse(request)
+ rawEntryNotFoundMsg(kind, itemPath); + rawEntryNotFoundMsg(kind, itemPath);
} }
} }

View File

@ -63,7 +63,7 @@ std::unique_ptr<Response> InternalServer::handle_catalog(const RequestContext& r
host = request.get_header("Host"); host = request.get_header("Host");
url = request.get_url_part(1); url = request.get_url_part(1);
} catch (const std::out_of_range&) { } catch (const std::out_of_range&) {
return UrlNotFoundResponse(m_root, request); return UrlNotFoundResponse(request);
} }
if (url == "v2") { if (url == "v2") {
@ -71,7 +71,7 @@ std::unique_ptr<Response> InternalServer::handle_catalog(const RequestContext& r
} }
if (url != "searchdescription.xml" && url != "root.xml" && url != "search") { if (url != "searchdescription.xml" && url != "root.xml" && url != "search") {
return UrlNotFoundResponse(m_root, request); return UrlNotFoundResponse(request);
} }
if (url == "searchdescription.xml") { if (url == "searchdescription.xml") {
@ -108,7 +108,7 @@ std::unique_ptr<Response> InternalServer::handle_catalog_v2(const RequestContext
try { try {
url = request.get_url_part(2); url = request.get_url_part(2);
} catch (const std::out_of_range&) { } catch (const std::out_of_range&) {
return UrlNotFoundResponse(m_root, request); return UrlNotFoundResponse(request);
} }
if (url == "root.xml") { if (url == "root.xml") {
@ -134,7 +134,7 @@ std::unique_ptr<Response> InternalServer::handle_catalog_v2(const RequestContext
} else if (url == "illustration") { } else if (url == "illustration") {
return handle_catalog_v2_illustration(request); return handle_catalog_v2_illustration(request);
} else { } else {
return UrlNotFoundResponse(m_root, request); return UrlNotFoundResponse(request);
} }
} }
@ -174,7 +174,7 @@ std::unique_ptr<Response> InternalServer::handle_catalog_v2_complete_entry(const
try { try {
mp_library->getBookById(entryId); mp_library->getBookById(entryId);
} catch (const std::out_of_range&) { } catch (const std::out_of_range&) {
return UrlNotFoundResponse(m_root, request); return UrlNotFoundResponse(request);
} }
OPDSDumper opdsDumper(mp_library.get(), mp_nameMapper.get()); OPDSDumper opdsDumper(mp_library.get(), mp_nameMapper.get());
@ -221,7 +221,7 @@ std::unique_ptr<Response> InternalServer::handle_catalog_v2_illustration(const R
illustration->mimeType illustration->mimeType
); );
} catch(...) { } catch(...) {
return UrlNotFoundResponse(m_root, request); return UrlNotFoundResponse(request);
} }
} }

View File

@ -163,14 +163,12 @@ std::unique_ptr<ContentResponse> ContentResponseBlueprint::generateResponseObjec
return r; return r;
} }
HTTPErrorResponse::HTTPErrorResponse(const std::string& root, HTTPErrorResponse::HTTPErrorResponse(const RequestContext& request,
const RequestContext& request,
int httpStatusCode, int httpStatusCode,
const std::string& pageTitleMsgId, const std::string& pageTitleMsgId,
const std::string& headingMsgId, const std::string& headingMsgId,
const std::string& cssUrl) const std::string& cssUrl)
: ContentResponseBlueprint(root, : ContentResponseBlueprint(&request,
&request,
httpStatusCode, httpStatusCode,
request.get_requested_format() == "html" ? "text/html; charset=utf-8" : "application/xml; charset=utf-8", request.get_requested_format() == "html" ? "text/html; charset=utf-8" : "application/xml; charset=utf-8",
request.get_requested_format() == "html" ? RESOURCE::templates::error_html : RESOURCE::templates::error_xml) request.get_requested_format() == "html" ? RESOURCE::templates::error_html : RESOURCE::templates::error_xml)
@ -184,19 +182,16 @@ HTTPErrorResponse::HTTPErrorResponse(const std::string& root,
}; };
} }
HTTP404Response::HTTP404Response(const std::string& root, HTTP404Response::HTTP404Response(const RequestContext& request)
const RequestContext& request) : HTTPErrorResponse(request,
: HTTPErrorResponse(root,
request,
MHD_HTTP_NOT_FOUND, MHD_HTTP_NOT_FOUND,
"404-page-title", "404-page-title",
"404-page-heading") "404-page-heading")
{ {
} }
UrlNotFoundResponse::UrlNotFoundResponse(const std::string& root, UrlNotFoundResponse::UrlNotFoundResponse(const RequestContext& request)
const RequestContext& request) : HTTP404Response(request)
: HTTP404Response(root, request)
{ {
const std::string requestUrl = urlDecode(m_request.get_full_url(), false); const std::string requestUrl = urlDecode(m_request.get_full_url(), false);
*this += ParameterizedMessage("url-not-found", {{"url", requestUrl}}); *this += ParameterizedMessage("url-not-found", {{"url", requestUrl}});
@ -216,10 +211,8 @@ HTTPErrorResponse& HTTPErrorResponse::operator+=(const ParameterizedMessage& det
} }
HTTP400Response::HTTP400Response(const std::string& root, HTTP400Response::HTTP400Response(const RequestContext& request)
const RequestContext& request) : HTTPErrorResponse(request,
: HTTPErrorResponse(root,
request,
MHD_HTTP_BAD_REQUEST, MHD_HTTP_BAD_REQUEST,
"400-page-title", "400-page-title",
"400-page-heading") "400-page-heading")
@ -232,10 +225,8 @@ HTTP400Response::HTTP400Response(const std::string& root,
*this += ParameterizedMessage("invalid-request", {{"url", requestUrl}}); *this += ParameterizedMessage("invalid-request", {{"url", requestUrl}});
} }
HTTP500Response::HTTP500Response(const std::string& root, HTTP500Response::HTTP500Response(const RequestContext& request)
const RequestContext& request) : HTTPErrorResponse(request,
: HTTPErrorResponse(root,
request,
MHD_HTTP_INTERNAL_SERVER_ERROR, MHD_HTTP_INTERNAL_SERVER_ERROR,
"500-page-title", "500-page-title",
"500-page-heading") "500-page-heading")

View File

@ -115,13 +115,11 @@ class ContentResponse : public Response {
class ContentResponseBlueprint class ContentResponseBlueprint
{ {
public: // functions public: // functions
ContentResponseBlueprint(const std::string& root, ContentResponseBlueprint(const RequestContext* request,
const RequestContext* request,
int httpStatusCode, int httpStatusCode,
const std::string& mimeType, const std::string& mimeType,
const std::string& templateStr) const std::string& templateStr)
: m_root(root) : m_request(*request)
, m_request(*request)
, m_httpStatusCode(httpStatusCode) , m_httpStatusCode(httpStatusCode)
, m_mimeType(mimeType) , m_mimeType(mimeType)
, m_template(templateStr) , m_template(templateStr)
@ -140,7 +138,6 @@ protected: // functions
virtual std::unique_ptr<ContentResponse> generateResponseObject() const; virtual std::unique_ptr<ContentResponse> generateResponseObject() const;
public: //data public: //data
const std::string m_root;
const RequestContext& m_request; const RequestContext& m_request;
const int m_httpStatusCode; const int m_httpStatusCode;
const std::string m_mimeType; const std::string m_mimeType;
@ -150,8 +147,7 @@ public: //data
struct HTTPErrorResponse : ContentResponseBlueprint struct HTTPErrorResponse : ContentResponseBlueprint
{ {
HTTPErrorResponse(const std::string& root, HTTPErrorResponse(const RequestContext& request,
const RequestContext& request,
int httpStatusCode, int httpStatusCode,
const std::string& pageTitleMsgId, const std::string& pageTitleMsgId,
const std::string& headingMsgId, const std::string& headingMsgId,
@ -163,26 +159,22 @@ struct HTTPErrorResponse : ContentResponseBlueprint
struct HTTP404Response : HTTPErrorResponse struct HTTP404Response : HTTPErrorResponse
{ {
HTTP404Response(const std::string& root, explicit HTTP404Response(const RequestContext& request);
const RequestContext& request);
}; };
struct UrlNotFoundResponse : HTTP404Response struct UrlNotFoundResponse : HTTP404Response
{ {
UrlNotFoundResponse(const std::string& root, explicit UrlNotFoundResponse(const RequestContext& request);
const RequestContext& request);
}; };
struct HTTP400Response : HTTPErrorResponse struct HTTP400Response : HTTPErrorResponse
{ {
HTTP400Response(const std::string& root, explicit HTTP400Response(const RequestContext& request);
const RequestContext& request);
}; };
struct HTTP500Response : HTTPErrorResponse struct HTTP500Response : HTTPErrorResponse
{ {
HTTP500Response(const std::string& root, explicit HTTP500Response(const RequestContext& request);
const RequestContext& request);
private: // overrides private: // overrides
// generateResponseObject() is overriden in order to produce a minimal // generateResponseObject() is overriden in order to produce a minimal