diff --git a/src/server/internalServer.cpp b/src/server/internalServer.cpp index d89d77213..17e4111be 100644 --- a/src/server/internalServer.cpp +++ b/src/server/internalServer.cpp @@ -657,7 +657,8 @@ std::unique_ptr InternalServer::handle_catalog(const RequestContext& r host = request.get_header("Host"); url = request.get_url_part(1); } 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") { diff --git a/src/server/response.cpp b/src/server/response.cpp index 822f3d341..8bcd2bb3a 100644 --- a/src/server/response.cpp +++ b/src/server/response.cpp @@ -109,6 +109,15 @@ std::unique_ptr Response::build_404(const InternalServer& serve 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::build_416(const InternalServer& server, size_t resourceLength) { diff --git a/src/server/response.h b/src/server/response.h index ccafa02e9..fa0d9e42d 100644 --- a/src/server/response.h +++ b/src/server/response.h @@ -133,6 +133,55 @@ std::unique_ptr withTaskbarInfo(const std::string& bookName, const zim::Archive* archive, std::unique_ptr 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() const + { + auto r = ContentResponse::build(m_server, m_template, m_data, m_mimeType); + r->set_code(m_httpStatusCode); + return r; + } + + operator std::unique_ptr() const + { + return operator std::unique_ptr(); + } + +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 { public: ItemResponse(bool verbose, const zim::Item& item, const std::string& mimetype, const ByteRange& byterange);