• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2019 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "net/dns/context_host_resolver.h"
6 
7 #include <optional>
8 #include <string>
9 #include <utility>
10 #include <vector>
11 
12 #include "base/check_op.h"
13 #include "base/time/tick_clock.h"
14 #include "net/base/net_errors.h"
15 #include "net/base/network_anonymization_key.h"
16 #include "net/dns/dns_config.h"
17 #include "net/dns/host_cache.h"
18 #include "net/dns/host_resolver.h"
19 #include "net/dns/host_resolver_manager.h"
20 #include "net/dns/host_resolver_proc.h"
21 #include "net/dns/public/host_resolver_results.h"
22 #include "net/dns/public/resolve_error_info.h"
23 #include "net/dns/resolve_context.h"
24 #include "net/log/net_log_with_source.h"
25 #include "net/url_request/url_request_context.h"
26 #include "url/scheme_host_port.h"
27 
28 namespace net {
29 
ContextHostResolver(HostResolverManager * manager,std::unique_ptr<ResolveContext> resolve_context)30 ContextHostResolver::ContextHostResolver(
31     HostResolverManager* manager,
32     std::unique_ptr<ResolveContext> resolve_context)
33     : manager_(manager), resolve_context_(std::move(resolve_context)) {
34   CHECK(manager_);
35   CHECK(resolve_context_);
36 
37   manager_->RegisterResolveContext(resolve_context_.get());
38 }
39 
ContextHostResolver(std::unique_ptr<HostResolverManager> owned_manager,std::unique_ptr<ResolveContext> resolve_context)40 ContextHostResolver::ContextHostResolver(
41     std::unique_ptr<HostResolverManager> owned_manager,
42     std::unique_ptr<ResolveContext> resolve_context)
43     : ContextHostResolver(owned_manager.get(), std::move(resolve_context)) {
44   owned_manager_ = std::move(owned_manager);
45 }
46 
~ContextHostResolver()47 ContextHostResolver::~ContextHostResolver() {
48   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
49   if (owned_manager_)
50     DCHECK_EQ(owned_manager_.get(), manager_);
51 
52   // No |resolve_context_| to deregister if OnShutdown() was already called.
53   if (resolve_context_)
54     manager_->DeregisterResolveContext(resolve_context_.get());
55 }
56 
OnShutdown()57 void ContextHostResolver::OnShutdown() {
58   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
59 
60   CHECK(resolve_context_);
61   manager_->DeregisterResolveContext(resolve_context_.get());
62   resolve_context_.reset();
63 
64   CHECK(!shutting_down_);
65   shutting_down_ = true;
66 }
67 
68 std::unique_ptr<HostResolver::ResolveHostRequest>
CreateRequest(url::SchemeHostPort host,NetworkAnonymizationKey network_anonymization_key,NetLogWithSource source_net_log,std::optional<ResolveHostParameters> optional_parameters)69 ContextHostResolver::CreateRequest(
70     url::SchemeHostPort host,
71     NetworkAnonymizationKey network_anonymization_key,
72     NetLogWithSource source_net_log,
73     std::optional<ResolveHostParameters> optional_parameters) {
74   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
75 
76   if (shutting_down_) {
77     return HostResolver::CreateFailingRequest(ERR_CONTEXT_SHUT_DOWN);
78   }
79 
80   CHECK(resolve_context_);
81 
82   return manager_->CreateRequest(
83       Host(std::move(host)), std::move(network_anonymization_key),
84       std::move(source_net_log), std::move(optional_parameters),
85       resolve_context_.get());
86 }
87 
88 std::unique_ptr<HostResolver::ResolveHostRequest>
CreateRequest(const HostPortPair & host,const NetworkAnonymizationKey & network_anonymization_key,const NetLogWithSource & source_net_log,const std::optional<ResolveHostParameters> & optional_parameters)89 ContextHostResolver::CreateRequest(
90     const HostPortPair& host,
91     const NetworkAnonymizationKey& network_anonymization_key,
92     const NetLogWithSource& source_net_log,
93     const std::optional<ResolveHostParameters>& optional_parameters) {
94   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
95 
96   if (shutting_down_) {
97     return HostResolver::CreateFailingRequest(ERR_CONTEXT_SHUT_DOWN);
98   }
99 
100   CHECK(resolve_context_);
101 
102   return manager_->CreateRequest(host, network_anonymization_key,
103                                  source_net_log, optional_parameters,
104                                  resolve_context_.get());
105 }
106 
107 std::unique_ptr<HostResolver::ServiceEndpointRequest>
CreateServiceEndpointRequest(Host host,NetworkAnonymizationKey network_anonymization_key,NetLogWithSource net_log,ResolveHostParameters parameters)108 ContextHostResolver::CreateServiceEndpointRequest(
109     Host host,
110     NetworkAnonymizationKey network_anonymization_key,
111     NetLogWithSource net_log,
112     ResolveHostParameters parameters) {
113   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
114   // TODO(crbug.com/41493696): The ServiceEndpoint API only supports schemeful
115   // hosts for now.
116   CHECK(host.HasScheme());
117 
118   // ServiceEndpointRequestImpl::Start() takes care of context shut down.
119   return manager_->CreateServiceEndpointRequest(
120       host.AsSchemeHostPort(), std::move(network_anonymization_key),
121       std::move(net_log), std::move(parameters), resolve_context_.get());
122 }
123 
124 std::unique_ptr<HostResolver::ProbeRequest>
CreateDohProbeRequest()125 ContextHostResolver::CreateDohProbeRequest() {
126   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
127 
128   if (shutting_down_) {
129     return HostResolver::CreateFailingProbeRequest(ERR_CONTEXT_SHUT_DOWN);
130   }
131 
132   CHECK(resolve_context_);
133 
134   return manager_->CreateDohProbeRequest(resolve_context_.get());
135 }
136 
137 std::unique_ptr<HostResolver::MdnsListener>
CreateMdnsListener(const HostPortPair & host,DnsQueryType query_type)138 ContextHostResolver::CreateMdnsListener(const HostPortPair& host,
139                                         DnsQueryType query_type) {
140   return manager_->CreateMdnsListener(host, query_type);
141 }
142 
GetHostCache()143 HostCache* ContextHostResolver::GetHostCache() {
144   return resolve_context_->host_cache();
145 }
146 
GetDnsConfigAsValue() const147 base::Value::Dict ContextHostResolver::GetDnsConfigAsValue() const {
148   return manager_->GetDnsConfigAsValue();
149 }
150 
SetRequestContext(URLRequestContext * request_context)151 void ContextHostResolver::SetRequestContext(
152     URLRequestContext* request_context) {
153   CHECK(!shutting_down_);
154   CHECK(resolve_context_);
155   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
156 
157   resolve_context_->set_url_request_context(request_context);
158 }
159 
GetManagerForTesting()160 HostResolverManager* ContextHostResolver::GetManagerForTesting() {
161   return manager_;
162 }
163 
GetContextForTesting() const164 const URLRequestContext* ContextHostResolver::GetContextForTesting() const {
165   return resolve_context_ ? resolve_context_->url_request_context() : nullptr;
166 }
167 
GetTargetNetworkForTesting() const168 handles::NetworkHandle ContextHostResolver::GetTargetNetworkForTesting() const {
169   return resolve_context_ ? resolve_context_->GetTargetNetwork()
170                           : handles::kInvalidNetworkHandle;
171 }
172 
LastRestoredCacheSize() const173 size_t ContextHostResolver::LastRestoredCacheSize() const {
174   return resolve_context_->host_cache()
175              ? resolve_context_->host_cache()->last_restore_size()
176              : 0;
177 }
178 
CacheSize() const179 size_t ContextHostResolver::CacheSize() const {
180   return resolve_context_->host_cache() ? resolve_context_->host_cache()->size()
181                                         : 0;
182 }
183 
SetHostResolverSystemParamsForTest(const HostResolverSystemTask::Params & host_resolver_system_params)184 void ContextHostResolver::SetHostResolverSystemParamsForTest(
185     const HostResolverSystemTask::Params& host_resolver_system_params) {
186   manager_->set_host_resolver_system_params_for_test(  // IN-TEST
187       host_resolver_system_params);
188 }
189 
SetTickClockForTesting(const base::TickClock * tick_clock)190 void ContextHostResolver::SetTickClockForTesting(
191     const base::TickClock* tick_clock) {
192   manager_->SetTickClockForTesting(tick_clock);
193   if (resolve_context_->host_cache())
194     resolve_context_->host_cache()->set_tick_clock_for_testing(tick_clock);
195 }
196 
197 }  // namespace net
198