context_host_resolver.cc 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. // Copyright (c) 2019 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 "net/dns/context_host_resolver.h"
  5. #include <string>
  6. #include <utility>
  7. #include <vector>
  8. #include "base/check_op.h"
  9. #include "base/strings/string_piece.h"
  10. #include "base/time/tick_clock.h"
  11. #include "net/base/net_errors.h"
  12. #include "net/base/network_isolation_key.h"
  13. #include "net/dns/dns_config.h"
  14. #include "net/dns/host_cache.h"
  15. #include "net/dns/host_resolver.h"
  16. #include "net/dns/host_resolver_manager.h"
  17. #include "net/dns/host_resolver_proc.h"
  18. #include "net/dns/host_resolver_results.h"
  19. #include "net/dns/public/resolve_error_info.h"
  20. #include "net/dns/resolve_context.h"
  21. #include "net/log/net_log_with_source.h"
  22. #include "net/url_request/url_request_context.h"
  23. #include "third_party/abseil-cpp/absl/types/optional.h"
  24. #include "url/scheme_host_port.h"
  25. namespace net {
  26. ContextHostResolver::ContextHostResolver(
  27. HostResolverManager* manager,
  28. std::unique_ptr<ResolveContext> resolve_context)
  29. : manager_(manager), resolve_context_(std::move(resolve_context)) {
  30. DCHECK(manager_);
  31. DCHECK(resolve_context_);
  32. manager_->RegisterResolveContext(resolve_context_.get());
  33. }
  34. ContextHostResolver::ContextHostResolver(
  35. std::unique_ptr<HostResolverManager> owned_manager,
  36. std::unique_ptr<ResolveContext> resolve_context)
  37. : ContextHostResolver(owned_manager.get(), std::move(resolve_context)) {
  38. owned_manager_ = std::move(owned_manager);
  39. }
  40. ContextHostResolver::~ContextHostResolver() {
  41. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  42. if (owned_manager_)
  43. DCHECK_EQ(owned_manager_.get(), manager_);
  44. // No |resolve_context_| to deregister if OnShutdown() was already called.
  45. if (resolve_context_)
  46. manager_->DeregisterResolveContext(resolve_context_.get());
  47. }
  48. void ContextHostResolver::OnShutdown() {
  49. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  50. DCHECK(resolve_context_);
  51. manager_->DeregisterResolveContext(resolve_context_.get());
  52. resolve_context_.reset();
  53. DCHECK(!shutting_down_);
  54. shutting_down_ = true;
  55. }
  56. std::unique_ptr<HostResolver::ResolveHostRequest>
  57. ContextHostResolver::CreateRequest(
  58. url::SchemeHostPort host,
  59. NetworkIsolationKey network_isolation_key,
  60. NetLogWithSource source_net_log,
  61. absl::optional<ResolveHostParameters> optional_parameters) {
  62. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  63. if (shutting_down_)
  64. return HostResolver::CreateFailingRequest(ERR_CONTEXT_SHUT_DOWN);
  65. return manager_->CreateRequest(
  66. std::move(host), std::move(network_isolation_key),
  67. std::move(source_net_log), std::move(optional_parameters),
  68. resolve_context_.get(), resolve_context_->host_cache());
  69. }
  70. std::unique_ptr<HostResolver::ResolveHostRequest>
  71. ContextHostResolver::CreateRequest(
  72. const HostPortPair& host,
  73. const NetworkIsolationKey& network_isolation_key,
  74. const NetLogWithSource& source_net_log,
  75. const absl::optional<ResolveHostParameters>& optional_parameters) {
  76. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  77. if (shutting_down_)
  78. return HostResolver::CreateFailingRequest(ERR_CONTEXT_SHUT_DOWN);
  79. return manager_->CreateRequest(host, network_isolation_key, source_net_log,
  80. optional_parameters, resolve_context_.get(),
  81. resolve_context_->host_cache());
  82. }
  83. std::unique_ptr<HostResolver::ProbeRequest>
  84. ContextHostResolver::CreateDohProbeRequest() {
  85. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  86. if (shutting_down_)
  87. return HostResolver::CreateFailingProbeRequest(ERR_CONTEXT_SHUT_DOWN);
  88. return manager_->CreateDohProbeRequest(resolve_context_.get());
  89. }
  90. std::unique_ptr<HostResolver::MdnsListener>
  91. ContextHostResolver::CreateMdnsListener(const HostPortPair& host,
  92. DnsQueryType query_type) {
  93. return manager_->CreateMdnsListener(host, query_type);
  94. }
  95. HostCache* ContextHostResolver::GetHostCache() {
  96. return resolve_context_->host_cache();
  97. }
  98. base::Value ContextHostResolver::GetDnsConfigAsValue() const {
  99. return manager_->GetDnsConfigAsValue();
  100. }
  101. void ContextHostResolver::SetRequestContext(
  102. URLRequestContext* request_context) {
  103. DCHECK(!shutting_down_);
  104. DCHECK(resolve_context_);
  105. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  106. resolve_context_->set_url_request_context(request_context);
  107. }
  108. HostResolverManager* ContextHostResolver::GetManagerForTesting() {
  109. return manager_;
  110. }
  111. const URLRequestContext* ContextHostResolver::GetContextForTesting() const {
  112. return resolve_context_ ? resolve_context_->url_request_context() : nullptr;
  113. }
  114. handles::NetworkHandle ContextHostResolver::GetTargetNetworkForTesting() const {
  115. return resolve_context_ ? resolve_context_->GetTargetNetwork()
  116. : handles::kInvalidNetworkHandle;
  117. }
  118. size_t ContextHostResolver::LastRestoredCacheSize() const {
  119. return resolve_context_->host_cache()
  120. ? resolve_context_->host_cache()->last_restore_size()
  121. : 0;
  122. }
  123. size_t ContextHostResolver::CacheSize() const {
  124. return resolve_context_->host_cache() ? resolve_context_->host_cache()->size()
  125. : 0;
  126. }
  127. void ContextHostResolver::SetProcParamsForTesting(
  128. const ProcTaskParams& proc_params) {
  129. manager_->set_proc_params_for_test(proc_params);
  130. }
  131. void ContextHostResolver::SetTickClockForTesting(
  132. const base::TickClock* tick_clock) {
  133. manager_->SetTickClockForTesting(tick_clock);
  134. if (resolve_context_->host_cache())
  135. resolve_context_->host_cache()->set_tick_clock_for_testing(tick_clock);
  136. }
  137. } // namespace net