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

2008-03-15 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>

	Suppress content-range error when 'Content-Range' response header
	doesn't contains bytes-unit specifier 'bytes'
	* src/HttpHeader.cc (getRange)
	* test/HttpHeaderTest.cc
Tatsuhiro Tsujikawa 17 лет назад
Родитель
Сommit
42fa16b780
3 измененных файлов с 50 добавлено и 18 удалено
  1. 7 0
      ChangeLog
  2. 21 10
      src/HttpHeader.cc
  3. 22 8
      test/HttpHeaderTest.cc

+ 7 - 0
ChangeLog

@@ -1,3 +1,10 @@
+2008-03-15  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
+
+	Suppress content-range error when 'Content-Range' response header
+	doesn't contains bytes-unit specifier 'bytes'
+	* src/HttpHeader.cc (getRange)
+	* test/HttpHeaderTest.cc
+	
 2008-03-15  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
 
 	Fixed compilation error with g++-4.3

+ 21 - 10
src/HttpHeader.cc

@@ -93,18 +93,29 @@ RangeHandle HttpHeader::getRange() const
       }
     }
   }
-  std::string::size_type rangeSpecIndex = rangeStr.find("bytes ");
-  if(rangeSpecIndex == std::string::npos) {
-    return new Range(0, 0, 0);
+  std::string byteRangeSpec;
+  {
+    // we expect that rangeStr looks like 'bytes 100-199/100'
+    // but some server returns '100-199/100', omitting bytes-unit sepcifier
+    // 'bytes'.
+    std::pair<std::string, std::string> splist;
+    Util::split(splist, rangeStr, ' ');
+    if(splist.second.empty()) {
+      // we assume bytes-unit specifier omitted.
+      byteRangeSpec = splist.first;
+    } else {
+      byteRangeSpec = splist.second;
+    }
   }
-  std::pair<std::string, std::string> rangePair;
-  Util::split(rangePair, rangeStr.substr(rangeSpecIndex+6), '/');
-  std::pair<std::string, std::string> startEndBytePair;
-  Util::split(startEndBytePair, rangePair.first, '-');
+  std::pair<std::string, std::string> byteRangeSpecPair;
+  Util::split(byteRangeSpecPair, byteRangeSpec, '/');
+
+  std::pair<std::string, std::string> byteRangeRespSpecPair;
+  Util::split(byteRangeRespSpecPair, byteRangeSpecPair.first, '-');
 
-  off_t startByte = Util::parseLLInt(startEndBytePair.first);
-  off_t endByte = Util::parseLLInt(startEndBytePair.second);
-  uint64_t entityLength = Util::parseULLInt(rangePair.second);
+  off_t startByte = Util::parseLLInt(byteRangeRespSpecPair.first);
+  off_t endByte = Util::parseLLInt(byteRangeRespSpecPair.second);
+  uint64_t entityLength = Util::parseULLInt(byteRangeSpecPair.second);
 
   return new Range(startByte, endByte, entityLength);
 }

+ 22 - 8
test/HttpHeaderTest.cc

@@ -20,14 +20,28 @@ CPPUNIT_TEST_SUITE_REGISTRATION( HttpHeaderTest );
 
 void HttpHeaderTest::testGetRange()
 {
-  HttpHeader httpHeader;
-  httpHeader.put("Content-Range", "bytes 1-499/1234");
-
-  SharedHandle<Range> range = httpHeader.getRange();
-
-  CPPUNIT_ASSERT_EQUAL(1LL, range->getStartByte());
-  CPPUNIT_ASSERT_EQUAL(499LL, range->getEndByte());
-  CPPUNIT_ASSERT_EQUAL(1234ULL, range->getEntityLength());
+  {
+    HttpHeader httpHeader;
+    httpHeader.put("Content-Range",
+		   "9223372036854775800-9223372036854775801/9223372036854775807");
+    
+    SharedHandle<Range> range = httpHeader.getRange();
+
+    CPPUNIT_ASSERT_EQUAL(9223372036854775800LL, range->getStartByte());
+    CPPUNIT_ASSERT_EQUAL(9223372036854775801LL, range->getEndByte());
+    CPPUNIT_ASSERT_EQUAL(9223372036854775807ULL, range->getEntityLength());
+  }
+  {
+    HttpHeader httpHeader;
+    httpHeader.put("Content-Range",
+		   "9223372036854775800-9223372036854775801/9223372036854775807");
+     
+    SharedHandle<Range> range = httpHeader.getRange();
+
+    CPPUNIT_ASSERT_EQUAL(9223372036854775800LL, range->getStartByte());
+    CPPUNIT_ASSERT_EQUAL(9223372036854775801LL, range->getEndByte());
+    CPPUNIT_ASSERT_EQUAL(9223372036854775807ULL, range->getEntityLength());
+  }
 }
 
 } // namespace aria2