From 7301bf89bb4b72ed34b4e27474a6e10705b3b059 Mon Sep 17 00:00:00 2001 From: Veloman Yunkan Date: Tue, 26 May 2020 01:50:29 +0400 Subject: [PATCH] Some refactoring of byte-range parsing --- src/server/byte_range.cpp | 52 ++++++++++++++++++++++----------------- src/server/byte_range.h | 2 +- 2 files changed, 31 insertions(+), 23 deletions(-) diff --git a/src/server/byte_range.cpp b/src/server/byte_range.cpp index dd21da8a6..45f10b668 100644 --- a/src/server/byte_range.cpp +++ b/src/server/byte_range.cpp @@ -24,6 +24,32 @@ namespace kiwix { +namespace { + +ByteRange parseByteRange(const std::string& rangeStr) +{ + std::istringstream iss(rangeStr); + + int64_t start, end = INT64_MAX; + if (iss >> start) { + if ( start < 0 ) { + if ( iss.eof() ) + return ByteRange(ByteRange::PARSED, start, end); + } else { + char c; + if (iss >> c && c=='-') { + iss >> end; // if this fails, end is not modified, which is OK + if (iss.eof() && start <= end) + return ByteRange(ByteRange::PARSED, start, end); + } + } + } + + return ByteRange(ByteRange::INVALID, 0, INT64_MAX); +} + +} // unnamed namespace + ByteRange::ByteRange() : kind_(NONE) , first_(0) @@ -36,31 +62,13 @@ ByteRange::ByteRange(Kind kind, int64_t first, int64_t last) , last_(last) {} -ByteRange ByteRange::parse(std::string rangeStr) +ByteRange ByteRange::parse(const std::string& rangeStr) { - ByteRange byteRange(INVALID, 0, INT64_MAX); const std::string byteUnitSpec("bytes="); - if ( kiwix::startsWith(rangeStr, byteUnitSpec) ) { - rangeStr.erase(0, byteUnitSpec.size()); - std::istringstream iss(rangeStr); + if ( ! kiwix::startsWith(rangeStr, byteUnitSpec) ) + return ByteRange(INVALID, 0, INT64_MAX); - int64_t start, end = INT64_MAX; - if (iss >> start) { - if ( start < 0 ) { - if ( iss.eof() ) - byteRange = ByteRange(PARSED, start, end); - } else { - char c; - if (iss >> c && c=='-') { - iss >> end; // if this fails, end is not modified, which is OK - if (iss.eof() && start <= end) - byteRange = ByteRange(PARSED, start, end); - } - } - } - } - - return byteRange; + return parseByteRange(rangeStr.substr(byteUnitSpec.size())); } ByteRange ByteRange::resolve(int64_t contentSize) const diff --git a/src/server/byte_range.h b/src/server/byte_range.h index e302cece4..848fd8082 100644 --- a/src/server/byte_range.h +++ b/src/server/byte_range.h @@ -57,7 +57,7 @@ class ByteRange int64_t last() const { return last_; } int64_t length() const { return last_ + 1 - first_; } - static ByteRange parse(std::string rangeStr); + static ByteRange parse(const std::string& rangeStr); ByteRange resolve(int64_t contentSize) const; private: // data