Remove `get_default_response` in favor of a static Response method.

We want to build different kind of response depending of the context.
This commit is contained in:
Matthieu Gautier 2020-07-29 10:35:27 +02:00
parent a0bdc0821c
commit 9e351b279e
4 changed files with 28 additions and 24 deletions

View File

@ -232,7 +232,7 @@ MHD_Result InternalServer::handlerCallback(struct MHD_Connection* connection,
std::unique_ptr<Response> InternalServer::build_304(const RequestContext& request, const ETag& etag) const std::unique_ptr<Response> InternalServer::build_304(const RequestContext& request, const ETag& etag) const
{ {
auto response = get_default_response(); auto response = Response::build(*this);
response->set_code(MHD_HTTP_NOT_MODIFIED); response->set_code(MHD_HTTP_NOT_MODIFIED);
response->set_etag(etag); response->set_etag(etag);
response->set_content(""); response->set_content("");
@ -287,24 +287,13 @@ MustacheData InternalServer::get_default_data() const
return data; return data;
} }
std::unique_ptr<Response> InternalServer::get_default_response() const
{
return std::unique_ptr<Response>(new Response(
m_root,
m_verbose.load(),
m_withTaskbar,
m_withLibraryButton,
m_blockExternalLinks));
}
std::unique_ptr<Response> InternalServer::build_404(const RequestContext& request, std::unique_ptr<Response> InternalServer::build_404(const RequestContext& request,
const std::string& bookName) const std::string& bookName)
{ {
MustacheData results; MustacheData results;
results.set("url", request.get_full_url()); results.set("url", request.get_full_url());
auto response = get_default_response(); auto response = Response::build(*this);
response->set_template(RESOURCE::templates::_404_html, results); response->set_template(RESOURCE::templates::_404_html, results);
response->set_mimeType("text/html"); response->set_mimeType("text/html");
response->set_code(MHD_HTTP_NOT_FOUND); response->set_code(MHD_HTTP_NOT_FOUND);
@ -370,7 +359,7 @@ InternalServer::get_matching_if_none_match_etag(const RequestContext& r) const
std::unique_ptr<Response> InternalServer::build_homepage(const RequestContext& request) std::unique_ptr<Response> InternalServer::build_homepage(const RequestContext& request)
{ {
auto response = get_default_response(); auto response = Response::build(*this);
response->set_template(RESOURCE::templates::index_html, homepage_data()); response->set_template(RESOURCE::templates::index_html, homepage_data());
response->set_mimeType("text/html; charset=utf-8"); response->set_mimeType("text/html; charset=utf-8");
response->set_compress(true); response->set_compress(true);
@ -421,7 +410,7 @@ std::unique_ptr<Response> InternalServer::handle_meta(const RequestContext& requ
return build_404(request, bookName); return build_404(request, bookName);
} }
auto response = get_default_response(); auto response = Response::build(*this);
response->set_content(content); response->set_content(content);
response->set_mimeType(mimeType); response->set_mimeType(mimeType);
response->set_compress(false); response->set_compress(false);
@ -487,7 +476,7 @@ std::unique_ptr<Response> InternalServer::handle_suggest(const RequestContext& r
auto data = get_default_data(); auto data = get_default_data();
data.set("suggestions", results); data.set("suggestions", results);
auto response = get_default_response(); auto response = Response::build(*this);
response->set_template(RESOURCE::templates::suggestion_json, data); response->set_template(RESOURCE::templates::suggestion_json, data);
response->set_mimeType("application/json; charset=utf-8"); response->set_mimeType("application/json; charset=utf-8");
response->set_compress(true); response->set_compress(true);
@ -500,7 +489,7 @@ std::unique_ptr<Response> InternalServer::handle_skin(const RequestContext& requ
printf("** running handle_skin\n"); printf("** running handle_skin\n");
} }
auto response = get_default_response(); auto response = Response::build(*this);
auto resourceName = request.get_url().substr(1); auto resourceName = request.get_url().substr(1);
try { try {
response->set_content(getResource(resourceName)); response->set_content(getResource(resourceName));
@ -568,14 +557,14 @@ std::unique_ptr<Response> InternalServer::handle_search(const RequestContext& re
/* If article found then redirect directly to it */ /* If article found then redirect directly to it */
if (!patternCorrespondingUrl.empty()) { if (!patternCorrespondingUrl.empty()) {
auto response = get_default_response(); auto response = Response::build(*this);
response->set_redirection(m_root + "/" + bookName + "/" + patternCorrespondingUrl); response->set_redirection(m_root + "/" + bookName + "/" + patternCorrespondingUrl);
return response; return response;
} }
} }
/* Make the search */ /* Make the search */
auto response = get_default_response(); auto response = Response::build(*this);
response->set_mimeType("text/html; charset=utf-8"); response->set_mimeType("text/html; charset=utf-8");
response->set_taskbar(bookName, reader ? reader->getTitle() : ""); response->set_taskbar(bookName, reader ? reader->getTitle() : "");
response->set_compress(true); response->set_compress(true);
@ -689,7 +678,7 @@ std::unique_ptr<Response> InternalServer::handle_captured_external(const Request
auto data = get_default_data(); auto data = get_default_data();
data.set("source", source); data.set("source", source);
auto response = get_default_response(); auto response = Response::build(*this);
response->set_template(RESOURCE::templates::captured_external_html, data); response->set_template(RESOURCE::templates::captured_external_html, data);
response->set_mimeType("text/html; charset=utf-8"); response->set_mimeType("text/html; charset=utf-8");
response->set_compress(true); response->set_compress(true);
@ -715,7 +704,7 @@ std::unique_ptr<Response> InternalServer::handle_catalog(const RequestContext& r
return build_404(request, ""); return build_404(request, "");
} }
auto response = get_default_response(); auto response = Response::build(*this);
response->set_compress(true); response->set_compress(true);
if (url == "searchdescription.xml") { if (url == "searchdescription.xml") {
response->set_template(RESOURCE::opensearchdescription_xml, get_default_data()); response->set_template(RESOURCE::opensearchdescription_xml, get_default_data());
@ -809,7 +798,7 @@ InternalServer::get_reader(const std::string& bookName) const
std::unique_ptr<Response> std::unique_ptr<Response>
InternalServer::build_redirect(const std::string& bookName, const kiwix::Entry& entry) const InternalServer::build_redirect(const std::string& bookName, const kiwix::Entry& entry) const
{ {
auto response = get_default_response(); auto response = Response::build(*this);
response->set_redirection(m_root + "/" + bookName + "/" + response->set_redirection(m_root + "/" + bookName + "/" +
kiwix::urlEncode(entry.getPath())); kiwix::urlEncode(entry.getPath()));
return response; return response;
@ -851,7 +840,7 @@ std::unique_ptr<Response> InternalServer::handle_content(const RequestContext& r
return build_404(request, bookName); return build_404(request, bookName);
} }
auto response = get_default_response(); auto response = Response::build(*this);
response->set_entry(entry, request); response->set_entry(entry, request);
response->set_taskbar(bookName, reader->getTitle()); response->set_taskbar(bookName, reader->getTitle());

View File

@ -84,7 +84,6 @@ class InternalServer {
MustacheData get_default_data() const; MustacheData get_default_data() const;
MustacheData homepage_data() const; MustacheData homepage_data() const;
std::unique_ptr<Response> get_default_response() const;
std::shared_ptr<Reader> get_reader(const std::string& bookName) const; std::shared_ptr<Reader> get_reader(const std::string& bookName) const;
bool etag_not_needed(const RequestContext& r) const; bool etag_not_needed(const RequestContext& r) const;
@ -105,6 +104,8 @@ class InternalServer {
NameMapper* mp_nameMapper; NameMapper* mp_nameMapper;
std::string m_server_id; std::string m_server_id;
friend std::unique_ptr<Response> Response::build(const InternalServer& server);
}; };
} }

View File

@ -3,6 +3,7 @@
#include "response.h" #include "response.h"
#include "request_context.h" #include "request_context.h"
#include "internalServer.h"
#include "kiwixlib-resources.h" #include "kiwixlib-resources.h"
#include "tools/regexTools.h" #include "tools/regexTools.h"
@ -56,6 +57,16 @@ Response::Response(const std::string& root, bool verbose, bool withTaskbar, bool
{ {
} }
std::unique_ptr<Response> Response::build(const InternalServer& server)
{
return std::unique_ptr<Response>(new Response(
server.m_root,
server.m_verbose.load(),
server.m_withTaskbar,
server.m_withLibraryButton,
server.m_blockExternalLinks));
}
static MHD_Result print_key_value (void *cls, enum MHD_ValueKind kind, static MHD_Result print_key_value (void *cls, enum MHD_ValueKind kind,
const char *key, const char *value) const char *key, const char *value)

View File

@ -41,6 +41,7 @@ enum class ResponseMode {
ENTRY ENTRY
}; };
class InternalServer;
class RequestContext; class RequestContext;
class Response { class Response {
@ -48,6 +49,8 @@ class Response {
Response(const std::string& root, bool verbose, bool withTaskbar, bool withLibraryButton, bool blockExternalLinks); Response(const std::string& root, bool verbose, bool withTaskbar, bool withLibraryButton, bool blockExternalLinks);
~Response() = default; ~Response() = default;
static std::unique_ptr<Response> build(const InternalServer& server);
MHD_Result send(const RequestContext& request, MHD_Connection* connection); MHD_Result send(const RequestContext& request, MHD_Connection* connection);
void set_template(const std::string& template_str, kainjow::mustache::data data); void set_template(const std::string& template_str, kainjow::mustache::data data);