http_cache_data_remover.cc 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. // Copyright 2018 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "services/network/http_cache_data_remover.h"
  5. #include <set>
  6. #include <string>
  7. #include "base/bind.h"
  8. #include "base/location.h"
  9. #include "base/threading/sequenced_task_runner_handle.h"
  10. #include "net/base/registry_controlled_domains/registry_controlled_domain.h"
  11. #include "net/disk_cache/disk_cache.h"
  12. #include "net/http/http_cache.h"
  13. #include "net/http/http_network_session.h"
  14. #include "net/url_request/url_request_context.h"
  15. #include "net/url_request/url_request_context_getter.h"
  16. #include "services/network/public/mojom/network_context.mojom.h"
  17. #include "url/gurl.h"
  18. namespace network {
  19. namespace {
  20. bool DoesUrlMatchFilter(mojom::ClearDataFilter_Type filter_type,
  21. const std::set<url::Origin>& origins,
  22. const std::set<std::string>& domains,
  23. const GURL& url) {
  24. std::string url_registerable_domain =
  25. net::registry_controlled_domains::GetDomainAndRegistry(
  26. url, net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES);
  27. bool found_domain = (domains.find(url_registerable_domain != ""
  28. ? url_registerable_domain
  29. : url.host()) != domains.end());
  30. bool found_origin = (origins.find(url::Origin::Create(url)) != origins.end());
  31. return ((found_domain || found_origin) ==
  32. (filter_type == mojom::ClearDataFilter_Type::DELETE_MATCHES));
  33. }
  34. } // namespace
  35. HttpCacheDataRemover::HttpCacheDataRemover(
  36. mojom::ClearDataFilterPtr url_filter,
  37. base::Time delete_begin,
  38. base::Time delete_end,
  39. HttpCacheDataRemoverCallback done_callback)
  40. : delete_begin_(delete_begin),
  41. delete_end_(delete_end),
  42. done_callback_(std::move(done_callback)),
  43. backend_(nullptr) {
  44. DCHECK(!done_callback_.is_null());
  45. if (!url_filter)
  46. return;
  47. // Use the filter to create the |url_matcher_| callback.
  48. std::set<std::string> domains;
  49. domains.insert(url_filter->domains.begin(), url_filter->domains.end());
  50. std::set<url::Origin> origins;
  51. origins.insert(url_filter->origins.begin(), url_filter->origins.end());
  52. url_matcher_ = base::BindRepeating(&DoesUrlMatchFilter, url_filter->type,
  53. origins, domains);
  54. }
  55. HttpCacheDataRemover::~HttpCacheDataRemover() = default;
  56. // static.
  57. std::unique_ptr<HttpCacheDataRemover> HttpCacheDataRemover::CreateAndStart(
  58. net::URLRequestContext* url_request_context,
  59. mojom::ClearDataFilterPtr url_filter,
  60. base::Time delete_begin,
  61. base::Time delete_end,
  62. HttpCacheDataRemoverCallback done_callback) {
  63. DCHECK(done_callback);
  64. std::unique_ptr<HttpCacheDataRemover> remover(
  65. new HttpCacheDataRemover(std::move(url_filter), delete_begin, delete_end,
  66. std::move(done_callback)));
  67. net::HttpCache* http_cache =
  68. url_request_context->http_transaction_factory()->GetCache();
  69. if (!http_cache) {
  70. // Some contexts might not have a cache, in which case we are done.
  71. // Notify by posting a task to avoid reentrency.
  72. base::SequencedTaskRunnerHandle::Get()->PostTask(
  73. FROM_HERE,
  74. base::BindOnce(&HttpCacheDataRemover::ClearHttpCacheDone,
  75. remover->weak_factory_.GetWeakPtr(), net::OK));
  76. return remover;
  77. }
  78. // Clear QUIC server information from memory and the disk cache.
  79. // TODO(crbug.com/817849): add a browser test to validate the QUIC information
  80. // is cleared.
  81. http_cache->GetSession()
  82. ->quic_stream_factory()
  83. ->ClearCachedStatesInCryptoConfig(remover->url_matcher_);
  84. net::CompletionOnceCallback callback =
  85. base::BindOnce(&HttpCacheDataRemover::CacheRetrieved,
  86. remover->weak_factory_.GetWeakPtr());
  87. int rv = http_cache->GetBackend(&remover->backend_, std::move(callback));
  88. if (rv != net::ERR_IO_PENDING) {
  89. remover->CacheRetrieved(rv);
  90. }
  91. return remover;
  92. }
  93. void HttpCacheDataRemover::CacheRetrieved(int rv) {
  94. DCHECK(done_callback_);
  95. // |backend_| can be null if it cannot be initialized.
  96. if (rv != net::OK || !backend_) {
  97. backend_ = nullptr;
  98. base::SequencedTaskRunnerHandle::Get()->PostTask(
  99. FROM_HERE, base::BindOnce(&HttpCacheDataRemover::ClearHttpCacheDone,
  100. weak_factory_.GetWeakPtr(), rv));
  101. return;
  102. }
  103. if (!url_matcher_.is_null()) {
  104. deletion_helper_ = ConditionalCacheDeletionHelper::CreateAndStart(
  105. backend_, url_matcher_, delete_begin_, delete_end_,
  106. base::BindOnce(&HttpCacheDataRemover::ClearHttpCacheDone,
  107. weak_factory_.GetWeakPtr(), net::OK));
  108. return;
  109. }
  110. if (delete_begin_.is_null() && delete_end_.is_max()) {
  111. rv = backend_->DoomAllEntries(base::BindOnce(
  112. &HttpCacheDataRemover::ClearHttpCacheDone, weak_factory_.GetWeakPtr()));
  113. } else {
  114. rv = backend_->DoomEntriesBetween(
  115. delete_begin_, delete_end_,
  116. base::BindOnce(&HttpCacheDataRemover::ClearHttpCacheDone,
  117. weak_factory_.GetWeakPtr()));
  118. }
  119. if (rv != net::ERR_IO_PENDING) {
  120. // Notify by posting a task to avoid reentrency.
  121. base::SequencedTaskRunnerHandle::Get()->PostTask(
  122. FROM_HERE, base::BindOnce(&HttpCacheDataRemover::ClearHttpCacheDone,
  123. weak_factory_.GetWeakPtr(), rv));
  124. }
  125. }
  126. void HttpCacheDataRemover::ClearHttpCacheDone(int rv) {
  127. std::move(done_callback_).Run(this);
  128. }
  129. } // namespace network