mirror of
https://github.com/klzgrad/naiveproxy.git
synced 2024-11-24 22:36:09 +03:00
118 lines
3.0 KiB
C++
118 lines
3.0 KiB
C++
|
// 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 "base/format_macros.h"
|
||
|
#include "base/logging.h"
|
||
|
#include "base/strings/stringprintf.h"
|
||
|
#include "net/http/http_byte_range.h"
|
||
|
|
||
|
namespace {
|
||
|
|
||
|
const int64_t kPositionNotSpecified = -1;
|
||
|
|
||
|
} // namespace
|
||
|
|
||
|
namespace net {
|
||
|
|
||
|
HttpByteRange::HttpByteRange()
|
||
|
: first_byte_position_(kPositionNotSpecified),
|
||
|
last_byte_position_(kPositionNotSpecified),
|
||
|
suffix_length_(kPositionNotSpecified),
|
||
|
has_computed_bounds_(false) {
|
||
|
}
|
||
|
|
||
|
// static
|
||
|
HttpByteRange HttpByteRange::Bounded(int64_t first_byte_position,
|
||
|
int64_t last_byte_position) {
|
||
|
HttpByteRange range;
|
||
|
range.set_first_byte_position(first_byte_position);
|
||
|
range.set_last_byte_position(last_byte_position);
|
||
|
return range;
|
||
|
}
|
||
|
|
||
|
// static
|
||
|
HttpByteRange HttpByteRange::RightUnbounded(int64_t first_byte_position) {
|
||
|
HttpByteRange range;
|
||
|
range.set_first_byte_position(first_byte_position);
|
||
|
return range;
|
||
|
}
|
||
|
|
||
|
// static
|
||
|
HttpByteRange HttpByteRange::Suffix(int64_t suffix_length) {
|
||
|
HttpByteRange range;
|
||
|
range.set_suffix_length(suffix_length);
|
||
|
return range;
|
||
|
}
|
||
|
|
||
|
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_));
|
||
|
}
|
||
|
|
||
|
std::string HttpByteRange::GetHeaderValue() const {
|
||
|
DCHECK(IsValid());
|
||
|
|
||
|
if (IsSuffixByteRange())
|
||
|
return base::StringPrintf("bytes=-%" PRId64, suffix_length());
|
||
|
|
||
|
DCHECK(HasFirstBytePosition());
|
||
|
|
||
|
if (!HasLastBytePosition())
|
||
|
return base::StringPrintf("bytes=%" PRId64 "-", first_byte_position());
|
||
|
|
||
|
return base::StringPrintf("bytes=%" PRId64 "-%" PRId64,
|
||
|
first_byte_position(), last_byte_position());
|
||
|
}
|
||
|
|
||
|
bool HttpByteRange::ComputeBounds(int64_t 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
|