Просмотр исходного кода

2010-10-31 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>

	Return empty range if byte-range-resp-spec or instance-length is
	"*" in Content-Range header to prevent aria2 from emitting error
	failing to convert "*" to a integer.
	* src/HttpHeader.cc
	* test/HttpHeaderTest.cc
Tatsuhiro Tsujikawa 15 лет назад
Родитель
Сommit
35cc4ed1e7
3 измененных файлов с 36 добавлено и 0 удалено
  1. 8 0
      ChangeLog
  2. 8 0
      src/HttpHeader.cc
  3. 20 0
      test/HttpHeaderTest.cc

+ 8 - 0
ChangeLog

@@ -1,3 +1,11 @@
+2010-10-31  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
+
+	Return empty range if byte-range-resp-spec or instance-length is
+	"*" in Content-Range header to prevent aria2 from emitting error
+	failing to convert "*" to a integer.
+	* src/HttpHeader.cc
+	* test/HttpHeaderTest.cc
+
 2010-10-31  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
 
 	Made #include guard consistent for c++ header files.

+ 8 - 0
src/HttpHeader.cc

@@ -180,6 +180,14 @@ RangeHandle HttpHeader::getRange() const
   std::pair<std::string, std::string> byteRangeSpecPair;
   util::divide(byteRangeSpecPair, byteRangeSpec, '/');
 
+  if(util::strip(byteRangeSpecPair.first) == "*" ||
+     util::strip(byteRangeSpecPair.second) == "*") {
+    // If byte-range-resp-spec or instance-length is "*", we returns
+    // empty Range. The former is usually sent with 416 (Request range
+    // not satisfiable) status.
+    return SharedHandle<Range>(new Range());
+  }
+
   std::pair<std::string, std::string> byteRangeRespSpecPair;
   util::divide(byteRangeRespSpecPair, byteRangeSpecPair.first, '-');
 

+ 20 - 0
test/HttpHeaderTest.cc

@@ -45,6 +45,26 @@ void HttpHeaderTest::testGetRange()
     CPPUNIT_ASSERT_EQUAL((off_t)9223372036854775801LL, range->getEndByte());
     CPPUNIT_ASSERT_EQUAL((uint64_t)9223372036854775807ULL, range->getEntityLength());
   }
+  {
+    HttpHeader httpHeader;
+    httpHeader.put("Content-Range", "bytes */1024");
+
+    SharedHandle<Range> range = httpHeader.getRange();
+
+    CPPUNIT_ASSERT_EQUAL((off_t)0, range->getStartByte());
+    CPPUNIT_ASSERT_EQUAL((off_t)0, range->getEndByte());
+    CPPUNIT_ASSERT_EQUAL((uint64_t)0, range->getEntityLength());
+  }
+  {
+    HttpHeader httpHeader;
+    httpHeader.put("Content-Range", "bytes 0-9/*");
+
+    SharedHandle<Range> range = httpHeader.getRange();
+
+    CPPUNIT_ASSERT_EQUAL((off_t)0, range->getStartByte());
+    CPPUNIT_ASSERT_EQUAL((off_t)0, range->getEndByte());
+    CPPUNIT_ASSERT_EQUAL((uint64_t)0, range->getEntityLength());
+  }
 }
 
 void HttpHeaderTest::testGet()