mirror of
https://github.com/yhirose/cpp-httplib
synced 2024-11-21 14:29:10 -07:00
Apply range header base on response status code (#1806)
* Enable ignoring range header to generate customized response * Apply range header base on response status code
This commit is contained in:
parent
2064462c35
commit
560854a961
2 changed files with 26 additions and 3 deletions
|
@ -6521,7 +6521,7 @@ inline bool Server::dispatch_request(Request &req, Response &res,
|
||||||
inline void Server::apply_ranges(const Request &req, Response &res,
|
inline void Server::apply_ranges(const Request &req, Response &res,
|
||||||
std::string &content_type,
|
std::string &content_type,
|
||||||
std::string &boundary) const {
|
std::string &boundary) const {
|
||||||
if (req.ranges.size() > 1) {
|
if (req.ranges.size() > 1 && res.status == StatusCode::PartialContent_206) {
|
||||||
auto it = res.headers.find("Content-Type");
|
auto it = res.headers.find("Content-Type");
|
||||||
if (it != res.headers.end()) {
|
if (it != res.headers.end()) {
|
||||||
content_type = it->second;
|
content_type = it->second;
|
||||||
|
@ -6539,7 +6539,7 @@ inline void Server::apply_ranges(const Request &req, Response &res,
|
||||||
if (res.body.empty()) {
|
if (res.body.empty()) {
|
||||||
if (res.content_length_ > 0) {
|
if (res.content_length_ > 0) {
|
||||||
size_t length = 0;
|
size_t length = 0;
|
||||||
if (req.ranges.empty()) {
|
if (req.ranges.empty() || res.status != StatusCode::PartialContent_206) {
|
||||||
length = res.content_length_;
|
length = res.content_length_;
|
||||||
} else if (req.ranges.size() == 1) {
|
} else if (req.ranges.size() == 1) {
|
||||||
auto offset_and_length = detail::get_range_offset_and_length(
|
auto offset_and_length = detail::get_range_offset_and_length(
|
||||||
|
@ -6568,7 +6568,7 @@ inline void Server::apply_ranges(const Request &req, Response &res,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (req.ranges.empty()) {
|
if (req.ranges.empty() || res.status != StatusCode::PartialContent_206) {
|
||||||
;
|
;
|
||||||
} else if (req.ranges.size() == 1) {
|
} else if (req.ranges.size() == 1) {
|
||||||
auto offset_and_length =
|
auto offset_and_length =
|
||||||
|
|
23
test/test.cc
23
test/test.cc
|
@ -1890,6 +1890,11 @@ protected:
|
||||||
[&](const Request & /*req*/, Response &res) {
|
[&](const Request & /*req*/, Response &res) {
|
||||||
res.set_content("abcdefg", "text/plain");
|
res.set_content("abcdefg", "text/plain");
|
||||||
})
|
})
|
||||||
|
.Get("/with-range-customized-response",
|
||||||
|
[&](const Request & /*req*/, Response &res) {
|
||||||
|
res.status = StatusCode::BadRequest_400;
|
||||||
|
res.set_content(JSON_DATA, "application/json");
|
||||||
|
})
|
||||||
.Post("/chunked",
|
.Post("/chunked",
|
||||||
[&](const Request &req, Response & /*res*/) {
|
[&](const Request &req, Response & /*res*/) {
|
||||||
EXPECT_EQ(req.body, "dechunked post body");
|
EXPECT_EQ(req.body, "dechunked post body");
|
||||||
|
@ -3166,6 +3171,24 @@ TEST_F(ServerTest, GetWithRangeMultipartOffsetGreaterThanContent) {
|
||||||
EXPECT_EQ(StatusCode::RangeNotSatisfiable_416, res->status);
|
EXPECT_EQ(StatusCode::RangeNotSatisfiable_416, res->status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(ServerTest, GetWithRangeCustomizedResponse) {
|
||||||
|
auto res = cli_.Get("/with-range-customized-response", {{make_range_header({{1, 2}})}});
|
||||||
|
ASSERT_TRUE(res);
|
||||||
|
EXPECT_EQ(StatusCode::BadRequest_400, res->status);
|
||||||
|
EXPECT_EQ(true, res->has_header("Content-Length"));
|
||||||
|
EXPECT_EQ(false, res->has_header("Content-Range"));
|
||||||
|
EXPECT_EQ(JSON_DATA, res->body);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(ServerTest, GetWithRangeMultipartCustomizedResponseMultipleRange) {
|
||||||
|
auto res = cli_.Get("/with-range-customized-response", {{make_range_header({{1, 2}, {4, 5}})}});
|
||||||
|
ASSERT_TRUE(res);
|
||||||
|
EXPECT_EQ(StatusCode::BadRequest_400, res->status);
|
||||||
|
EXPECT_EQ(true, res->has_header("Content-Length"));
|
||||||
|
EXPECT_EQ(false, res->has_header("Content-Range"));
|
||||||
|
EXPECT_EQ(JSON_DATA, res->body);
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(ServerTest, Issue1772) {
|
TEST_F(ServerTest, Issue1772) {
|
||||||
auto res = cli_.Get("/issue1772", {{make_range_header({{1000, -1}})}});
|
auto res = cli_.Get("/issue1772", {{make_range_header({{1000, -1}})}});
|
||||||
ASSERT_TRUE(res);
|
ASSERT_TRUE(res);
|
||||||
|
|
Loading…
Reference in a new issue