Remove the `RedirectResponse` and use a basic `Response` with header.

This commit is contained in:
Matthieu Gautier 2020-07-30 15:59:59 +02:00
parent 77123ac74c
commit 3352c95314
4 changed files with 13 additions and 37 deletions

View File

@ -511,7 +511,7 @@ 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 redirectUrl = m_root + "/" + bookName + "/" + patternCorrespondingUrl; auto redirectUrl = m_root + "/" + bookName + "/" + patternCorrespondingUrl;
return RedirectionResponse::build(*this, redirectUrl); return Response::build_redirect(*this, redirectUrl);
} }
} }
@ -743,7 +743,7 @@ 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 redirectUrl = m_root + "/" + bookName + "/" + kiwix::urlEncode(entry.getPath()); auto redirectUrl = m_root + "/" + bookName + "/" + kiwix::urlEncode(entry.getPath());
return RedirectionResponse::build(*this, redirectUrl); return Response::build_redirect(*this, redirectUrl);
} }
std::unique_ptr<Response> InternalServer::handle_content(const RequestContext& request) std::unique_ptr<Response> InternalServer::handle_content(const RequestContext& request)

View File

@ -103,7 +103,6 @@ class InternalServer {
std::string m_server_id; std::string m_server_id;
friend std::unique_ptr<Response> Response::build(const InternalServer& server); friend std::unique_ptr<Response> Response::build(const InternalServer& server);
friend std::unique_ptr<Response> RedirectionResponse::build(const InternalServer& server, const std::string& redirectionUrl);
friend std::unique_ptr<ContentResponse> ContentResponse::build(const InternalServer& server, const std::string& content, const std::string& mimetype); friend std::unique_ptr<ContentResponse> ContentResponse::build(const InternalServer& server, const std::string& content, const std::string& mimetype);
friend std::unique_ptr<Response> EntryResponse::build(const InternalServer& server, const RequestContext& request, const Entry& entry); friend std::unique_ptr<Response> EntryResponse::build(const InternalServer& server, const RequestContext& request, const Entry& entry);
friend std::unique_ptr<Response> Response::build_500(const InternalServer& server, const std::string& msg); friend std::unique_ptr<Response> Response::build_500(const InternalServer& server, const std::string& msg);

View File

@ -111,6 +111,15 @@ std::unique_ptr<Response> Response::build_500(const InternalServer& server, cons
} }
std::unique_ptr<Response> Response::build_redirect(const InternalServer& server, const std::string& redirectUrl)
{
auto response = Response::build(server);
response->m_returnCode = MHD_HTTP_FOUND;
response->add_header(MHD_HTTP_HEADER_LOCATION, redirectUrl);
return response;
}
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)
@ -221,7 +230,7 @@ ContentResponse::contentDecorationAllowed() const
MHD_Response* MHD_Response*
Response::create_mhd_response(const RequestContext& request) Response::create_mhd_response(const RequestContext& request)
{ {
MHD_Response* response = MHD_create_response_from_buffer(0, NULL, MHD_RESPMEM_PERSISTENT); MHD_Response* response = MHD_create_response_from_buffer(0, nullptr, MHD_RESPMEM_PERSISTENT);
return response; return response;
} }
@ -303,27 +312,6 @@ void ContentResponse::set_taskbar(const std::string& bookName, const std::string
} }
RedirectionResponse::RedirectionResponse(bool verbose, const std::string& redirectionUrl):
Response(verbose),
m_redirectionUrl(redirectionUrl)
{
m_returnCode = MHD_HTTP_FOUND;
}
std::unique_ptr<Response> RedirectionResponse::build(const InternalServer& server, const std::string& redirectionUrl)
{
return std::unique_ptr<Response>(new RedirectionResponse(
server.m_verbose.load(),
redirectionUrl));
}
MHD_Response* RedirectionResponse::create_mhd_response(const RequestContext& request)
{
MHD_Response* response = MHD_create_response_from_buffer(0, nullptr, MHD_RESPMEM_MUST_COPY);
MHD_add_response_header(response, MHD_HTTP_HEADER_LOCATION, m_redirectionUrl.c_str());
return response;
}
ContentResponse::ContentResponse(const std::string& root, bool verbose, bool withTaskbar, bool withLibraryButton, bool blockExternalLinks, const std::string& content, const std::string& mimetype) : ContentResponse::ContentResponse(const std::string& root, bool verbose, bool withTaskbar, bool withLibraryButton, bool blockExternalLinks, const std::string& content, const std::string& mimetype) :
Response(verbose), Response(verbose),
m_root(root), m_root(root),

View File

@ -50,6 +50,7 @@ class Response {
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);
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);
MHD_Result send(const RequestContext& request, MHD_Connection* connection); MHD_Result send(const RequestContext& request, MHD_Connection* connection);
@ -75,18 +76,6 @@ class Response {
}; };
class RedirectionResponse : public Response {
public:
RedirectionResponse(bool verbose, const std::string& redirectionUrl);
static std::unique_ptr<Response> build(const InternalServer& server, const std::string& redirectionUrl);
private:
MHD_Response* create_mhd_response(const RequestContext& request);
std::string m_redirectionUrl;
};
class ContentResponse : public Response { class ContentResponse : public Response {
public: public:
ContentResponse(const std::string& root, bool verbose, bool withTaskbar, bool withLibraryButton, bool blockExternalLinks, const std::string& content, const std::string& mimetype); ContentResponse(const std::string& root, bool verbose, bool withTaskbar, bool withLibraryButton, bool blockExternalLinks, const std::string& content, const std::string& mimetype);