Skip to content

Commit 5f0f73f

Browse files
committed
Reduce duplicate computation for ranges
1 parent 530d6ee commit 5f0f73f

File tree

1 file changed

+29
-33
lines changed

1 file changed

+29
-33
lines changed

httplib.h

Lines changed: 29 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -4738,19 +4738,11 @@ get_range_offset_and_length(Range range, size_t content_length) {
47384738
static_cast<size_t>(range.second - range.first) + 1);
47394739
}
47404740

4741-
inline std::pair<size_t, size_t>
4742-
get_range_offset_and_length(const Request &req, size_t content_length,
4743-
size_t index) {
4744-
return get_range_offset_and_length(req.ranges[index], content_length);
4745-
}
4746-
4747-
inline std::string
4748-
make_content_range_header_field(const std::pair<ssize_t, ssize_t> &range,
4749-
size_t content_length) {
4741+
inline std::string make_content_range_header_field(
4742+
const std::pair<size_t, size_t> &offset_and_length, size_t content_length) {
47504743

4751-
auto ret = get_range_offset_and_length(range, content_length);
4752-
auto st = ret.first;
4753-
auto ed = (std::min)(st + ret.second - 1, content_length - 1);
4744+
auto st = offset_and_length.first;
4745+
auto ed = (std::min)(st + offset_and_length.second - 1, content_length - 1);
47544746

47554747
std::string field = "bytes ";
47564748
field += std::to_string(st);
@@ -4777,16 +4769,18 @@ bool process_multipart_ranges_data(const Request &req, Response &res,
47774769
ctoken("\r\n");
47784770
}
47794771

4772+
auto offset_and_length =
4773+
get_range_offset_and_length(req.ranges[i], res.content_length_);
4774+
47804775
ctoken("Content-Range: ");
4781-
const auto &range = req.ranges[i];
4782-
stoken(make_content_range_header_field(range, res.content_length_));
4776+
stoken(make_content_range_header_field(offset_and_length,
4777+
res.content_length_));
47834778
ctoken("\r\n");
47844779
ctoken("\r\n");
47854780

4786-
auto ret = get_range_offset_and_length(req, res.content_length_, i);
4787-
auto offset = ret.first;
4788-
auto length = ret.second;
4789-
if (!content(offset, length)) { return false; }
4781+
if (!content(offset_and_length.first, offset_and_length.second)) {
4782+
return false;
4783+
}
47904784
ctoken("\r\n");
47914785
}
47924786

@@ -6043,12 +6037,12 @@ Server::write_content_with_provider(Stream &strm, const Request &req,
60436037
return detail::write_content(strm, res.content_provider_, 0,
60446038
res.content_length_, is_shutting_down);
60456039
} else if (req.ranges.size() == 1) {
6046-
auto ret =
6047-
detail::get_range_offset_and_length(req, res.content_length_, 0);
6048-
auto offset = ret.first;
6049-
auto length = ret.second;
6050-
return detail::write_content(strm, res.content_provider_, offset, length,
6051-
is_shutting_down);
6040+
auto offset_and_length = detail::get_range_offset_and_length(
6041+
req.ranges[0], res.content_length_);
6042+
6043+
return detail::write_content(strm, res.content_provider_,
6044+
offset_and_length.first,
6045+
offset_and_length.second, is_shutting_down);
60526046
} else {
60536047
return detail::write_multipart_ranges_data(
60546048
strm, req, res, boundary, content_type, is_shutting_down);
@@ -6463,12 +6457,13 @@ inline void Server::apply_ranges(const Request &req, Response &res,
64636457
if (req.ranges.empty()) {
64646458
length = res.content_length_;
64656459
} else if (req.ranges.size() == 1) {
6466-
auto ret =
6467-
detail::get_range_offset_and_length(req, res.content_length_, 0);
6468-
length = ret.second;
6460+
auto offset_and_length = detail::get_range_offset_and_length(
6461+
req.ranges[0], res.content_length_);
6462+
6463+
length = offset_and_length.second;
64696464

64706465
auto content_range = detail::make_content_range_header_field(
6471-
req.ranges[0], res.content_length_);
6466+
offset_and_length, res.content_length_);
64726467
res.set_header("Content-Range", content_range);
64736468
} else {
64746469
length = detail::get_multipart_ranges_data_length(req, res, boundary,
@@ -6491,14 +6486,15 @@ inline void Server::apply_ranges(const Request &req, Response &res,
64916486
if (req.ranges.empty()) {
64926487
;
64936488
} else if (req.ranges.size() == 1) {
6489+
auto offset_and_length =
6490+
detail::get_range_offset_and_length(req.ranges[0], res.body.size());
6491+
auto offset = offset_and_length.first;
6492+
auto length = offset_and_length.second;
6493+
64946494
auto content_range = detail::make_content_range_header_field(
6495-
req.ranges[0], res.body.size());
6495+
offset_and_length, res.body.size());
64966496
res.set_header("Content-Range", content_range);
64976497

6498-
auto ret = detail::get_range_offset_and_length(req, res.body.size(), 0);
6499-
auto offset = ret.first;
6500-
auto length = ret.second;
6501-
65026498
if (offset < res.body.size()) {
65036499
res.body = res.body.substr(offset, length);
65046500
} else {

0 commit comments

Comments
 (0)