Browse Source

Fix suffix-byte-range issue (#711)

Omkar Jadhav 5 years ago
parent
commit
bc4a613b6d
2 changed files with 26 additions and 1 deletions
  1. 2 1
      httplib.h
  2. 24 0
      test/test.cc

+ 2 - 1
httplib.h

@@ -173,6 +173,7 @@ using socket_t = int;
 #define INVALID_SOCKET (-1)
 #define INVALID_SOCKET (-1)
 #endif //_WIN32
 #endif //_WIN32
 
 
+#include <algorithm>
 #include <array>
 #include <array>
 #include <atomic>
 #include <atomic>
 #include <cassert>
 #include <cassert>
@@ -3153,7 +3154,7 @@ get_range_offset_and_length(const Request &req, size_t content_length,
   auto slen = static_cast<ssize_t>(content_length);
   auto slen = static_cast<ssize_t>(content_length);
 
 
   if (r.first == -1) {
   if (r.first == -1) {
-    r.first = slen - r.second;
+    r.first = std::max(static_cast<ssize_t>(0), slen - r.second);
     r.second = slen - 1;
     r.second = slen - 1;
   }
   }
 
 

+ 24 - 0
test/test.cc

@@ -1897,6 +1897,30 @@ TEST_F(ServerTest, GetStreamedWithRange2) {
   EXPECT_EQ(std::string("bcdefg"), res->body);
   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) {
 TEST_F(ServerTest, GetStreamedWithRangeError) {
   auto res = cli_.Get("/streamed-with-range", {
   auto res = cli_.Get("/streamed-with-range", {
     {"Range", "bytes=92233720368547758079223372036854775806-92233720368547758079223372036854775807"}
     {"Range", "bytes=92233720368547758079223372036854775806-92233720368547758079223372036854775807"}