Index: net/http/http_byte_range.cc |
=================================================================== |
--- net/http/http_byte_range.cc (revision 0) |
+++ net/http/http_byte_range.cc (revision 0) |
@@ -0,0 +1,76 @@ |
+// 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 |