mirror of https://github.com/kiwix/libkiwix.git
Refactoring: smart Response::set_entry()
Response::set_entry() was upgraded from a simple setter to a method performing certain business logic that was previously taken care of by InternalServer::handle_content().
This commit is contained in:
parent
7bd7ec4937
commit
9ec7757efe
|
@ -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
|
} // unnamed namespace
|
||||||
|
|
||||||
std::shared_ptr<Reader>
|
std::shared_ptr<Reader>
|
||||||
|
@ -935,25 +921,7 @@ Response InternalServer::handle_content(const RequestContext& request)
|
||||||
|
|
||||||
auto response = get_default_response();
|
auto response = get_default_response();
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////
|
response.set_entry(entry, request);
|
||||||
// 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()
|
|
||||||
///////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
if (mimeType.find("text/html") != string::npos)
|
if (mimeType.find("text/html") != string::npos)
|
||||||
response.set_taskbar(bookName, reader->getTitle());
|
response.set_taskbar(bookName, reader->getTitle());
|
||||||
|
|
|
@ -17,6 +17,35 @@
|
||||||
|
|
||||||
namespace kiwix {
|
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)
|
Response::Response(const std::string& root, bool verbose, bool withTaskbar, bool withLibraryButton, bool blockExternalLinks)
|
||||||
: m_verbose(verbose),
|
: m_verbose(verbose),
|
||||||
m_root(root),
|
m_root(root),
|
||||||
|
@ -269,9 +298,25 @@ void Response::set_redirection(const std::string& url) {
|
||||||
m_returnCode = MHD_HTTP_FOUND;
|
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_entry = entry;
|
||||||
m_mode = ResponseMode::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)
|
void Response::set_taskbar(const std::string& bookName, const std::string& bookTitle)
|
||||||
|
|
|
@ -50,7 +50,7 @@ class Response {
|
||||||
void set_template(const std::string& template_str, kainjow::mustache::data data);
|
void set_template(const std::string& template_str, kainjow::mustache::data data);
|
||||||
void set_content(const std::string& content);
|
void set_content(const std::string& content);
|
||||||
void set_redirection(const std::string& url);
|
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; }
|
void set_mimeType(const std::string& mimeType) { m_mimeType = mimeType; }
|
||||||
|
|
Loading…
Reference in New Issue