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

Side by Side Diff: content/browser/appcache/appcache_update_job.cc

Issue 879393002: Expire appcaches that fail to update for "too long". (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 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 unified diff | Download patch
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 "content/browser/appcache/appcache_update_job.h" 5 #include "content/browser/appcache/appcache_update_job.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/compiler_specific.h" 9 #include "base/compiler_specific.h"
10 #include "base/message_loop/message_loop.h" 10 #include "base/message_loop/message_loop.h"
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after
244 DCHECK_EQ(UPDATE_OK, result_); 244 DCHECK_EQ(UPDATE_OK, result_);
245 OnResponseCompleted(); 245 OnResponseCompleted();
246 } 246 }
247 } 247 }
248 248
249 void AppCacheUpdateJob::URLFetcher::AddConditionalHeaders( 249 void AppCacheUpdateJob::URLFetcher::AddConditionalHeaders(
250 const net::HttpResponseHeaders* headers) { 250 const net::HttpResponseHeaders* headers) {
251 DCHECK(request_.get() && headers); 251 DCHECK(request_.get() && headers);
252 net::HttpRequestHeaders extra_headers; 252 net::HttpRequestHeaders extra_headers;
253 253
254 // TODO(michaeln): skip condition headers on manifest fetches if its been 24 h ours
255 // since the last update check
256 // TODO: store date of last update check even that busted the cache
257 // if (firstManifestFetch &&
258 // now > newest_successful_unconditional_update_check_time + 24hours)
259 // performing_unconditional_update_check_ = true;
260
254 // Add If-Modified-Since header if response info has Last-Modified header. 261 // Add If-Modified-Since header if response info has Last-Modified header.
255 const std::string last_modified = "Last-Modified"; 262 const std::string last_modified = "Last-Modified";
256 std::string last_modified_value; 263 std::string last_modified_value;
257 headers->EnumerateHeader(NULL, last_modified, &last_modified_value); 264 headers->EnumerateHeader(NULL, last_modified, &last_modified_value);
258 if (!last_modified_value.empty()) { 265 if (!last_modified_value.empty()) {
259 extra_headers.SetHeader(net::HttpRequestHeaders::kIfModifiedSince, 266 extra_headers.SetHeader(net::HttpRequestHeaders::kIfModifiedSince,
260 last_modified_value); 267 last_modified_value);
261 } 268 }
262 269
263 // Add If-None-Match header if response info has ETag header. 270 // Add If-None-Match header if response info has ETag header.
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
471 DCHECK(!error_details.message.empty()); 478 DCHECK(!error_details.message.empty());
472 DCHECK(result != UPDATE_OK); 479 DCHECK(result != UPDATE_OK);
473 internal_state_ = CACHE_FAILURE; 480 internal_state_ = CACHE_FAILURE;
474 LogHistogramStats(result, failed_resource_url); 481 LogHistogramStats(result, failed_resource_url);
475 CancelAllUrlFetches(); 482 CancelAllUrlFetches();
476 CancelAllMasterEntryFetches(error_details); 483 CancelAllMasterEntryFetches(error_details);
477 NotifyAllError(error_details); 484 NotifyAllError(error_details);
478 DiscardInprogressCache(); 485 DiscardInprogressCache();
479 internal_state_ = COMPLETED; 486 internal_state_ = COMPLETED;
480 DeleteSoon(); // To unwind the stack prior to deletion. 487 DeleteSoon(); // To unwind the stack prior to deletion.
488
489 // TODO(michaeln): Evict the cache under other cicrumstances too
490 // if we've been getting srvr errors for "too long"
491 // if we've been getting srvr redirects for "too long"
492 // if we've been getting an invalid manifest for "too long"
493 // maybe "too long" for http is less than it is for https?
palmer 2015/04/21 19:56:34 Good idea.
494 // TODO: store date of first evictable error since last successfull update c heck
495 // if (is_an_evictable_error &&
496 // now > first_evictable_error_since_successfull_check + kTooLong)
497 // evict();
498 // else if (!first_evictable_error_since_successfull_check) set it to now
481 } 499 }
482 500
483 void AppCacheUpdateJob::FetchManifest(bool is_first_fetch) { 501 void AppCacheUpdateJob::FetchManifest(bool is_first_fetch) {
484 DCHECK(!manifest_fetcher_); 502 DCHECK(!manifest_fetcher_);
485 manifest_fetcher_ = new URLFetcher( 503 manifest_fetcher_ = new URLFetcher(
486 manifest_url_, 504 manifest_url_,
487 is_first_fetch ? URLFetcher::MANIFEST_FETCH : 505 is_first_fetch ? URLFetcher::MANIFEST_FETCH :
488 URLFetcher::MANIFEST_REFETCH, 506 URLFetcher::MANIFEST_REFETCH,
489 this); 507 this);
490 508
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
534 if (update_type_ == UPGRADE_ATTEMPT) 552 if (update_type_ == UPGRADE_ATTEMPT)
535 CheckIfManifestChanged(); // continues asynchronously 553 CheckIfManifestChanged(); // continues asynchronously
536 else 554 else
537 ContinueHandleManifestFetchCompleted(true); 555 ContinueHandleManifestFetchCompleted(true);
538 } else if (response_code == 304 && update_type_ == UPGRADE_ATTEMPT) { 556 } else if (response_code == 304 && update_type_ == UPGRADE_ATTEMPT) {
539 ContinueHandleManifestFetchCompleted(false); 557 ContinueHandleManifestFetchCompleted(false);
540 } else if ((response_code == 404 || response_code == 410) && 558 } else if ((response_code == 404 || response_code == 410) &&
541 update_type_ == UPGRADE_ATTEMPT) { 559 update_type_ == UPGRADE_ATTEMPT) {
542 storage_->MakeGroupObsolete(group_, this, response_code); // async 560 storage_->MakeGroupObsolete(group_, this, response_code); // async
543 } else { 561 } else {
562 // TODO(michaeln): Evict the cache under other cicrumstances too.
563 // APPCACHE_MANIFEST_ERROR + networkresponsecde is an evictable error
544 const char* kFormatString = "Manifest fetch failed (%d) %s"; 564 const char* kFormatString = "Manifest fetch failed (%d) %s";
545 std::string message = FormatUrlErrorMessage( 565 std::string message = FormatUrlErrorMessage(
546 kFormatString, manifest_url_, fetcher->result(), response_code); 566 kFormatString, manifest_url_, fetcher->result(), response_code);
547 HandleCacheFailure(AppCacheErrorDetails(message, 567 HandleCacheFailure(AppCacheErrorDetails(message,
548 APPCACHE_MANIFEST_ERROR, 568 APPCACHE_MANIFEST_ERROR,
549 manifest_url_, 569 manifest_url_,
550 response_code, 570 response_code,
551 false /*is_cross_origin*/), 571 false /*is_cross_origin*/),
552 fetcher->result(), 572 fetcher->result(),
553 GURL()); 573 GURL());
(...skipping 26 matching lines...) Expand all
580 false /*is_cross_origin*/), 600 false /*is_cross_origin*/),
581 DB_ERROR, 601 DB_ERROR,
582 GURL()); 602 GURL());
583 } 603 }
584 } 604 }
585 605
586 void AppCacheUpdateJob::ContinueHandleManifestFetchCompleted(bool changed) { 606 void AppCacheUpdateJob::ContinueHandleManifestFetchCompleted(bool changed) {
587 DCHECK(internal_state_ == FETCH_MANIFEST); 607 DCHECK(internal_state_ == FETCH_MANIFEST);
588 608
589 if (!changed) { 609 if (!changed) {
610 // if unconditional_check, set time to now
590 DCHECK(update_type_ == UPGRADE_ATTEMPT); 611 DCHECK(update_type_ == UPGRADE_ATTEMPT);
591 internal_state_ = NO_UPDATE; 612 internal_state_ = NO_UPDATE;
592 613
593 // Wait for pending master entries to download. 614 // Wait for pending master entries to download.
594 FetchMasterEntries(); 615 FetchMasterEntries();
595 MaybeCompleteUpdate(); // if not done, run async 6.9.4 step 7 substeps 616 MaybeCompleteUpdate(); // if not done, run async 6.9.4 step 7 substeps
596 return; 617 return;
597 } 618 }
598 619
599 AppCacheManifest manifest; 620 AppCacheManifest manifest;
600 if (!ParseManifest(manifest_url_, manifest_data_.data(), 621 if (!ParseManifest(manifest_url_, manifest_data_.data(),
601 manifest_data_.length(), 622 manifest_data_.length(),
602 manifest_has_valid_mime_type_ ? 623 manifest_has_valid_mime_type_ ?
603 PARSE_MANIFEST_ALLOWING_INTERCEPTS : 624 PARSE_MANIFEST_ALLOWING_INTERCEPTS :
604 PARSE_MANIFEST_PER_STANDARD, 625 PARSE_MANIFEST_PER_STANDARD,
605 manifest)) { 626 manifest)) {
627 // TODO(michaeln): Evict the cache under other cicrumstances too.
628 // APPCACHE_SIGNATURE_ERROR is an evictable error
606 const char* kFormatString = "Failed to parse manifest %s"; 629 const char* kFormatString = "Failed to parse manifest %s";
607 const std::string message = base::StringPrintf(kFormatString, 630 const std::string message = base::StringPrintf(kFormatString,
608 manifest_url_.spec().c_str()); 631 manifest_url_.spec().c_str());
609 HandleCacheFailure( 632 HandleCacheFailure(
610 AppCacheErrorDetails( 633 AppCacheErrorDetails(
611 message, APPCACHE_SIGNATURE_ERROR, GURL(), 0, 634 message, APPCACHE_SIGNATURE_ERROR, GURL(), 0,
612 false /*is_cross_origin*/), 635 false /*is_cross_origin*/),
613 MANIFEST_ERROR, 636 MANIFEST_ERROR,
614 GURL()); 637 GURL());
615 VLOG(1) << message; 638 VLOG(1) << message;
(...skipping 1005 matching lines...) Expand 10 before | Expand all | Expand 10 after
1621 1644
1622 // Break the connection with the group so the group cannot call delete 1645 // Break the connection with the group so the group cannot call delete
1623 // on this object after we've posted a task to delete ourselves. 1646 // on this object after we've posted a task to delete ourselves.
1624 group_->SetUpdateAppCacheStatus(AppCacheGroup::IDLE); 1647 group_->SetUpdateAppCacheStatus(AppCacheGroup::IDLE);
1625 group_ = NULL; 1648 group_ = NULL;
1626 1649
1627 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); 1650 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
1628 } 1651 }
1629 1652
1630 } // namespace content 1653 } // namespace content
OLDNEW
« content/browser/appcache/appcache.h ('K') | « content/browser/appcache/appcache.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698