Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(362)

Side by Side Diff: net/http/http_cache_transaction.cc

Issue 10829069: Http cache: Make sure that issuing a byte range request (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/http/http_cache_transaction.h" 5 #include "net/http/http_cache_transaction.h"
6 6
7 #include "build/build_config.h" 7 #include "build/build_config.h"
8 8
9 #if defined(OS_POSIX) 9 #if defined(OS_POSIX)
10 #include <unistd.h> 10 #include <unistd.h>
(...skipping 1554 matching lines...) Expand 10 before | Expand all | Expand 10 after
1565 } 1565 }
1566 1566
1567 int HttpCache::Transaction::BeginCacheValidation() { 1567 int HttpCache::Transaction::BeginCacheValidation() {
1568 DCHECK(mode_ == READ_WRITE); 1568 DCHECK(mode_ == READ_WRITE);
1569 1569
1570 bool skip_validation = effective_load_flags_ & LOAD_PREFERRING_CACHE || 1570 bool skip_validation = effective_load_flags_ & LOAD_PREFERRING_CACHE ||
1571 !RequiresValidation(); 1571 !RequiresValidation();
1572 1572
1573 if (truncated_) 1573 if (truncated_)
1574 skip_validation = !partial_->initial_validation(); 1574 skip_validation = !partial_->initial_validation();
1575 1575
gavinp 2012/07/30 18:35:07 Is it worthwhile adding a DCHECK here that capture
1576 if ((partial_.get() && !partial_->IsCurrentRangeCached()) || invalid_range_) 1576 if (partial_.get() && (is_sparse_ || truncated_) &&
1577 (!partial_->IsCurrentRangeCached() || invalid_range_)) {
1578 // Only force revalidation for sparse or truncated entries.
gavinp 2012/07/30 18:35:07 I think the "Only" here is a bit confusing: skip_v
rvargas (doing something else) 2012/07/30 21:38:52 but this is not about skip_validation being false,
1577 skip_validation = false; 1579 skip_validation = false;
1580 }
1578 1581
1579 if (skip_validation) { 1582 if (skip_validation) {
1580 if (partial_.get()) { 1583 if (partial_.get()) {
1581 // We are going to return the saved response headers to the caller, so 1584 if (truncated_ || is_sparse_ || !invalid_range_) {
1582 // we may need to adjust them first. 1585 // We are going to return the saved response headers to the caller, so
1583 next_state_ = STATE_PARTIAL_HEADERS_RECEIVED; 1586 // we may need to adjust them first.
1584 return OK; 1587 next_state_ = STATE_PARTIAL_HEADERS_RECEIVED;
1588 return OK;
1589 } else {
1590 partial_.reset();
1591 }
1585 } 1592 }
1586 cache_->ConvertWriterToReader(entry_); 1593 cache_->ConvertWriterToReader(entry_);
1587 mode_ = READ; 1594 mode_ = READ;
1588 1595
1589 if (entry_->disk_entry->GetDataSize(kMetadataIndex)) 1596 if (entry_->disk_entry->GetDataSize(kMetadataIndex))
1590 next_state_ = STATE_CACHE_READ_METADATA; 1597 next_state_ = STATE_CACHE_READ_METADATA;
1591 } else { 1598 } else {
1592 // Make the network request conditional, to see if we may reuse our cached 1599 // Make the network request conditional, to see if we may reuse our cached
1593 // response. If we cannot do so, then we just resort to a normal fetch. 1600 // response. If we cannot do so, then we just resort to a normal fetch.
1594 // Our mode remains READ_WRITE for a conditional request. We'll switch to 1601 // Our mode remains READ_WRITE for a conditional request. We'll switch to
1595 // either READ or WRITE mode once we hear back from the server. 1602 // either READ or WRITE mode once we hear back from the server.
1596 if (!ConditionalizeRequest()) { 1603 if (!ConditionalizeRequest()) {
1597 DCHECK(!partial_.get()); 1604 if (partial_.get())
1605 return DoRestartPartialRequest();
gavinp 2012/07/30 18:35:07 So this makes me sad because if we have a range ca
rvargas (doing something else) 2012/07/30 21:38:52 Not unless we are unable to conditionalize the req
1606
1598 DCHECK_NE(206, response_.headers->response_code()); 1607 DCHECK_NE(206, response_.headers->response_code());
1599 mode_ = WRITE; 1608 mode_ = WRITE;
1600 } 1609 }
1601 next_state_ = STATE_SEND_REQUEST; 1610 next_state_ = STATE_SEND_REQUEST;
1602 } 1611 }
1603 return OK; 1612 return OK;
1604 } 1613 }
1605 1614
1606 int HttpCache::Transaction::BeginPartialCacheValidation() { 1615 int HttpCache::Transaction::BeginPartialCacheValidation() {
1607 DCHECK(mode_ == READ_WRITE); 1616 DCHECK(mode_ == READ_WRITE);
(...skipping 16 matching lines...) Expand all
1624 1633
1625 return ValidateEntryHeadersAndContinue(); 1634 return ValidateEntryHeadersAndContinue();
1626 } 1635 }
1627 1636
1628 // This should only be called once per request. 1637 // This should only be called once per request.
1629 int HttpCache::Transaction::ValidateEntryHeadersAndContinue() { 1638 int HttpCache::Transaction::ValidateEntryHeadersAndContinue() {
1630 DCHECK(mode_ == READ_WRITE); 1639 DCHECK(mode_ == READ_WRITE);
1631 1640
1632 if (!partial_->UpdateFromStoredHeaders(response_.headers, entry_->disk_entry, 1641 if (!partial_->UpdateFromStoredHeaders(response_.headers, entry_->disk_entry,
1633 truncated_)) { 1642 truncated_)) {
1634 // The stored data cannot be used. Get rid of it and restart this request. 1643 return DoRestartPartialRequest();
1635 // We need to also reset the |truncated_| flag as a new entry is created.
1636 DoomPartialEntry(!range_requested_);
1637 mode_ = WRITE;
1638 truncated_ = false;
1639 next_state_ = STATE_INIT_ENTRY;
1640 return OK;
1641 } 1644 }
1642 1645
1643 if (response_.headers->response_code() == 206) 1646 if (response_.headers->response_code() == 206)
1644 is_sparse_ = true; 1647 is_sparse_ = true;
1645 1648
1646 if (!partial_->IsRequestedRangeOK()) { 1649 if (!partial_->IsRequestedRangeOK()) {
1647 // The stored data is fine, but the request may be invalid. 1650 // The stored data is fine, but the request may be invalid.
1648 invalid_range_ = true; 1651 invalid_range_ = true;
1649 } 1652 }
1650 1653
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
1870 1873
1871 if (response_code == 304 && partial_->ResponseHeadersOK(headers)) 1874 if (response_code == 304 && partial_->ResponseHeadersOK(headers))
1872 return true; 1875 return true;
1873 } else { 1876 } else {
1874 // We asked for "If-Range: " so a 206 means just another range. 1877 // We asked for "If-Range: " so a 206 means just another range.
1875 if (partial_response && partial_->ResponseHeadersOK(headers)) { 1878 if (partial_response && partial_->ResponseHeadersOK(headers)) {
1876 handling_206_ = true; 1879 handling_206_ = true;
1877 return true; 1880 return true;
1878 } 1881 }
1879 1882
1880 if (response_code == 200 && !reading_ && !is_sparse_) { 1883 if (!reading_ && !is_sparse_ && !partial_response) {
1881 // The server is sending the whole resource, and we can save it. 1884 // See if we can ignore the fact that we issued a byte range request.
1882 DCHECK((truncated_ && !partial_->IsLastRange()) || range_requested_); 1885 // If the server sends 200, just store it. If it sends an error, redirect
1883 partial_.reset(); 1886 // or something else, we may store the response as long as we didn't have
1884 truncated_ = false; 1887 // anything already stored.
1885 return true; 1888 if (response_code == 200 ||
1889 (!truncated_ && response_code != 304 && response_code != 416)) {
1890 // The server is sending something else, and we can save it.
1891 DCHECK((truncated_ && !partial_->IsLastRange()) || range_requested_);
1892 partial_.reset();
1893 truncated_ = false;
1894 return true;
1895 }
1886 } 1896 }
1887 1897
1888 // 304 is not expected here, but we'll spare the entry (unless it was 1898 // 304 is not expected here, but we'll spare the entry (unless it was
1889 // truncated). 1899 // truncated).
1890 if (truncated_) 1900 if (truncated_)
1891 failure = true; 1901 failure = true;
1892 } 1902 }
1893 1903
1894 if (failure) { 1904 if (failure) {
1895 // We cannot truncate this entry, it has to be deleted. 1905 // We cannot truncate this entry, it has to be deleted.
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
2072 2082
2073 if (result == 0 && mode_ == READ_WRITE) { 2083 if (result == 0 && mode_ == READ_WRITE) {
2074 // We need to move on to the next range. 2084 // We need to move on to the next range.
2075 next_state_ = STATE_START_PARTIAL_CACHE_VALIDATION; 2085 next_state_ = STATE_START_PARTIAL_CACHE_VALIDATION;
2076 } else if (result < 0) { 2086 } else if (result < 0) {
2077 return OnCacheReadError(result, false); 2087 return OnCacheReadError(result, false);
2078 } 2088 }
2079 return result; 2089 return result;
2080 } 2090 }
2081 2091
2092 int HttpCache::Transaction::DoRestartPartialRequest() {
2093 // The stored data cannot be used. Get rid of it and restart this request.
2094 // We need to also reset the |truncated_| flag as a new entry is created.
2095 DoomPartialEntry(!range_requested_);
2096 mode_ = WRITE;
2097 truncated_ = false;
2098 next_state_ = STATE_INIT_ENTRY;
2099 return OK;
2100 }
2101
2082 // Histogram data from the end of 2010 show the following distribution of 2102 // Histogram data from the end of 2010 show the following distribution of
2083 // response headers: 2103 // response headers:
2084 // 2104 //
2085 // Content-Length............... 87% 2105 // Content-Length............... 87%
2086 // Date......................... 98% 2106 // Date......................... 98%
2087 // Last-Modified................ 49% 2107 // Last-Modified................ 49%
2088 // Etag......................... 19% 2108 // Etag......................... 19%
2089 // Accept-Ranges: bytes......... 25% 2109 // Accept-Ranges: bytes......... 25%
2090 // Accept-Ranges: none.......... 0.4% 2110 // Accept-Ranges: none.......... 0.4%
2091 // Strong Validator............. 50% 2111 // Strong Validator............. 50%
(...skipping 14 matching lines...) Expand all
2106 return false; 2126 return false;
2107 2127
2108 return true; 2128 return true;
2109 } 2129 }
2110 2130
2111 void HttpCache::Transaction::OnIOComplete(int result) { 2131 void HttpCache::Transaction::OnIOComplete(int result) {
2112 DoLoop(result); 2132 DoLoop(result);
2113 } 2133 }
2114 2134
2115 } // namespace net 2135 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698