Home | History | Annotate | Download | only in http
      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