diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2008-03-15 04:25:55 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2008-03-15 04:25:55 +0000 |
| commit | 42fa16b78024e64684476313740260fca58f74ca (patch) | |
| tree | f4e6377d876a685352d35de608d683ebd7039af1 /src/HttpHeader.cc | |
| parent | 538a8fcfe7d56e2d3bea25599d015df94ab9e7e6 (diff) | |
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
Diffstat (limited to 'src/HttpHeader.cc')
| -rw-r--r-- | src/HttpHeader.cc | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/src/HttpHeader.cc b/src/HttpHeader.cc index 4d514bf2..d377ca17 100644 --- a/src/HttpHeader.cc +++ b/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); } |
