Skip to content

Commit 420c975

Browse files
committed
Fix #1694
1 parent 2ce7c22 commit 420c975

File tree

2 files changed

+54
-41
lines changed

2 files changed

+54
-41
lines changed

httplib.h

Lines changed: 37 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
#ifndef CPPHTTPLIB_HTTPLIB_H
99
#define CPPHTTPLIB_HTTPLIB_H
1010

11-
#define CPPHTTPLIB_VERSION "0.15.0"
11+
#define CPPHTTPLIB_VERSION "0.14.3"
1212

1313
/*
1414
* Configuration
@@ -141,11 +141,11 @@ using ssize_t = long;
141141
#endif // _MSC_VER
142142

143143
#ifndef S_ISREG
144-
#define S_ISREG(m) (((m)&S_IFREG) == S_IFREG)
144+
#define S_ISREG(m) (((m) & S_IFREG) == S_IFREG)
145145
#endif // S_ISREG
146146

147147
#ifndef S_ISDIR
148-
#define S_ISDIR(m) (((m)&S_IFDIR) == S_IFDIR)
148+
#define S_ISDIR(m) (((m) & S_IFDIR) == S_IFDIR)
149149
#endif // S_ISDIR
150150

151151
#ifndef NOMINMAX
@@ -4647,7 +4647,8 @@ inline std::string random_string(size_t length) {
46474647
static std::random_device seed_gen;
46484648

46494649
// Request 128 bits of entropy for initialization
4650-
static std::seed_seq seed_sequence{seed_gen(), seed_gen(), seed_gen(), seed_gen()};
4650+
static std::seed_seq seed_sequence{seed_gen(), seed_gen(), seed_gen(),
4651+
seed_gen()};
46514652

46524653
static std::mt19937 engine(seed_sequence);
46534654

@@ -4720,32 +4721,41 @@ serialize_multipart_formdata(const MultipartFormDataItems &items,
47204721
}
47214722

47224723
inline std::pair<size_t, size_t>
4723-
get_range_offset_and_length(const Request &req, size_t content_length,
4724-
size_t index) {
4725-
auto r = req.ranges[index];
4726-
4727-
if (r.first == -1 && r.second == -1) {
4724+
get_range_offset_and_length(Range range, size_t content_length) {
4725+
if (range.first == -1 && range.second == -1) {
47284726
return std::make_pair(0, content_length);
47294727
}
47304728

47314729
auto slen = static_cast<ssize_t>(content_length);
47324730

4733-
if (r.first == -1) {
4734-
r.first = (std::max)(static_cast<ssize_t>(0), slen - r.second);
4735-
r.second = slen - 1;
4731+
if (range.first == -1) {
4732+
range.first = (std::max)(static_cast<ssize_t>(0), slen - range.second);
4733+
range.second = slen - 1;
47364734
}
47374735

4738-
if (r.second == -1) { r.second = slen - 1; }
4739-
return std::make_pair(r.first, static_cast<size_t>(r.second - r.first) + 1);
4736+
if (range.second == -1) { range.second = slen - 1; }
4737+
return std::make_pair(range.first,
4738+
static_cast<size_t>(range.second - range.first) + 1);
4739+
}
4740+
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);
47404745
}
47414746

47424747
inline std::string
47434748
make_content_range_header_field(const std::pair<ssize_t, ssize_t> &range,
47444749
size_t content_length) {
4750+
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);
4754+
47454755
std::string field = "bytes ";
4746-
if (range.first != -1) { field += std::to_string(range.first); }
4756+
field += std::to_string(st);
47474757
field += "-";
4748-
if (range.second != -1) { field += std::to_string(range.second); }
4758+
field += std::to_string(ed);
47494759
field += "/";
47504760
field += std::to_string(content_length);
47514761
return field;
@@ -4773,9 +4783,9 @@ bool process_multipart_ranges_data(const Request &req, Response &res,
47734783
ctoken("\r\n");
47744784
ctoken("\r\n");
47754785

4776-
auto offsets = get_range_offset_and_length(req, res.content_length_, i);
4777-
auto offset = offsets.first;
4778-
auto length = offsets.second;
4786+
auto ret = get_range_offset_and_length(req, res.content_length_, i);
4787+
auto offset = ret.first;
4788+
auto length = ret.second;
47794789
if (!content(offset, length)) { return false; }
47804790
ctoken("\r\n");
47814791
}
@@ -4838,18 +4848,6 @@ inline bool write_multipart_ranges_data(Stream &strm, const Request &req,
48384848
});
48394849
}
48404850

4841-
inline std::pair<size_t, size_t>
4842-
get_range_offset_and_length(const Request &req, const Response &res,
4843-
size_t index) {
4844-
auto r = req.ranges[index];
4845-
4846-
if (r.second == -1) {
4847-
r.second = static_cast<ssize_t>(res.content_length_) - 1;
4848-
}
4849-
4850-
return std::make_pair(r.first, r.second - r.first + 1);
4851-
}
4852-
48534851
inline bool expect_content(const Request &req) {
48544852
if (req.method == "POST" || req.method == "PUT" || req.method == "PATCH" ||
48554853
req.method == "PRI" || req.method == "DELETE") {
@@ -6045,10 +6043,10 @@ Server::write_content_with_provider(Stream &strm, const Request &req,
60456043
return detail::write_content(strm, res.content_provider_, 0,
60466044
res.content_length_, is_shutting_down);
60476045
} else if (req.ranges.size() == 1) {
6048-
auto offsets =
6046+
auto ret =
60496047
detail::get_range_offset_and_length(req, res.content_length_, 0);
6050-
auto offset = offsets.first;
6051-
auto length = offsets.second;
6048+
auto offset = ret.first;
6049+
auto length = ret.second;
60526050
return detail::write_content(strm, res.content_provider_, offset, length,
60536051
is_shutting_down);
60546052
} else {
@@ -6465,9 +6463,9 @@ inline void Server::apply_ranges(const Request &req, Response &res,
64656463
if (req.ranges.empty()) {
64666464
length = res.content_length_;
64676465
} else if (req.ranges.size() == 1) {
6468-
auto offsets =
6466+
auto ret =
64696467
detail::get_range_offset_and_length(req, res.content_length_, 0);
6470-
length = offsets.second;
6468+
length = ret.second;
64716469

64726470
auto content_range = detail::make_content_range_header_field(
64736471
req.ranges[0], res.content_length_);
@@ -6497,10 +6495,9 @@ inline void Server::apply_ranges(const Request &req, Response &res,
64976495
req.ranges[0], res.body.size());
64986496
res.set_header("Content-Range", content_range);
64996497

6500-
auto offsets =
6501-
detail::get_range_offset_and_length(req, res.body.size(), 0);
6502-
auto offset = offsets.first;
6503-
auto length = offsets.second;
6498+
auto ret = detail::get_range_offset_and_length(req, res.body.size(), 0);
6499+
auto offset = ret.first;
6500+
auto length = ret.second;
65046501

65056502
if (offset < res.body.size()) {
65066503
res.body = res.body.substr(offset, length);

test/test.cc

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2540,6 +2540,7 @@ TEST_F(ServerTest, StaticFileRange) {
25402540
EXPECT_EQ("text/abcde", res->get_header_value("Content-Type"));
25412541
EXPECT_EQ("2", res->get_header_value("Content-Length"));
25422542
EXPECT_EQ(true, res->has_header("Content-Range"));
2543+
EXPECT_EQ("bytes 2-3/5", res->get_header_value("Content-Range"));
25432544
EXPECT_EQ(std::string("cd"), res->body);
25442545
}
25452546

@@ -2553,7 +2554,7 @@ TEST_F(ServerTest, StaticFileRanges) {
25532554
.find(
25542555
"multipart/byteranges; boundary=--cpp-httplib-multipart-data-") ==
25552556
0);
2556-
EXPECT_EQ("265", res->get_header_value("Content-Length"));
2557+
EXPECT_EQ("266", res->get_header_value("Content-Length"));
25572558
}
25582559

25592560
TEST_F(ServerTest, StaticFileRangeHead) {
@@ -2563,6 +2564,7 @@ TEST_F(ServerTest, StaticFileRangeHead) {
25632564
EXPECT_EQ("text/abcde", res->get_header_value("Content-Type"));
25642565
EXPECT_EQ("2", res->get_header_value("Content-Length"));
25652566
EXPECT_EQ(true, res->has_header("Content-Range"));
2567+
EXPECT_EQ("bytes 2-3/5", res->get_header_value("Content-Range"));
25662568
}
25672569

25682570
TEST_F(ServerTest, StaticFileRangeBigFile) {
@@ -2572,6 +2574,8 @@ TEST_F(ServerTest, StaticFileRangeBigFile) {
25722574
EXPECT_EQ("text/plain", res->get_header_value("Content-Type"));
25732575
EXPECT_EQ("5", res->get_header_value("Content-Length"));
25742576
EXPECT_EQ(true, res->has_header("Content-Range"));
2577+
EXPECT_EQ("bytes 1048571-1048575/1048576",
2578+
res->get_header_value("Content-Range"));
25752579
EXPECT_EQ("LAST\n", res->body);
25762580
}
25772581

@@ -2582,6 +2586,7 @@ TEST_F(ServerTest, StaticFileRangeBigFile2) {
25822586
EXPECT_EQ("text/plain", res->get_header_value("Content-Type"));
25832587
EXPECT_EQ("4097", res->get_header_value("Content-Length"));
25842588
EXPECT_EQ(true, res->has_header("Content-Range"));
2589+
EXPECT_EQ("bytes 1-4097/1048576", res->get_header_value("Content-Range"));
25852590
}
25862591

25872592
TEST_F(ServerTest, StaticFileBigFile) {
@@ -2908,6 +2913,8 @@ TEST_F(ServerTest, GetStreamed2) {
29082913
ASSERT_TRUE(res);
29092914
EXPECT_EQ(StatusCode::PartialContent_206, res->status);
29102915
EXPECT_EQ("2", res->get_header_value("Content-Length"));
2916+
EXPECT_EQ(true, res->has_header("Content-Range"));
2917+
EXPECT_EQ("bytes 2-3/6", res->get_header_value("Content-Range"));
29112918
EXPECT_EQ(std::string("ab"), res->body);
29122919
}
29132920

@@ -2925,6 +2932,7 @@ TEST_F(ServerTest, GetStreamedWithRange1) {
29252932
EXPECT_EQ(StatusCode::PartialContent_206, res->status);
29262933
EXPECT_EQ("3", res->get_header_value("Content-Length"));
29272934
EXPECT_EQ(true, res->has_header("Content-Range"));
2935+
EXPECT_EQ("bytes 3-5/7", res->get_header_value("Content-Range"));
29282936
EXPECT_EQ(std::string("def"), res->body);
29292937
}
29302938

@@ -2934,6 +2942,7 @@ TEST_F(ServerTest, GetStreamedWithRange2) {
29342942
EXPECT_EQ(StatusCode::PartialContent_206, res->status);
29352943
EXPECT_EQ("6", res->get_header_value("Content-Length"));
29362944
EXPECT_EQ(true, res->has_header("Content-Range"));
2945+
EXPECT_EQ("bytes 1-6/7", res->get_header_value("Content-Range"));
29372946
EXPECT_EQ(std::string("bcdefg"), res->body);
29382947
}
29392948

@@ -2943,6 +2952,7 @@ TEST_F(ServerTest, GetStreamedWithRangeSuffix1) {
29432952
EXPECT_EQ(StatusCode::PartialContent_206, res->status);
29442953
EXPECT_EQ("3", res->get_header_value("Content-Length"));
29452954
EXPECT_EQ(true, res->has_header("Content-Range"));
2955+
EXPECT_EQ("bytes 4-6/7", res->get_header_value("Content-Range"));
29462956
EXPECT_EQ(std::string("efg"), res->body);
29472957
}
29482958

@@ -2952,6 +2962,7 @@ TEST_F(ServerTest, GetStreamedWithRangeSuffix2) {
29522962
EXPECT_EQ(StatusCode::PartialContent_206, res->status);
29532963
EXPECT_EQ("7", res->get_header_value("Content-Length"));
29542964
EXPECT_EQ(true, res->has_header("Content-Range"));
2965+
EXPECT_EQ("bytes 0-6/7", res->get_header_value("Content-Range"));
29552966
EXPECT_EQ(std::string("abcdefg"), res->body);
29562967
}
29572968

@@ -2968,6 +2979,7 @@ TEST_F(ServerTest, GetRangeWithMaxLongLength) {
29682979
cli_.Get("/with-range", {{"Range", "bytes=0-9223372036854775807"}});
29692980
EXPECT_EQ(StatusCode::PartialContent_206, res->status);
29702981
EXPECT_EQ("7", res->get_header_value("Content-Length"));
2982+
EXPECT_EQ("bytes 0-6/7", res->get_header_value("Content-Range"));
29712983
EXPECT_EQ(true, res->has_header("Content-Range"));
29722984
EXPECT_EQ(std::string("abcdefg"), res->body);
29732985
}
@@ -3029,6 +3041,7 @@ TEST_F(ServerTest, GetWithRange1) {
30293041
EXPECT_EQ(StatusCode::PartialContent_206, res->status);
30303042
EXPECT_EQ("3", res->get_header_value("Content-Length"));
30313043
EXPECT_EQ(true, res->has_header("Content-Range"));
3044+
EXPECT_EQ("bytes 3-5/7", res->get_header_value("Content-Range"));
30323045
EXPECT_EQ(std::string("def"), res->body);
30333046
}
30343047

@@ -3038,6 +3051,7 @@ TEST_F(ServerTest, GetWithRange2) {
30383051
EXPECT_EQ(StatusCode::PartialContent_206, res->status);
30393052
EXPECT_EQ("6", res->get_header_value("Content-Length"));
30403053
EXPECT_EQ(true, res->has_header("Content-Range"));
3054+
EXPECT_EQ("bytes 1-6/7", res->get_header_value("Content-Range"));
30413055
EXPECT_EQ(std::string("bcdefg"), res->body);
30423056
}
30433057

@@ -3047,6 +3061,7 @@ TEST_F(ServerTest, GetWithRange3) {
30473061
EXPECT_EQ(StatusCode::PartialContent_206, res->status);
30483062
EXPECT_EQ("1", res->get_header_value("Content-Length"));
30493063
EXPECT_EQ(true, res->has_header("Content-Range"));
3064+
EXPECT_EQ("bytes 0-0/7", res->get_header_value("Content-Range"));
30503065
EXPECT_EQ(std::string("a"), res->body);
30513066
}
30523067

@@ -3056,6 +3071,7 @@ TEST_F(ServerTest, GetWithRange4) {
30563071
EXPECT_EQ(StatusCode::PartialContent_206, res->status);
30573072
EXPECT_EQ("2", res->get_header_value("Content-Length"));
30583073
EXPECT_EQ(true, res->has_header("Content-Range"));
3074+
EXPECT_EQ("bytes 5-6/7", res->get_header_value("Content-Range"));
30593075
EXPECT_EQ(std::string("fg"), res->body);
30603076
}
30613077

0 commit comments

Comments
 (0)