From bc4a613b6dc94d444da56d1c0e9968ef13ec3c24 Mon Sep 17 00:00:00 2001 From: Omkar Jadhav Date: Tue, 20 Oct 2020 20:41:27 +0530 Subject: [PATCH] Fix suffix-byte-range issue (#711) --- httplib.h | 3 ++- test/test.cc | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) 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"}