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:
Veloman Yunkan 2020-04-16 18:48:32 +04:00
parent 7bd7ec4937
commit 9ec7757efe
3 changed files with 48 additions and 35 deletions

View File

@ -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<Reader>
@ -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());

View File

@ -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)

View File

@ -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; }