summaryrefslogtreecommitdiff
path: root/src/HttpHeader.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-03-15 04:25:55 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-03-15 04:25:55 +0000
commit42fa16b78024e64684476313740260fca58f74ca (patch)
treef4e6377d876a685352d35de608d683ebd7039af1 /src/HttpHeader.cc
parent538a8fcfe7d56e2d3bea25599d015df94ab9e7e6 (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.cc31
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);
}