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:
Kent 2024-04-12 11:28:21 +08:00 committed by GitHub
parent 2064462c35
commit 560854a961
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 26 additions and 3 deletions

View file

@ -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 =

View file

@ -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);