mirror of
https://github.com/kiwix/libkiwix.git
synced 2025-06-26 10:11:30 +00:00
Added Search Link for bad bookName/articleName on 404
This commit is contained in:
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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>
|
||||||
|
Reference in New Issue
Block a user