| Index: net/http/partial_data.cc
|
| ===================================================================
|
| --- net/http/partial_data.cc (revision 22968)
|
| +++ net/http/partial_data.cc (working copy)
|
| @@ -53,7 +53,7 @@
|
|
|
| // Scan the disk cache for the first cached portion within this range.
|
| int64 range_len = byte_range_.HasLastBytePosition() ?
|
| - byte_range_.last_byte_position() - current_range_start_ + 1: kint32max;
|
| + byte_range_.last_byte_position() - current_range_start_ + 1 : kint32max;
|
| if (range_len > kint32max)
|
| range_len = kint32max;
|
| int len = static_cast<int32>(range_len);
|
| @@ -100,21 +100,33 @@
|
| return final_range_;
|
| }
|
|
|
| -bool PartialData::UpdateFromStoredHeaders(const HttpResponseHeaders* headers) {
|
| +bool PartialData::UpdateFromStoredHeaders(const HttpResponseHeaders* headers,
|
| + disk_cache::Entry* entry) {
|
| std::string length_value;
|
| resource_size_ = 0;
|
| if (!headers->GetNormalizedHeader(kLengthHeader, &length_value))
|
| return false; // We must have stored the resource length.
|
|
|
| - if (!StringToInt64(length_value, &resource_size_))
|
| + if (!StringToInt64(length_value, &resource_size_) || !resource_size_)
|
| return false;
|
|
|
| - if (resource_size_ && !byte_range_.ComputeBounds(resource_size_))
|
| + if (byte_range_.IsValid()) {
|
| + if (!byte_range_.ComputeBounds(resource_size_))
|
| + return false;
|
| +
|
| + if (current_range_start_ < 0)
|
| + current_range_start_ = byte_range_.first_byte_position();
|
| + } else {
|
| + // This is not a range request but we have partial data stored.
|
| + current_range_start_ = 0;
|
| + byte_range_.set_last_byte_position(resource_size_ - 1);
|
| + }
|
| +
|
| + // Make sure that this is really a sparse entry.
|
| + int64 n;
|
| + if (ERR_CACHE_OPERATION_NOT_SUPPORTED == entry->GetAvailableRange(0, 5, &n))
|
| return false;
|
|
|
| - if (current_range_start_ < 0)
|
| - current_range_start_ = byte_range_.first_byte_position();
|
| -
|
| return current_range_start_ >= 0;
|
| }
|
|
|
| @@ -141,7 +153,7 @@
|
| if (start != current_range_start_)
|
| return false;
|
|
|
| - if (end > byte_range_.last_byte_position())
|
| + if (byte_range_.IsValid() && end > byte_range_.last_byte_position())
|
| return false;
|
|
|
| return true;
|
| @@ -154,15 +166,23 @@
|
| headers->RemoveHeader(kLengthHeader);
|
| headers->RemoveHeader(kRangeHeader);
|
|
|
| - DCHECK(byte_range_.HasFirstBytePosition());
|
| - DCHECK(byte_range_.HasLastBytePosition());
|
| - headers->AddHeader(StringPrintf("%s: bytes %lld-%lld/%lld", kRangeHeader,
|
| - byte_range_.first_byte_position(),
|
| - byte_range_.last_byte_position(),
|
| - resource_size_));
|
| + int64 range_len;
|
| + if (byte_range_.IsValid()) {
|
| + DCHECK(byte_range_.HasFirstBytePosition());
|
| + DCHECK(byte_range_.HasLastBytePosition());
|
| + headers->AddHeader(StringPrintf("%s: bytes %lld-%lld/%lld", kRangeHeader,
|
| + byte_range_.first_byte_position(),
|
| + byte_range_.last_byte_position(),
|
| + resource_size_));
|
| + range_len = byte_range_.last_byte_position() -
|
| + byte_range_.first_byte_position() + 1;
|
| + } else {
|
| + // TODO(rvargas): Is it safe to change the protocol version?
|
| + headers->ReplaceStatusLine("HTTP/1.1 200 OK");
|
| + DCHECK_NE(resource_size_, 0);
|
| + range_len = resource_size_;
|
| + }
|
|
|
| - int64 range_len = byte_range_.last_byte_position() -
|
| - byte_range_.first_byte_position() + 1;
|
| headers->AddHeader(StringPrintf("%s: %lld", kLengthHeader, range_len));
|
| }
|
|
|
| @@ -214,5 +234,4 @@
|
| my_end.c_str()));
|
| }
|
|
|
| -
|
| } // namespace net
|
|
|