Added Search Link for bad bookName/articleName on 404

This commit is contained in:
Vertigo
2021-03-17 13:31:56 +05:30
parent 6d2f227c42
commit 611146aa37
4 changed files with 27 additions and 4 deletions

View File

@ -742,6 +742,15 @@ std::string get_book_name(const RequestContext& request)
} }
} }
std::string searchSuggestionHTML(const std::string& searchURL, const std::string& pattern)
{
kainjow::mustache::mustache tmpl("Make a full text search for <a href=\"{{{searchURL}}}\">{{pattern}}</a>");
MustacheData data;
data.set("pattern", pattern);
data.set("searchURL", searchURL);
return (tmpl.render(data));
}
} // unnamed namespace } // unnamed namespace
std::shared_ptr<Reader> std::shared_ptr<Reader>
@ -765,6 +774,8 @@ InternalServer::build_redirect(const std::string& bookName, const kiwix::Entry&
std::unique_ptr<Response> InternalServer::handle_content(const RequestContext& request) std::unique_ptr<Response> InternalServer::handle_content(const RequestContext& request)
{ {
const std::string url = request.get_url();
const std::string pattern = url.substr((url.find_last_of('/'))+1);
if (m_verbose.load()) { if (m_verbose.load()) {
printf("** running handle_content\n"); printf("** running handle_content\n");
} }
@ -775,7 +786,10 @@ std::unique_ptr<Response> InternalServer::handle_content(const RequestContext& r
const std::shared_ptr<Reader> reader = get_reader(bookName); const std::shared_ptr<Reader> reader = get_reader(bookName);
if (reader == nullptr) { if (reader == nullptr) {
return Response::build_404(*this, request, bookName); 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);
} }
auto urlStr = request.get_url().substr(bookName.size()+1); auto urlStr = request.get_url().substr(bookName.size()+1);
@ -805,7 +819,10 @@ std::unique_ptr<Response> InternalServer::handle_content(const RequestContext& r
if (m_verbose.load()) if (m_verbose.load())
printf("Failed to find %s\n", urlStr.c_str()); printf("Failed to find %s\n", urlStr.c_str());
return Response::build_404(*this, request, bookName); 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, details);
} }
} }

View File

@ -93,10 +93,11 @@ std::unique_ptr<Response> Response::build_304(const InternalServer& server, cons
return response; return response;
} }
std::unique_ptr<Response> Response::build_404(const InternalServer& server, const RequestContext& request, const std::string& bookName) std::unique_ptr<Response> Response::build_404(const InternalServer& server, const RequestContext& request, const std::string& bookName, const std::string& details)
{ {
MustacheData results; MustacheData results;
results.set("url", request.get_full_url()); results.set("url", request.get_full_url());
results.set("details", details);
auto response = ContentResponse::build(server, RESOURCE::templates::_404_html, results, "text/html"); auto response = ContentResponse::build(server, RESOURCE::templates::_404_html, results, "text/html");
response->set_code(MHD_HTTP_NOT_FOUND); response->set_code(MHD_HTTP_NOT_FOUND);

View File

@ -47,7 +47,7 @@ class Response {
static std::unique_ptr<Response> build(const InternalServer& server); static std::unique_ptr<Response> build(const InternalServer& server);
static std::unique_ptr<Response> build_304(const InternalServer& server, const ETag& etag); static std::unique_ptr<Response> build_304(const InternalServer& server, const ETag& etag);
static std::unique_ptr<Response> build_404(const InternalServer& server, const RequestContext& request, const std::string& bookName); static std::unique_ptr<Response> build_404(const InternalServer& server, const RequestContext& request, const std::string& bookName, const std::string& details="");
static std::unique_ptr<Response> build_416(const InternalServer& server, size_t resourceLength); static std::unique_ptr<Response> build_416(const InternalServer& server, size_t resourceLength);
static std::unique_ptr<Response> build_500(const InternalServer& server, const std::string& msg); static std::unique_ptr<Response> build_500(const InternalServer& server, const std::string& msg);
static std::unique_ptr<Response> build_redirect(const InternalServer& server, const std::string& redirectUrl); static std::unique_ptr<Response> build_redirect(const InternalServer& server, const std::string& redirectUrl);

View File

@ -9,5 +9,10 @@
<p> <p>
The requested URL "{{url}}" was not found on this server. The requested URL "{{url}}" was not found on this server.
</p> </p>
{{#details}}
<p>
{{{details}}}
</p>
{{/details}}
</body> </body>
</html> </html>