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

Unified Diff: net/http/http_cache.cc

Issue 345019: Http cache: Allow multiple external validation headers.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 2 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
« no previous file with comments | « no previous file | net/http/http_cache_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/http/http_cache.cc
===================================================================
--- net/http/http_cache.cc (revision 30231)
+++ net/http/http_cache.cc (working copy)
@@ -71,23 +71,11 @@
// Helper struct to pair a header name with its value, for
// headers used to validate cache entries.
-struct ValidationHeader {
- enum {kInvalidIndex = -1};
+struct ValidationHeaders {
+ ValidationHeaders() : initialized(false) {}
- ValidationHeader() : type_index(kInvalidIndex) {}
-
- bool initialized() const {
- return type_index != kInvalidIndex;
- }
-
- const ValidationHeaderInfo& type_info() {
- DCHECK(initialized());
- return kValidationHeaders[type_index];
- }
-
- // Index into |kValidationHeaders|.
- int type_index;
- std::string value;
+ std::string values[ARRAYSIZE_UNSAFE(kValidationHeaders)];
+ bool initialized;
};
// If the request includes one of these request headers, then avoid reusing
@@ -371,8 +359,8 @@
const HttpRequestInfo* request_;
scoped_ptr<HttpRequestInfo> custom_request_;
// If extra_headers specified a "if-modified-since" or "if-none-match",
- // |external_validation_| contains the value of that header.
- ValidationHeader external_validation_;
+ // |external_validation_| contains the value of those headers.
+ ValidationHeaders external_validation_;
base::WeakPtr<HttpCache> cache_;
HttpCache::ActiveEntry* entry_;
scoped_ptr<HttpTransaction> network_trans_;
@@ -458,7 +446,7 @@
}
// Downgrade to UPDATE if the request has been externally conditionalized.
- if (external_validation_.initialized()) {
+ if (external_validation_.initialized) {
if (mode_ & WRITE) {
// Strip off the READ_DATA bit (and maybe add back a READ_META bit
// in case READ was off).
@@ -799,12 +787,8 @@
std::string new_extra_headers;
bool range_found = false;
+ bool external_validation_error = false;
- // We will scan through the headers to see if any "if-modified-since" or
- // "if-none-match" request headers were specified as part of extra_headers.
- int num_validation_headers = 0;
- ValidationHeader validation_header;
-
// scan request headers to see if we have any that would impact our load flags
HttpUtil::HeadersIterator it(request_->extra_headers.begin(),
request_->extra_headers.end(),
@@ -834,20 +818,29 @@
const ValidationHeaderInfo& info = kValidationHeaders[i];
if (LowerCaseEqualsASCII(it.name_begin(), it.name_end(),
info.request_header_name)) {
- num_validation_headers++;
- validation_header.type_index = i;
- validation_header.value = it.values();
+ if (!external_validation_.values[i].empty() || it.values().empty())
+ external_validation_error = true;
+ external_validation_.values[i] = it.values();
+ external_validation_.initialized = true;
break;
}
}
}
// We don't support ranges and validation headers.
- if (range_found && num_validation_headers) {
+ if (range_found && external_validation_.initialized) {
LOG(WARNING) << "Byte ranges AND validation headers found.";
effective_load_flags_ |= LOAD_DISABLE_CACHE;
}
+ // If there is more than one validation header, we can't treat this request as
+ // a cache validation, since we don't know for sure which header the server
+ // will give us a response for (and they could be contradictory).
+ if (external_validation_error) {
+ LOG(WARNING) << "Multiple or malformed validation headers found.";
+ effective_load_flags_ |= LOAD_DISABLE_CACHE;
+ }
+
if (range_found && !(effective_load_flags_ & LOAD_DISABLE_CACHE)) {
partial_.reset(new PartialData);
if (partial_->Init(request_->extra_headers, new_extra_headers)) {
@@ -863,19 +856,6 @@
partial_.reset(NULL);
}
}
-
- // If there is more than one validation header, we can't treat this request as
- // a cache validation, since we don't know for sure which header the server
- // will give us a response for (and they could be contradictory).
- if (num_validation_headers > 1) {
- LOG(WARNING) << "Multiple validation headers found.";
- effective_load_flags_ |= LOAD_DISABLE_CACHE;
- }
-
- if (num_validation_headers == 1) {
- DCHECK(validation_header.initialized());
- external_validation_ = validation_header;
- }
}
bool HttpCache::Transaction::ShouldPassThrough() {
@@ -1029,7 +1009,7 @@
int HttpCache::Transaction::BeginExternallyConditionalizedRequest() {
DCHECK_EQ(UPDATE, mode_);
- DCHECK(external_validation_.initialized());
+ DCHECK(external_validation_.initialized);
// Read the cached response.
int rv = ReadResponseInfoFromEntry();
@@ -1038,19 +1018,22 @@
return HandleResult(rv);
}
- // Retrieve either the cached response's "etag" or "last-modified" header,
- // depending on which is applicable for the caller's request header.
- std::string validator;
- response_.headers->EnumerateHeader(
- NULL,
- external_validation_.type_info().related_response_header_name,
- &validator);
+ for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kValidationHeaders); i++) {
+ if (external_validation_.values[i].empty())
+ continue;
+ // Retrieve either the cached response's "etag" or "last-modified" header.
+ std::string validator;
+ response_.headers->EnumerateHeader(
+ NULL,
+ kValidationHeaders[i].related_response_header_name,
+ &validator);
- if (response_.headers->response_code() != 200 || truncated_ ||
- validator.empty() || validator != external_validation_.value) {
- // The externally conditionalized request is not a validation request
- // for our existing cache entry. Proceed with caching disabled.
- DoneWritingToEntry(true);
+ if (response_.headers->response_code() != 200 || truncated_ ||
+ validator.empty() || validator != external_validation_.values[i]) {
+ // The externally conditionalized request is not a validation request
+ // for our existing cache entry. Proceed with caching disabled.
+ DoneWritingToEntry(true);
+ }
}
return BeginNetworkRequest();
« no previous file with comments | « no previous file | net/http/http_cache_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698