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