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

Unified Diff: net/http/http_cache_transaction.cc

Issue 12310075: Cache failover to LOAD_PREFERRING_CACHE if network response suggests offline. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Removed vestigial reference to new content flag. Created 7 years, 10 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 side-by-side diff with in-line comments
Download patch
Index: net/http/http_cache_transaction.cc
diff --git a/net/http/http_cache_transaction.cc b/net/http/http_cache_transaction.cc
index 3c9953930bcac27131eb50894d2fec174f78b26f..5ed99e9a55ae56568b090573d57d33bba210e5bd 100644
--- a/net/http/http_cache_transaction.cc
+++ b/net/http/http_cache_transaction.cc
@@ -140,6 +140,7 @@ HttpCache::Transaction::Transaction(
cache_pending_(false),
done_reading_(false),
vary_mismatch_(false),
+ couldnt_conditionalize_request_(false),
io_buf_len_(0),
read_offset_(0),
effective_load_flags_(0),
@@ -810,6 +811,39 @@ int HttpCache::Transaction::DoSendRequestComplete(int result) {
if (!cache_)
return ERR_UNEXPECTED;
+ // If requested, and we have a readable cache entry, and we have
+ // an error indicating that we're offline as opposed to in contact
+ // with a bad server, read from cache anyway.
+ if (effective_load_flags_ & LOAD_CACHE_RETURN_IF_OFFLINE &&
rvargas (doing something else) 2013/03/05 02:58:19 nit: single space before &... and add () around th
Randy Smith (Not in Mondays) 2013/03/05 23:16:14 Whoops; done.
+ mode_ == READ_WRITE && entry_ && !partial_ && result != OK) {
rvargas (doing something else) 2013/03/05 02:58:19 nit: move result != OK to the beginning of this li
rvargas (doing something else) 2013/03/05 02:58:19 it would be nice to make this work with byte range
Randy Smith (Not in Mondays) 2013/03/05 23:16:14 Done.
Randy Smith (Not in Mondays) 2013/03/05 23:16:14 I'm happy to take a swing at that, but I'm not com
rvargas (doing something else) 2013/03/06 03:11:48 I don't think we need to do that on the first vers
Randy Smith (Not in Mondays) 2013/03/06 22:55:55 Ok, sounds good.
+ switch (result) {
rvargas (doing something else) 2013/03/05 02:58:19 if (IsOffline(result)) ?
Randy Smith (Not in Mondays) 2013/03/05 23:16:14 Done. Note that I took the opportunity to get rid
+ // Errors that mean we didn't have a connection to the host.
+ // Go ahead and read from the cache anyway.
+ case ERR_NAME_NOT_RESOLVED:
+ case ERR_INTERNET_DISCONNECTED:
+ case ERR_ADDRESS_UNREACHABLE:
+ case ERR_CONNECTION_TIMED_OUT:
+ network_trans_.reset();
+ UpdateTransactionPattern(PATTERN_NOT_COVERED);
+
+ cache_->ConvertWriterToReader(entry_);
rvargas (doing something else) 2013/03/05 02:58:19 maybe extract this and 1800-1818 into a new method
Randy Smith (Not in Mondays) 2013/03/05 23:16:14 Say more? I don't follow the suggestion, probably
rvargas (doing something else) 2013/03/06 03:11:48 I just meant something like: if (effective_flags.
Randy Smith (Not in Mondays) 2013/03/06 22:55:55 Ah, gotcha. I'm not used to thinking of things th
+ mode_ = READ;
+ response_.was_cache_override = true;
+
+ // If there is metadata, read it. Otherwise, we're done.
+ if (entry_->disk_entry->GetDataSize(kMetadataIndex))
+ next_state_ = STATE_CACHE_READ_METADATA;
+ return OK;
+ default:
+ break;
+ }
+ }
+
+ // If we tried to conditionalize the request and failed, we know
+ // we won't be reading from the cache after this point.
+ if (couldnt_conditionalize_request_)
+ mode_ = WRITE;
+
if (result == OK) {
next_state_ = STATE_SUCCESSFUL_SEND_REQUEST;
return OK;
@@ -1772,6 +1806,10 @@ int HttpCache::Transaction::BeginCacheValidation() {
} else {
partial_.reset();
}
+ } else {
+ // Override possible flag set in RequiresValidation(); we're
+ // validating and did not override from cache.
+ response_.was_cache_override = false;
rvargas (doing something else) 2013/03/05 02:58:19 remove? (see other comments)
Randy Smith (Not in Mondays) 2013/03/05 23:16:14 As noted in other comment, I don't yet follow.
}
cache_->ConvertWriterToReader(entry_);
mode_ = READ;
@@ -1784,12 +1822,16 @@ int HttpCache::Transaction::BeginCacheValidation() {
// Our mode remains READ_WRITE for a conditional request. We'll switch to
// either READ or WRITE mode once we hear back from the server.
if (!ConditionalizeRequest()) {
+ couldnt_conditionalize_request_ = true;
UpdateTransactionPattern(PATTERN_ENTRY_CANT_CONDITIONALIZE);
if (partial_.get())
return DoRestartPartialRequest();
DCHECK_NE(206, response_.headers->response_code());
- mode_ = WRITE;
+ // We don't want to switch mode to WRITE here as in offline
rvargas (doing something else) 2013/03/05 02:58:19 update the comment at 1822 instead of adding a new
Randy Smith (Not in Mondays) 2013/03/05 23:16:14 Done. Note that I changed the comment to only ref
+ // mode we may still need to read from the cache. Instead
+ // we record and test on whether we could conditionalize the
+ // request.
}
next_state_ = STATE_SEND_REQUEST;
}
@@ -1925,8 +1967,10 @@ bool HttpCache::Transaction::RequiresValidation() {
return true;
}
- if (effective_load_flags_ & LOAD_PREFERRING_CACHE)
+ if (effective_load_flags_ & LOAD_PREFERRING_CACHE) {
+ response_.was_cache_override = true;
rvargas (doing something else) 2013/03/05 02:58:19 Feels wrong to do this, especially on this method.
Randy Smith (Not in Mondays) 2013/03/05 23:16:14 ETA: One of your later comments made it clear your
return false;
+ }
if (effective_load_flags_ & LOAD_VALIDATE_CACHE)
return true;

Powered by Google App Engine
This is Rietveld 408576698