diff --git a/httplib.h b/httplib.h index 5b39ff1..de77441 100644 --- a/httplib.h +++ b/httplib.h @@ -173,6 +173,7 @@ using socket_t = int; #define INVALID_SOCKET (-1) #endif //_WIN32 +#include #include #include #include @@ -3153,7 +3154,7 @@ get_range_offset_and_length(const Request &req, size_t content_length, auto slen = static_cast(content_length); if (r.first == -1) { - r.first = slen - r.second; + r.first = std::max(static_cast(0), slen - r.second); r.second = slen - 1; } diff --git a/test/test.cc b/test/test.cc index fdec7a9..c9b1446 100644 --- a/test/test.cc +++ b/test/test.cc @@ -1897,6 +1897,30 @@ TEST_F(ServerTest, GetStreamedWithRange2) { EXPECT_EQ(std::string("bcdefg"), res->body); } +TEST_F(ServerTest, GetStreamedWithRangeSuffix1) { + auto res = cli_.Get("/streamed-with-range", { + {"Range", "bytes=-3"} + }); + ASSERT_TRUE(res); + EXPECT_EQ(206, res->status); + EXPECT_EQ("3", res->get_header_value("Content-Length")); + EXPECT_EQ(true, res->has_header("Content-Range")); + EXPECT_EQ(std::string("efg"), res->body); +} + + +TEST_F(ServerTest, GetStreamedWithRangeSuffix2) { + auto res = cli_.Get("/streamed-with-range", { + {"Range", "bytes=-9999"} + }); + ASSERT_TRUE(res); + EXPECT_EQ(206, res->status); + EXPECT_EQ("7", res->get_header_value("Content-Length")); + EXPECT_EQ(true, res->has_header("Content-Range")); + EXPECT_EQ(std::string("abcdefg"), res->body); +} + + TEST_F(ServerTest, GetStreamedWithRangeError) { auto res = cli_.Get("/streamed-with-range", { {"Range", "bytes=92233720368547758079223372036854775806-92233720368547758079223372036854775807"}