From 35cc4ed1e786a14a1438ad4f13d37a4b968b6f25 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sun, 31 Oct 2010 07:56:01 +0000 Subject: [PATCH] 2010-10-31 Tatsuhiro Tsujikawa 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 --- ChangeLog | 8 ++++++++ src/HttpHeader.cc | 8 ++++++++ test/HttpHeaderTest.cc | 20 ++++++++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/ChangeLog b/ChangeLog index 668a36c5..574f2dfe 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2010-10-31 Tatsuhiro Tsujikawa + + 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 Made #include guard consistent for c++ header files. diff --git a/src/HttpHeader.cc b/src/HttpHeader.cc index cbd0739b..5f63e730 100644 --- a/src/HttpHeader.cc +++ b/src/HttpHeader.cc @@ -180,6 +180,14 @@ RangeHandle HttpHeader::getRange() const std::pair 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(new Range()); + } + std::pair byteRangeRespSpecPair; util::divide(byteRangeRespSpecPair, byteRangeSpecPair.first, '-'); diff --git a/test/HttpHeaderTest.cc b/test/HttpHeaderTest.cc index e3ae3cc8..af01f7cc 100644 --- a/test/HttpHeaderTest.cc +++ b/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 = 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 = 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()