mirror of https://github.com/aria2/aria2
				
				
				
			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.ccpull/1/head
							parent
							
								
									538a8fcfe7
								
							
						
					
					
						commit
						42fa16b780
					
				| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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, '/');
 | 
			
		||||
 | 
			
		||||
  off_t startByte = Util::parseLLInt(startEndBytePair.first);
 | 
			
		||||
  off_t endByte = Util::parseLLInt(startEndBytePair.second);
 | 
			
		||||
  uint64_t entityLength = Util::parseULLInt(rangePair.second);
 | 
			
		||||
  std::pair<std::string, std::string> byteRangeRespSpecPair;
 | 
			
		||||
  Util::split(byteRangeRespSpecPair, byteRangeSpecPair.first, '-');
 | 
			
		||||
 | 
			
		||||
  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);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,14 +20,28 @@ CPPUNIT_TEST_SUITE_REGISTRATION( HttpHeaderTest );
 | 
			
		|||
 | 
			
		||||
void HttpHeaderTest::testGetRange()
 | 
			
		||||
{
 | 
			
		||||
  HttpHeader httpHeader;
 | 
			
		||||
  httpHeader.put("Content-Range", "bytes 1-499/1234");
 | 
			
		||||
  {
 | 
			
		||||
    HttpHeader httpHeader;
 | 
			
		||||
    httpHeader.put("Content-Range",
 | 
			
		||||
		   "9223372036854775800-9223372036854775801/9223372036854775807");
 | 
			
		||||
    
 | 
			
		||||
  SharedHandle<Range> range = httpHeader.getRange();
 | 
			
		||||
    SharedHandle<Range> range = httpHeader.getRange();
 | 
			
		||||
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(1LL, range->getStartByte());
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(499LL, range->getEndByte());
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(1234ULL, range->getEntityLength());
 | 
			
		||||
    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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue