Skip to content

Commit 44e2d91

Browse files
committed
Enable ignoring range header to generate customized response
1 parent 548dfff commit 44e2d91

File tree

2 files changed

+28
-3
lines changed

2 files changed

+28
-3
lines changed

httplib.h

+4-3
Original file line numberDiff line numberDiff line change
@@ -590,6 +590,7 @@ struct Response {
590590
Headers headers;
591591
std::string body;
592592
std::string location; // Redirect location
593+
bool ignore_range = false;
593594

594595
bool has_header(const std::string &key) const;
595596
std::string get_header_value(const std::string &key, size_t id = 0) const;
@@ -6502,7 +6503,7 @@ inline bool Server::dispatch_request(Request &req, Response &res,
65026503
inline void Server::apply_ranges(const Request &req, Response &res,
65036504
std::string &content_type,
65046505
std::string &boundary) const {
6505-
if (req.ranges.size() > 1) {
6506+
if (req.ranges.size() > 1 && !res.ignore_range) {
65066507
auto it = res.headers.find("Content-Type");
65076508
if (it != res.headers.end()) {
65086509
content_type = it->second;
@@ -6520,7 +6521,7 @@ inline void Server::apply_ranges(const Request &req, Response &res,
65206521
if (res.body.empty()) {
65216522
if (res.content_length_ > 0) {
65226523
size_t length = 0;
6523-
if (req.ranges.empty()) {
6524+
if (req.ranges.empty() || res.ignore_range) {
65246525
length = res.content_length_;
65256526
} else if (req.ranges.size() == 1) {
65266527
auto offset_and_length = detail::get_range_offset_and_length(
@@ -6549,7 +6550,7 @@ inline void Server::apply_ranges(const Request &req, Response &res,
65496550
}
65506551
}
65516552
} else {
6552-
if (req.ranges.empty()) {
6553+
if (req.ranges.empty() || res.ignore_range) {
65536554
;
65546555
} else if (req.ranges.size() == 1) {
65556556
auto offset_and_length =

test/test.cc

+24
Original file line numberDiff line numberDiff line change
@@ -1871,6 +1871,12 @@ class ServerTest : public ::testing::Test {
18711871
[&](const Request & /*req*/, Response &res) {
18721872
res.set_content("abcdefg", "text/plain");
18731873
})
1874+
.Get("/with-range-customized-response",
1875+
[&](const Request & /*req*/, Response &res) {
1876+
res.ignore_range = true;
1877+
res.status = StatusCode::BadRequest_400;
1878+
res.set_content(JSON_DATA, "application/json");
1879+
})
18741880
.Post("/chunked",
18751881
[&](const Request &req, Response & /*res*/) {
18761882
EXPECT_EQ(req.body, "dechunked post body");
@@ -3147,6 +3153,24 @@ TEST_F(ServerTest, GetWithRangeMultipartOffsetGreaterThanContent) {
31473153
EXPECT_EQ(StatusCode::RangeNotSatisfiable_416, res->status);
31483154
}
31493155

3156+
TEST_F(ServerTest, GetWithRangeCustomizedResponse) {
3157+
auto res = cli_.Get("/with-range-customized-response", {{make_range_header({{1, 2}})}});
3158+
ASSERT_TRUE(res);
3159+
EXPECT_EQ(StatusCode::BadRequest_400, res->status);
3160+
EXPECT_EQ(true, res->has_header("Content-Length"));
3161+
EXPECT_EQ(false, res->has_header("Content-Range"));
3162+
EXPECT_EQ(JSON_DATA, res->body);
3163+
}
3164+
3165+
TEST_F(ServerTest, GetWithRangeMultipartCustomizedResponseMultipleRange) {
3166+
auto res = cli_.Get("/with-range-customized-response", {{make_range_header({{1, 2}, {4, 5}})}});
3167+
ASSERT_TRUE(res);
3168+
EXPECT_EQ(StatusCode::BadRequest_400, res->status);
3169+
EXPECT_EQ(true, res->has_header("Content-Length"));
3170+
EXPECT_EQ(false, res->has_header("Content-Range"));
3171+
EXPECT_EQ(JSON_DATA, res->body);
3172+
}
3173+
31503174
TEST_F(ServerTest, Issue1772) {
31513175
auto res = cli_.Get("/issue1772", {{make_range_header({{1000, -1}})}});
31523176
ASSERT_TRUE(res);

0 commit comments

Comments
 (0)