From 8512fe992e2e86dc284d2d7c82decd22df2b0e2b Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sat, 19 Dec 2015 19:26:39 +0900 Subject: Support content-range from non-compliant server See GH-509 --- src/HttpHeader.cc | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/HttpHeader.cc b/src/HttpHeader.cc index a9fe23a6..3708e723 100644 --- a/src/HttpHeader.cc +++ b/src/HttpHeader.cc @@ -113,13 +113,20 @@ Range HttpHeader::getRange() const } } } - // we expect that rangeStr looks like 'bytes 100-199/100' - // but some server returns '100-199/100', omitting bytes-unit specifier - // 'bytes'. + // we expect that rangeStr looks like 'bytes 100-199/200' but some + // server returns '100-199/200', omitting bytes-unit specifier + // 'bytes'. Moreover, some server may return like + // 'bytes=100-199/200'. auto byteRangeSpec = std::find(rangeStr.begin(), rangeStr.end(), ' '); if(byteRangeSpec == rangeStr.end()) { - // we assume bytes-unit specifier omitted. - byteRangeSpec = rangeStr.begin(); + // check for 'bytes=100-199/200' case + byteRangeSpec = std::find(rangeStr.begin(), rangeStr.end(), '='); + if (byteRangeSpec == rangeStr.end()) { + // we assume bytes-unit specifier omitted. + byteRangeSpec = rangeStr.begin(); + } else { + ++byteRangeSpec; + } } else { while(byteRangeSpec != rangeStr.end() && (*byteRangeSpec == ' ' || *byteRangeSpec == '\t')) { -- cgit