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