1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include <algorithm> 6 7 #include "net/http/http_byte_range.h" 8 9 namespace { 10 11 const int64 kPositionNotSpecified = -1; 12 13 } // namespace 14 15 namespace net { 16 17 HttpByteRange::HttpByteRange() 18 : first_byte_position_(kPositionNotSpecified), 19 last_byte_position_(kPositionNotSpecified), 20 suffix_length_(kPositionNotSpecified), 21 has_computed_bounds_(false) { 22 } 23 24 bool HttpByteRange::IsSuffixByteRange() const { 25 return suffix_length_ != kPositionNotSpecified; 26 } 27 28 bool HttpByteRange::HasFirstBytePosition() const { 29 return first_byte_position_ != kPositionNotSpecified; 30 } 31 32 bool HttpByteRange::HasLastBytePosition() const { 33 return last_byte_position_ != kPositionNotSpecified; 34 } 35 36 bool HttpByteRange::IsValid() const { 37 if (suffix_length_ > 0) 38 return true; 39 return (first_byte_position_ >= 0 && 40 (last_byte_position_ == kPositionNotSpecified || 41 last_byte_position_ >= first_byte_position_)); 42 } 43 44 bool HttpByteRange::ComputeBounds(int64 size) { 45 if (size < 0) 46 return false; 47 if (has_computed_bounds_) 48 return false; 49 has_computed_bounds_ = true; 50 51 // Empty values. 52 if (!HasFirstBytePosition() && 53 !HasLastBytePosition() && 54 !IsSuffixByteRange()) { 55 first_byte_position_ = 0; 56 last_byte_position_ = size - 1; 57 return true; 58 } 59 if (!IsValid()) 60 return false; 61 if (IsSuffixByteRange()) { 62 first_byte_position_ = size - std::min(size, suffix_length_); 63 last_byte_position_ = size - 1; 64 return true; 65 } 66 if (first_byte_position_ < size) { 67 if (HasLastBytePosition()) 68 last_byte_position_ = std::min(size - 1, last_byte_position_); 69 else 70 last_byte_position_ = size - 1; 71 return true; 72 } 73 return false; 74 } 75 76 } // namespace net 77