| // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <algorithm> |
| |
| #include "net/http/http_byte_range.h" |
| |
| namespace { |
| |
| const int64 kPositionNotSpecified = -1; |
| |
| } // namespace |
| |
| namespace net { |
| |
| HttpByteRange::HttpByteRange() |
| : first_byte_position_(kPositionNotSpecified), |
| last_byte_position_(kPositionNotSpecified), |
| suffix_length_(kPositionNotSpecified), |
| has_computed_bounds_(false) { |
| } |
| |
| bool HttpByteRange::IsSuffixByteRange() const { |
| return suffix_length_ != kPositionNotSpecified; |
| } |
| |
| bool HttpByteRange::HasFirstBytePosition() const { |
| return first_byte_position_ != kPositionNotSpecified; |
| } |
| |
| bool HttpByteRange::HasLastBytePosition() const { |
| return last_byte_position_ != kPositionNotSpecified; |
| } |
| |
| bool HttpByteRange::IsValid() const { |
| if (suffix_length_ > 0) |
| return true; |
| return (first_byte_position_ >= 0 && |
| (last_byte_position_ == kPositionNotSpecified || |
| last_byte_position_ >= first_byte_position_)); |
| } |
| |
| bool HttpByteRange::ComputeBounds(int64 size) { |
| if (size < 0) |
| return false; |
| if (has_computed_bounds_) |
| return false; |
| has_computed_bounds_ = true; |
| |
| // Empty values. |
| if (!HasFirstBytePosition() && |
| !HasLastBytePosition() && |
| !IsSuffixByteRange()) { |
| first_byte_position_ = 0; |
| last_byte_position_ = size - 1; |
| return true; |
| } |
| if (!IsValid()) |
| return false; |
| if (IsSuffixByteRange()) { |
| first_byte_position_ = size - std::min(size, suffix_length_); |
| last_byte_position_ = size - 1; |
| return true; |
| } |
| if (first_byte_position_ < size) { |
| if (HasLastBytePosition()) |
| last_byte_position_ = std::min(size - 1, last_byte_position_); |
| else |
| last_byte_position_ = size - 1; |
| return true; |
| } |
| return false; |
| } |
| |
| } // namespace net |