From d647f484a48ae59b429e7e3a86e2b8b3fc493167 Mon Sep 17 00:00:00 2001 From: sinnren <111736305+sinnren@users.noreply.github.com> Date: Tue, 24 Dec 2024 22:38:59 +0800 Subject: [PATCH] fix:set_file_content with range request return 416. (#2010) Co-authored-by: fenlog --- httplib.h | 16 ++++++++-------- test/test.cc | 10 ++++++++++ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/httplib.h b/httplib.h index 60d6b4c..2a85da6 100644 --- a/httplib.h +++ b/httplib.h @@ -7183,14 +7183,6 @@ Server::process_request(Stream &strm, const std::string &remote_addr, : StatusCode::PartialContent_206; } - if (detail::range_error(req, res)) { - res.body.clear(); - res.content_length_ = 0; - res.content_provider_ = nullptr; - res.status = StatusCode::RangeNotSatisfiable_416; - return write_response(strm, close_connection, req, res); - } - // Serve file content by using a content provider if (!res.file_content_path_.empty()) { const auto &path = res.file_content_path_; @@ -7217,6 +7209,14 @@ Server::process_request(Stream &strm, const std::string &remote_addr, }); } + if (detail::range_error(req, res)) { + res.body.clear(); + res.content_length_ = 0; + res.content_provider_ = nullptr; + res.status = StatusCode::RangeNotSatisfiable_416; + return write_response(strm, close_connection, req, res); + } + return write_response_with_content(strm, close_connection, req, res); } else { if (res.status == -1) { res.status = StatusCode::NotFound_404; } diff --git a/test/test.cc b/test/test.cc index a82912a..d9f2036 100644 --- a/test/test.cc +++ b/test/test.cc @@ -3036,6 +3036,16 @@ TEST_F(ServerTest, GetFileContent) { EXPECT_EQ("test.html", res->body); } +TEST_F(ServerTest, GetFileContentWithRange) { + auto res = cli_.Get("/file_content", {{make_range_header({{1, 3}})}}); + ASSERT_TRUE(res); + EXPECT_EQ(StatusCode::PartialContent_206, res->status); + EXPECT_EQ("text/html", res->get_header_value("Content-Type")); + EXPECT_EQ("bytes 1-3/9", res->get_header_value("Content-Range")); + EXPECT_EQ(3, std::stoi(res->get_header_value("Content-Length"))); + EXPECT_EQ("est", res->body); +} + TEST_F(ServerTest, GetFileContentWithContentType) { auto res = cli_.Get("/file_content_with_content_type"); ASSERT_TRUE(res);