Skip to content

Commit bc4a613

Browse files
authored
Fix suffix-byte-range issue (yhirose#711)
1 parent 4bb0013 commit bc4a613

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed

httplib.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ using socket_t = int;
173173
#define INVALID_SOCKET (-1)
174174
#endif //_WIN32
175175

176+
#include <algorithm>
176177
#include <array>
177178
#include <atomic>
178179
#include <cassert>
@@ -3153,7 +3154,7 @@ get_range_offset_and_length(const Request &req, size_t content_length,
31533154
auto slen = static_cast<ssize_t>(content_length);
31543155

31553156
if (r.first == -1) {
3156-
r.first = slen - r.second;
3157+
r.first = std::max(static_cast<ssize_t>(0), slen - r.second);
31573158
r.second = slen - 1;
31583159
}
31593160

test/test.cc

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1897,6 +1897,30 @@ TEST_F(ServerTest, GetStreamedWithRange2) {
18971897
EXPECT_EQ(std::string("bcdefg"), res->body);
18981898
}
18991899

1900+
TEST_F(ServerTest, GetStreamedWithRangeSuffix1) {
1901+
auto res = cli_.Get("/streamed-with-range", {
1902+
{"Range", "bytes=-3"}
1903+
});
1904+
ASSERT_TRUE(res);
1905+
EXPECT_EQ(206, res->status);
1906+
EXPECT_EQ("3", res->get_header_value("Content-Length"));
1907+
EXPECT_EQ(true, res->has_header("Content-Range"));
1908+
EXPECT_EQ(std::string("efg"), res->body);
1909+
}
1910+
1911+
1912+
TEST_F(ServerTest, GetStreamedWithRangeSuffix2) {
1913+
auto res = cli_.Get("/streamed-with-range", {
1914+
{"Range", "bytes=-9999"}
1915+
});
1916+
ASSERT_TRUE(res);
1917+
EXPECT_EQ(206, res->status);
1918+
EXPECT_EQ("7", res->get_header_value("Content-Length"));
1919+
EXPECT_EQ(true, res->has_header("Content-Range"));
1920+
EXPECT_EQ(std::string("abcdefg"), res->body);
1921+
}
1922+
1923+
19001924
TEST_F(ServerTest, GetStreamedWithRangeError) {
19011925
auto res = cli_.Get("/streamed-with-range", {
19021926
{"Range", "bytes=92233720368547758079223372036854775806-92233720368547758079223372036854775807"}

0 commit comments

Comments
 (0)