diff --git a/httplib.h b/httplib.h index 945a6ee..2ccb76c 100644 --- a/httplib.h +++ b/httplib.h @@ -3171,9 +3171,10 @@ get_range_offset_and_length(const Request &req, size_t content_length, r.second = slen - 1; } - if (r.second == -1) { r.second = slen - 1; } - - return std::make_pair(r.first, r.second - r.first + 1); + if (r.second == -1) { + r.second = slen - 1; + } + return std::make_pair(r.first, static_cast(r.second - r.first) + 1); } inline std::string make_content_range_header_field(size_t offset, size_t length, diff --git a/test/test.cc b/test/test.cc index ba4f0d3..0543881 100644 --- a/test/test.cc +++ b/test/test.cc @@ -1930,6 +1930,15 @@ TEST_F(ServerTest, GetStreamedWithRangeError) { EXPECT_EQ(416, res->status); } +//Tests long long overflow. +TEST_F(ServerTest, GetRangeWithMaxLongLength) { + auto res = cli_.Get("/with-range",{{"Range", "bytes=0-9223372036854775807"}}); + 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, GetStreamedWithRangeMultipart) { auto res = cli_.Get("/streamed-with-range", {{make_range_header({{1, 2}, {4, 5}})}}); @@ -2012,6 +2021,12 @@ TEST_F(ServerTest, GetWithRange4) { EXPECT_EQ(std::string("fg"), res->body); } +//TEST_F(ServerTest, GetWithRangeOffsetGreaterThanContent) { +// auto res = cli_.Get("/with-range", {{make_range_header({{10000, 20000}})}}); +// ASSERT_TRUE(res); +// EXPECT_EQ(416, res->status); +//} + TEST_F(ServerTest, GetWithRangeMultipart) { auto res = cli_.Get("/with-range", {{make_range_header({{1, 2}, {4, 5}})}}); ASSERT_TRUE(res); @@ -2021,6 +2036,12 @@ TEST_F(ServerTest, GetWithRangeMultipart) { EXPECT_EQ(269, res->body.size()); } +//TEST_F(ServerTest, GetWithRangeMultipartOffsetGreaterThanContent) { +// auto res = cli_.Get("/with-range", {{make_range_header({{-1, 2}, {10000, 30000}})}}); +// ASSERT_TRUE(res); +// EXPECT_EQ(416, res->status); +//} + TEST_F(ServerTest, GetStreamedChunked) { auto res = cli_.Get("/streamed-chunked"); ASSERT_TRUE(res);