Enter ContentResponseBlueprint

This commit is contained in:
Veloman Yunkan 2022-01-22 23:02:06 +04:00 committed by Matthieu Gautier
parent ff8da65c68
commit df98c58d07
3 changed files with 60 additions and 1 deletions

View File

@ -657,7 +657,8 @@ 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 Response::build_404(*this, request.get_full_url()); return make404Response(*this, request)
+ make404ResponseData(request.get_full_url());
} }
if (url == "v2") { if (url == "v2") {

View File

@ -109,6 +109,15 @@ std::unique_ptr<ContentResponse> Response::build_404(const InternalServer& serve
return response; return response;
} }
ContentResponseBlueprint make404Response(const InternalServer& server,
const RequestContext& request)
{
return ContentResponseBlueprint(&server,
&request,
MHD_HTTP_NOT_FOUND,
"text/html",
RESOURCE::templates::_404_html);
}
std::unique_ptr<Response> Response::build_416(const InternalServer& server, size_t resourceLength) std::unique_ptr<Response> Response::build_416(const InternalServer& server, size_t resourceLength)
{ {

View File

@ -133,6 +133,55 @@ std::unique_ptr<ContentResponse> withTaskbarInfo(const std::string& bookName,
const zim::Archive* archive, const zim::Archive* archive,
std::unique_ptr<ContentResponse> r); std::unique_ptr<ContentResponse> r);
class ContentResponseBlueprint
{
public: // functions
ContentResponseBlueprint(const InternalServer* server,
const RequestContext* request,
int httpStatusCode,
const std::string& mimeType,
const std::string& templateStr)
: m_server(*server)
, m_request(*request)
, m_httpStatusCode(httpStatusCode)
, m_mimeType(mimeType)
, m_template(templateStr)
{}
ContentResponseBlueprint& operator+(kainjow::mustache::data&& data)
{
this->m_data = std::move(data);
return *this;
}
operator std::unique_ptr<ContentResponse>() const
{
auto r = ContentResponse::build(m_server, m_template, m_data, m_mimeType);
r->set_code(m_httpStatusCode);
return r;
}
operator std::unique_ptr<Response>() const
{
return operator std::unique_ptr<ContentResponse>();
}
private: // data
const InternalServer& m_server;
const RequestContext& m_request;
const int m_httpStatusCode;
const std::string m_mimeType;
const std::string m_template;
kainjow::mustache::data m_data;
};
ContentResponseBlueprint make404Response(const InternalServer& server,
const RequestContext& request);
kainjow::mustache::data make404ResponseData(const std::string& url,
const std::string& details = "");
class ItemResponse : public Response { class ItemResponse : public Response {
public: public:
ItemResponse(bool verbose, const zim::Item& item, const std::string& mimetype, const ByteRange& byterange); ItemResponse(bool verbose, const zim::Item& item, const std::string& mimetype, const ByteRange& byterange);