diff --git a/src/server.cpp b/src/server.cpp index 72541d408..d3845f2e4 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -853,20 +853,6 @@ std::string get_mime_type(const kiwix::Entry& entry) } } -bool is_compressible_mime_type(const std::string& mimeType) -{ - return mimeType.find("text/") != string::npos - || mimeType.find("application/javascript") != string::npos - || mimeType.find("application/json") != string::npos; -} - -int get_range_len(const kiwix::Entry& entry, RequestContext::ByteRange range) -{ - return range.second == -1 - ? entry.getSize() - range.first - : range.second - range.first; -} - } // unnamed namespace std::shared_ptr @@ -935,25 +921,7 @@ Response InternalServer::handle_content(const RequestContext& request) auto response = get_default_response(); - /////////////////////////////////////////////////////////// - // This chunk of code should go into Response::set_entry() - response.set_mimeType(mimeType); - response.set_cache(true); - - if ( is_compressible_mime_type(mimeType) ) { - zim::Blob raw_content = entry.getBlob(); - const std::string content = string(raw_content.data(), raw_content.size()); - - response.set_content(content); - response.set_compress(true); - } else { - const int range_len = get_range_len(entry, request.get_range()); - response.set_entry(entry); - response.set_range_first(request.get_range().first); - response.set_range_len(range_len); - } - // This chunk of code should go into Response::set_entry() - /////////////////////////////////////////////////////////// + response.set_entry(entry, request); if (mimeType.find("text/html") != string::npos) response.set_taskbar(bookName, reader->getTitle()); diff --git a/src/server/response.cpp b/src/server/response.cpp index 5c7482152..7540fd687 100644 --- a/src/server/response.cpp +++ b/src/server/response.cpp @@ -17,6 +17,35 @@ namespace kiwix { +namespace +{ +// some utilities + +std::string get_mime_type(const kiwix::Entry& entry) +{ + try { + return entry.getMimetype(); + } catch (exception& e) { + return "application/octet-stream"; + } +} + +bool is_compressible_mime_type(const std::string& mimeType) +{ + return mimeType.find("text/") != string::npos + || mimeType.find("application/javascript") != string::npos + || mimeType.find("application/json") != string::npos; +} + +int get_range_len(const kiwix::Entry& entry, RequestContext::ByteRange range) +{ + return range.second == -1 + ? entry.getSize() - range.first + : range.second - range.first; +} + +} // unnamed namespace + Response::Response(const std::string& root, bool verbose, bool withTaskbar, bool withLibraryButton, bool blockExternalLinks) : m_verbose(verbose), m_root(root), @@ -269,9 +298,25 @@ void Response::set_redirection(const std::string& url) { m_returnCode = MHD_HTTP_FOUND; } -void Response::set_entry(const Entry& entry) { +void Response::set_entry(const Entry& entry, const RequestContext& request) { m_entry = entry; m_mode = ResponseMode::ENTRY; + + const std::string mimeType = get_mime_type(entry); + set_mimeType(mimeType); + set_cache(true); + + if ( is_compressible_mime_type(mimeType) ) { + zim::Blob raw_content = entry.getBlob(); + const std::string content = string(raw_content.data(), raw_content.size()); + + set_content(content); + set_compress(true); + } else { + const int range_len = get_range_len(entry, request.get_range()); + set_range_first(request.get_range().first); + set_range_len(range_len); + } } void Response::set_taskbar(const std::string& bookName, const std::string& bookTitle) diff --git a/src/server/response.h b/src/server/response.h index d3223673d..9ae0b8854 100644 --- a/src/server/response.h +++ b/src/server/response.h @@ -50,7 +50,7 @@ class Response { void set_template(const std::string& template_str, kainjow::mustache::data data); void set_content(const std::string& content); void set_redirection(const std::string& url); - void set_entry(const Entry& entry); + void set_entry(const Entry& entry, const RequestContext& request); void set_mimeType(const std::string& mimeType) { m_mimeType = mimeType; }