Response::m_byteRange

This commit is contained in:
Veloman Yunkan 2020-05-23 20:35:22 +04:00
parent 0c5bb3fcfe
commit d111a40ce8
3 changed files with 15 additions and 18 deletions

View File

@ -31,6 +31,7 @@ class ByteRange
int64_t first() const { return first_; } int64_t first() const { return first_; }
int64_t last() const { return last_; } int64_t last() const { return last_; }
int64_t length() const { return last_ + 1 - first_; }
private: // data private: // data
int64_t first_; int64_t first_;

View File

@ -39,12 +39,13 @@ bool is_compressible_mime_type(const std::string& mimeType)
|| mimeType.find("application/json") != string::npos; || mimeType.find("application/json") != string::npos;
} }
int get_range_len(const kiwix::Entry& entry, ByteRange range) ByteRange resolve_byte_range(const kiwix::Entry& entry, ByteRange range)
{ {
const int64_t entrySize = entry.getSize(); const int64_t entrySize = entry.getSize();
return range.last() == -1 const int64_t resolved_last = range.last() < 0
? entrySize - range.first() ? entrySize - 1
: std::min(range.last() + 1, entrySize) - range.first(); : std::min(entrySize-1, range.last());
return ByteRange(range.first(), resolved_last);
} }
} // unnamed namespace } // unnamed namespace
@ -59,9 +60,7 @@ Response::Response(const std::string& root, bool verbose, bool withTaskbar, bool
m_withLibraryButton(withLibraryButton), m_withLibraryButton(withLibraryButton),
m_blockExternalLinks(blockExternalLinks), m_blockExternalLinks(blockExternalLinks),
m_addTaskbar(false), m_addTaskbar(false),
m_bookName(""), m_bookName("")
m_startRange(0),
m_lenRange(0)
{ {
} }
@ -241,23 +240,24 @@ Response::create_redirection_mhd_response() const
MHD_Response* MHD_Response*
Response::create_entry_mhd_response() const Response::create_entry_mhd_response() const
{ {
MHD_Response* response = MHD_create_response_from_callback(m_lenRange, const auto content_length = m_byteRange.length();
MHD_Response* response = MHD_create_response_from_callback(content_length,
16384, 16384,
callback_reader_from_entry, callback_reader_from_entry,
new RunningResponse(m_entry, m_startRange), new RunningResponse(m_entry, m_byteRange.first()),
callback_free_response); callback_free_response);
MHD_add_response_header(response, MHD_add_response_header(response,
MHD_HTTP_HEADER_CONTENT_TYPE, m_mimeType.c_str()); MHD_HTTP_HEADER_CONTENT_TYPE, m_mimeType.c_str());
MHD_add_response_header(response, MHD_HTTP_HEADER_ACCEPT_RANGES, "bytes"); MHD_add_response_header(response, MHD_HTTP_HEADER_ACCEPT_RANGES, "bytes");
std::ostringstream oss; std::ostringstream oss;
oss << "bytes " << m_startRange << "-" << m_startRange + m_lenRange - 1 oss << "bytes " << m_byteRange.first() << "-" << m_byteRange.last()
<< "/" << m_entry.getSize(); << "/" << m_entry.getSize();
MHD_add_response_header(response, MHD_add_response_header(response,
MHD_HTTP_HEADER_CONTENT_RANGE, oss.str().c_str()); MHD_HTTP_HEADER_CONTENT_RANGE, oss.str().c_str());
MHD_add_response_header(response, MHD_add_response_header(response,
MHD_HTTP_HEADER_CONTENT_LENGTH, kiwix::to_string(m_lenRange).c_str()); MHD_HTTP_HEADER_CONTENT_LENGTH, kiwix::to_string(content_length).c_str());
return response; return response;
} }
@ -329,9 +329,7 @@ void Response::set_entry(const Entry& entry, const RequestContext& request) {
set_content(content); set_content(content);
set_compress(true); set_compress(true);
} else { } else {
const int range_len = get_range_len(entry, request.get_range()); m_byteRange = resolve_byte_range(entry, request.get_range());
set_range_first(request.get_range().first());
set_range_len(range_len);
} }
} }

View File

@ -24,6 +24,7 @@
#include <string> #include <string>
#include <mustache.hpp> #include <mustache.hpp>
#include "byte_range.h"
#include "entry.h" #include "entry.h"
#include "etag.h" #include "etag.h"
@ -61,8 +62,6 @@ class Response {
void set_etag(const ETag& etag) { m_etag = etag; } void set_etag(const ETag& etag) { m_etag = etag; }
void set_compress(bool compress) { m_compress = compress; } void set_compress(bool compress) { m_compress = compress; }
void set_taskbar(const std::string& bookName, const std::string& bookTitle); void set_taskbar(const std::string& bookName, const std::string& bookTitle);
void set_range_first(uint64_t start) { m_startRange = start; }
void set_range_len(uint64_t len) { m_lenRange = len; }
int getReturnCode() const { return m_returnCode; } int getReturnCode() const { return m_returnCode; }
std::string get_mimeType() const { return m_mimeType; } std::string get_mimeType() const { return m_mimeType; }
@ -93,8 +92,7 @@ class Response {
bool m_addTaskbar; bool m_addTaskbar;
std::string m_bookName; std::string m_bookName;
std::string m_bookTitle; std::string m_bookTitle;
uint64_t m_startRange; ByteRange m_byteRange;
uint64_t m_lenRange;
ETag m_etag; ETag m_etag;
}; };