xref: /aosp_15_r20/external/cronet/net/dns/host_resolver.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 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/host_resolver.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <optional>
8*6777b538SAndroid Build Coastguard Worker #include <set>
9*6777b538SAndroid Build Coastguard Worker #include <string>
10*6777b538SAndroid Build Coastguard Worker #include <string_view>
11*6777b538SAndroid Build Coastguard Worker #include <utility>
12*6777b538SAndroid Build Coastguard Worker #include <vector>
13*6777b538SAndroid Build Coastguard Worker 
14*6777b538SAndroid Build Coastguard Worker #include "base/check.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/functional/bind.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/no_destructor.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/notreached.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/ranges/algorithm.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_number_conversions.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/time/time_delta_from_string.h"
21*6777b538SAndroid Build Coastguard Worker #include "base/values.h"
22*6777b538SAndroid Build Coastguard Worker #include "net/base/address_list.h"
23*6777b538SAndroid Build Coastguard Worker #include "net/base/features.h"
24*6777b538SAndroid Build Coastguard Worker #include "net/base/host_port_pair.h"
25*6777b538SAndroid Build Coastguard Worker #include "net/base/net_errors.h"
26*6777b538SAndroid Build Coastguard Worker #include "net/base/network_change_notifier.h"
27*6777b538SAndroid Build Coastguard Worker #include "net/dns/context_host_resolver.h"
28*6777b538SAndroid Build Coastguard Worker #include "net/dns/dns_client.h"
29*6777b538SAndroid Build Coastguard Worker #include "net/dns/dns_util.h"
30*6777b538SAndroid Build Coastguard Worker #include "net/dns/host_cache.h"
31*6777b538SAndroid Build Coastguard Worker #include "net/dns/host_resolver_manager.h"
32*6777b538SAndroid Build Coastguard Worker #include "net/dns/mapped_host_resolver.h"
33*6777b538SAndroid Build Coastguard Worker #include "net/dns/public/host_resolver_results.h"
34*6777b538SAndroid Build Coastguard Worker #include "net/dns/resolve_context.h"
35*6777b538SAndroid Build Coastguard Worker #include "third_party/abseil-cpp/absl/types/variant.h"
36*6777b538SAndroid Build Coastguard Worker #include "url/scheme_host_port.h"
37*6777b538SAndroid Build Coastguard Worker 
38*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
39*6777b538SAndroid Build Coastguard Worker #include "base/android/build_info.h"
40*6777b538SAndroid Build Coastguard Worker #include "net/android/network_library.h"
41*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_ANDROID)
42*6777b538SAndroid Build Coastguard Worker 
43*6777b538SAndroid Build Coastguard Worker namespace net {
44*6777b538SAndroid Build Coastguard Worker 
45*6777b538SAndroid Build Coastguard Worker namespace {
46*6777b538SAndroid Build Coastguard Worker 
47*6777b538SAndroid Build Coastguard Worker // The experiment settings of features::kUseDnsHttpsSvcb. See the comments in
48*6777b538SAndroid Build Coastguard Worker // net/base/features.h for more details.
49*6777b538SAndroid Build Coastguard Worker const char kUseDnsHttpsSvcbEnable[] = "enable";
50*6777b538SAndroid Build Coastguard Worker const char kUseDnsHttpsSvcbInsecureExtraTimeMax[] = "insecure_extra_time_max";
51*6777b538SAndroid Build Coastguard Worker const char kUseDnsHttpsSvcbInsecureExtraTimePercent[] =
52*6777b538SAndroid Build Coastguard Worker     "insecure_extra_time_percent";
53*6777b538SAndroid Build Coastguard Worker const char kUseDnsHttpsSvcbInsecureExtraTimeMin[] = "insecure_extra_time_min";
54*6777b538SAndroid Build Coastguard Worker const char kUseDnsHttpsSvcbSecureExtraTimeMax[] = "secure_extra_time_max";
55*6777b538SAndroid Build Coastguard Worker const char kUseDnsHttpsSvcbSecureExtraTimePercent[] =
56*6777b538SAndroid Build Coastguard Worker     "secure_extra_time_percent";
57*6777b538SAndroid Build Coastguard Worker const char kUseDnsHttpsSvcbSecureExtraTimeMin[] = "secure_extra_time_min";
58*6777b538SAndroid Build Coastguard Worker 
59*6777b538SAndroid Build Coastguard Worker class FailingRequestImpl : public HostResolver::ResolveHostRequest,
60*6777b538SAndroid Build Coastguard Worker                            public HostResolver::ProbeRequest {
61*6777b538SAndroid Build Coastguard Worker  public:
FailingRequestImpl(int error)62*6777b538SAndroid Build Coastguard Worker   explicit FailingRequestImpl(int error) : error_(error) {}
63*6777b538SAndroid Build Coastguard Worker 
64*6777b538SAndroid Build Coastguard Worker   FailingRequestImpl(const FailingRequestImpl&) = delete;
65*6777b538SAndroid Build Coastguard Worker   FailingRequestImpl& operator=(const FailingRequestImpl&) = delete;
66*6777b538SAndroid Build Coastguard Worker 
67*6777b538SAndroid Build Coastguard Worker   ~FailingRequestImpl() override = default;
68*6777b538SAndroid Build Coastguard Worker 
Start(CompletionOnceCallback callback)69*6777b538SAndroid Build Coastguard Worker   int Start(CompletionOnceCallback callback) override { return error_; }
Start()70*6777b538SAndroid Build Coastguard Worker   int Start() override { return error_; }
71*6777b538SAndroid Build Coastguard Worker 
GetAddressResults() const72*6777b538SAndroid Build Coastguard Worker   AddressList* GetAddressResults() const override { return nullptr; }
73*6777b538SAndroid Build Coastguard Worker 
GetEndpointResults() const74*6777b538SAndroid Build Coastguard Worker   std::vector<HostResolverEndpointResult>* GetEndpointResults() const override {
75*6777b538SAndroid Build Coastguard Worker     return nullptr;
76*6777b538SAndroid Build Coastguard Worker   }
77*6777b538SAndroid Build Coastguard Worker 
GetTextResults() const78*6777b538SAndroid Build Coastguard Worker   const std::vector<std::string>* GetTextResults() const override {
79*6777b538SAndroid Build Coastguard Worker     return nullptr;
80*6777b538SAndroid Build Coastguard Worker   }
81*6777b538SAndroid Build Coastguard Worker 
GetHostnameResults() const82*6777b538SAndroid Build Coastguard Worker   const std::vector<HostPortPair>* GetHostnameResults() const override {
83*6777b538SAndroid Build Coastguard Worker     return nullptr;
84*6777b538SAndroid Build Coastguard Worker   }
85*6777b538SAndroid Build Coastguard Worker 
GetDnsAliasResults() const86*6777b538SAndroid Build Coastguard Worker   const std::set<std::string>* GetDnsAliasResults() const override {
87*6777b538SAndroid Build Coastguard Worker     return nullptr;
88*6777b538SAndroid Build Coastguard Worker   }
89*6777b538SAndroid Build Coastguard Worker 
GetResolveErrorInfo() const90*6777b538SAndroid Build Coastguard Worker   ResolveErrorInfo GetResolveErrorInfo() const override {
91*6777b538SAndroid Build Coastguard Worker     return ResolveErrorInfo(error_);
92*6777b538SAndroid Build Coastguard Worker   }
93*6777b538SAndroid Build Coastguard Worker 
GetStaleInfo() const94*6777b538SAndroid Build Coastguard Worker   const std::optional<HostCache::EntryStaleness>& GetStaleInfo()
95*6777b538SAndroid Build Coastguard Worker       const override {
96*6777b538SAndroid Build Coastguard Worker     static const std::optional<HostCache::EntryStaleness> nullopt_result;
97*6777b538SAndroid Build Coastguard Worker     return nullopt_result;
98*6777b538SAndroid Build Coastguard Worker   }
99*6777b538SAndroid Build Coastguard Worker 
100*6777b538SAndroid Build Coastguard Worker  private:
101*6777b538SAndroid Build Coastguard Worker   const int error_;
102*6777b538SAndroid Build Coastguard Worker };
103*6777b538SAndroid Build Coastguard Worker 
EndpointResultIsNonProtocol(const HostResolverEndpointResult & result)104*6777b538SAndroid Build Coastguard Worker bool EndpointResultIsNonProtocol(const HostResolverEndpointResult& result) {
105*6777b538SAndroid Build Coastguard Worker   return result.metadata.supported_protocol_alpns.empty();
106*6777b538SAndroid Build Coastguard Worker }
107*6777b538SAndroid Build Coastguard Worker 
GetTimeDeltaFromDictString(const base::Value::Dict & args,std::string_view key,base::TimeDelta * out)108*6777b538SAndroid Build Coastguard Worker void GetTimeDeltaFromDictString(const base::Value::Dict& args,
109*6777b538SAndroid Build Coastguard Worker                                 std::string_view key,
110*6777b538SAndroid Build Coastguard Worker                                 base::TimeDelta* out) {
111*6777b538SAndroid Build Coastguard Worker   const std::string* value_string = args.FindString(key);
112*6777b538SAndroid Build Coastguard Worker   if (!value_string)
113*6777b538SAndroid Build Coastguard Worker     return;
114*6777b538SAndroid Build Coastguard Worker   *out = base::TimeDeltaFromString(*value_string).value_or(*out);
115*6777b538SAndroid Build Coastguard Worker }
116*6777b538SAndroid Build Coastguard Worker 
117*6777b538SAndroid Build Coastguard Worker }  // namespace
118*6777b538SAndroid Build Coastguard Worker 
Host(absl::variant<url::SchemeHostPort,HostPortPair> host)119*6777b538SAndroid Build Coastguard Worker HostResolver::Host::Host(absl::variant<url::SchemeHostPort, HostPortPair> host)
120*6777b538SAndroid Build Coastguard Worker     : host_(std::move(host)) {
121*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
122*6777b538SAndroid Build Coastguard Worker   if (absl::holds_alternative<url::SchemeHostPort>(host_)) {
123*6777b538SAndroid Build Coastguard Worker     DCHECK(absl::get<url::SchemeHostPort>(host_).IsValid());
124*6777b538SAndroid Build Coastguard Worker   } else {
125*6777b538SAndroid Build Coastguard Worker     DCHECK(absl::holds_alternative<HostPortPair>(host_));
126*6777b538SAndroid Build Coastguard Worker     DCHECK(!absl::get<HostPortPair>(host_).IsEmpty());
127*6777b538SAndroid Build Coastguard Worker   }
128*6777b538SAndroid Build Coastguard Worker #endif  // DCHECK_IS_ON()
129*6777b538SAndroid Build Coastguard Worker }
130*6777b538SAndroid Build Coastguard Worker 
131*6777b538SAndroid Build Coastguard Worker HostResolver::Host::~Host() = default;
132*6777b538SAndroid Build Coastguard Worker 
133*6777b538SAndroid Build Coastguard Worker HostResolver::Host::Host(const Host&) = default;
134*6777b538SAndroid Build Coastguard Worker 
135*6777b538SAndroid Build Coastguard Worker HostResolver::Host& HostResolver::Host::operator=(const Host&) = default;
136*6777b538SAndroid Build Coastguard Worker 
137*6777b538SAndroid Build Coastguard Worker HostResolver::Host::Host(Host&&) = default;
138*6777b538SAndroid Build Coastguard Worker 
139*6777b538SAndroid Build Coastguard Worker HostResolver::Host& HostResolver::Host::operator=(Host&&) = default;
140*6777b538SAndroid Build Coastguard Worker 
HasScheme() const141*6777b538SAndroid Build Coastguard Worker bool HostResolver::Host::HasScheme() const {
142*6777b538SAndroid Build Coastguard Worker   return absl::holds_alternative<url::SchemeHostPort>(host_);
143*6777b538SAndroid Build Coastguard Worker }
144*6777b538SAndroid Build Coastguard Worker 
GetScheme() const145*6777b538SAndroid Build Coastguard Worker const std::string& HostResolver::Host::GetScheme() const {
146*6777b538SAndroid Build Coastguard Worker   DCHECK(absl::holds_alternative<url::SchemeHostPort>(host_));
147*6777b538SAndroid Build Coastguard Worker   return absl::get<url::SchemeHostPort>(host_).scheme();
148*6777b538SAndroid Build Coastguard Worker }
149*6777b538SAndroid Build Coastguard Worker 
GetHostname() const150*6777b538SAndroid Build Coastguard Worker std::string HostResolver::Host::GetHostname() const {
151*6777b538SAndroid Build Coastguard Worker   if (absl::holds_alternative<url::SchemeHostPort>(host_)) {
152*6777b538SAndroid Build Coastguard Worker     return absl::get<url::SchemeHostPort>(host_).host();
153*6777b538SAndroid Build Coastguard Worker   } else {
154*6777b538SAndroid Build Coastguard Worker     DCHECK(absl::holds_alternative<HostPortPair>(host_));
155*6777b538SAndroid Build Coastguard Worker     return absl::get<HostPortPair>(host_).HostForURL();
156*6777b538SAndroid Build Coastguard Worker   }
157*6777b538SAndroid Build Coastguard Worker }
158*6777b538SAndroid Build Coastguard Worker 
GetHostnameWithoutBrackets() const159*6777b538SAndroid Build Coastguard Worker std::string_view HostResolver::Host::GetHostnameWithoutBrackets() const {
160*6777b538SAndroid Build Coastguard Worker   if (absl::holds_alternative<url::SchemeHostPort>(host_)) {
161*6777b538SAndroid Build Coastguard Worker     std::string_view hostname = absl::get<url::SchemeHostPort>(host_).host();
162*6777b538SAndroid Build Coastguard Worker     if (hostname.size() > 2 && hostname.front() == '[' &&
163*6777b538SAndroid Build Coastguard Worker         hostname.back() == ']') {
164*6777b538SAndroid Build Coastguard Worker       return hostname.substr(1, hostname.size() - 2);
165*6777b538SAndroid Build Coastguard Worker     } else {
166*6777b538SAndroid Build Coastguard Worker       return hostname;
167*6777b538SAndroid Build Coastguard Worker     }
168*6777b538SAndroid Build Coastguard Worker   } else {
169*6777b538SAndroid Build Coastguard Worker     DCHECK(absl::holds_alternative<HostPortPair>(host_));
170*6777b538SAndroid Build Coastguard Worker     return absl::get<HostPortPair>(host_).host();
171*6777b538SAndroid Build Coastguard Worker   }
172*6777b538SAndroid Build Coastguard Worker }
173*6777b538SAndroid Build Coastguard Worker 
GetPort() const174*6777b538SAndroid Build Coastguard Worker uint16_t HostResolver::Host::GetPort() const {
175*6777b538SAndroid Build Coastguard Worker   if (absl::holds_alternative<url::SchemeHostPort>(host_)) {
176*6777b538SAndroid Build Coastguard Worker     return absl::get<url::SchemeHostPort>(host_).port();
177*6777b538SAndroid Build Coastguard Worker   } else {
178*6777b538SAndroid Build Coastguard Worker     DCHECK(absl::holds_alternative<HostPortPair>(host_));
179*6777b538SAndroid Build Coastguard Worker     return absl::get<HostPortPair>(host_).port();
180*6777b538SAndroid Build Coastguard Worker   }
181*6777b538SAndroid Build Coastguard Worker }
182*6777b538SAndroid Build Coastguard Worker 
ToString() const183*6777b538SAndroid Build Coastguard Worker std::string HostResolver::Host::ToString() const {
184*6777b538SAndroid Build Coastguard Worker   if (absl::holds_alternative<url::SchemeHostPort>(host_)) {
185*6777b538SAndroid Build Coastguard Worker     return absl::get<url::SchemeHostPort>(host_).Serialize();
186*6777b538SAndroid Build Coastguard Worker   } else {
187*6777b538SAndroid Build Coastguard Worker     DCHECK(absl::holds_alternative<HostPortPair>(host_));
188*6777b538SAndroid Build Coastguard Worker     return absl::get<HostPortPair>(host_).ToString();
189*6777b538SAndroid Build Coastguard Worker   }
190*6777b538SAndroid Build Coastguard Worker }
191*6777b538SAndroid Build Coastguard Worker 
AsSchemeHostPort() const192*6777b538SAndroid Build Coastguard Worker const url::SchemeHostPort& HostResolver::Host::AsSchemeHostPort() const {
193*6777b538SAndroid Build Coastguard Worker   const url::SchemeHostPort* scheme_host_port =
194*6777b538SAndroid Build Coastguard Worker       absl::get_if<url::SchemeHostPort>(&host_);
195*6777b538SAndroid Build Coastguard Worker   DCHECK(scheme_host_port);
196*6777b538SAndroid Build Coastguard Worker   return *scheme_host_port;
197*6777b538SAndroid Build Coastguard Worker }
198*6777b538SAndroid Build Coastguard Worker 
199*6777b538SAndroid Build Coastguard Worker HostResolver::HttpsSvcbOptions::HttpsSvcbOptions() = default;
200*6777b538SAndroid Build Coastguard Worker 
201*6777b538SAndroid Build Coastguard Worker HostResolver::HttpsSvcbOptions::HttpsSvcbOptions(
202*6777b538SAndroid Build Coastguard Worker     const HttpsSvcbOptions& other) = default;
203*6777b538SAndroid Build Coastguard Worker HostResolver::HttpsSvcbOptions::HttpsSvcbOptions(HttpsSvcbOptions&& other) =
204*6777b538SAndroid Build Coastguard Worker     default;
205*6777b538SAndroid Build Coastguard Worker 
206*6777b538SAndroid Build Coastguard Worker HostResolver::HttpsSvcbOptions::~HttpsSvcbOptions() = default;
207*6777b538SAndroid Build Coastguard Worker 
208*6777b538SAndroid Build Coastguard Worker // static
FromDict(const base::Value::Dict & dict)209*6777b538SAndroid Build Coastguard Worker HostResolver::HttpsSvcbOptions HostResolver::HttpsSvcbOptions::FromDict(
210*6777b538SAndroid Build Coastguard Worker     const base::Value::Dict& dict) {
211*6777b538SAndroid Build Coastguard Worker   net::HostResolver::HttpsSvcbOptions options;
212*6777b538SAndroid Build Coastguard Worker   options.enable =
213*6777b538SAndroid Build Coastguard Worker       dict.FindBool(kUseDnsHttpsSvcbEnable).value_or(options.enable);
214*6777b538SAndroid Build Coastguard Worker   GetTimeDeltaFromDictString(dict, kUseDnsHttpsSvcbInsecureExtraTimeMax,
215*6777b538SAndroid Build Coastguard Worker                              &options.insecure_extra_time_max);
216*6777b538SAndroid Build Coastguard Worker 
217*6777b538SAndroid Build Coastguard Worker   options.insecure_extra_time_percent =
218*6777b538SAndroid Build Coastguard Worker       dict.FindInt(kUseDnsHttpsSvcbInsecureExtraTimePercent)
219*6777b538SAndroid Build Coastguard Worker           .value_or(options.insecure_extra_time_percent);
220*6777b538SAndroid Build Coastguard Worker   GetTimeDeltaFromDictString(dict, kUseDnsHttpsSvcbInsecureExtraTimeMin,
221*6777b538SAndroid Build Coastguard Worker                              &options.insecure_extra_time_min);
222*6777b538SAndroid Build Coastguard Worker 
223*6777b538SAndroid Build Coastguard Worker   GetTimeDeltaFromDictString(dict, kUseDnsHttpsSvcbSecureExtraTimeMax,
224*6777b538SAndroid Build Coastguard Worker                              &options.secure_extra_time_max);
225*6777b538SAndroid Build Coastguard Worker 
226*6777b538SAndroid Build Coastguard Worker   options.secure_extra_time_percent =
227*6777b538SAndroid Build Coastguard Worker       dict.FindInt(kUseDnsHttpsSvcbSecureExtraTimePercent)
228*6777b538SAndroid Build Coastguard Worker           .value_or(options.secure_extra_time_percent);
229*6777b538SAndroid Build Coastguard Worker   GetTimeDeltaFromDictString(dict, kUseDnsHttpsSvcbSecureExtraTimeMin,
230*6777b538SAndroid Build Coastguard Worker                              &options.secure_extra_time_min);
231*6777b538SAndroid Build Coastguard Worker 
232*6777b538SAndroid Build Coastguard Worker   return options;
233*6777b538SAndroid Build Coastguard Worker }
234*6777b538SAndroid Build Coastguard Worker 
235*6777b538SAndroid Build Coastguard Worker // static
FromFeatures()236*6777b538SAndroid Build Coastguard Worker HostResolver::HttpsSvcbOptions HostResolver::HttpsSvcbOptions::FromFeatures() {
237*6777b538SAndroid Build Coastguard Worker   net::HostResolver::HttpsSvcbOptions options;
238*6777b538SAndroid Build Coastguard Worker   options.enable = base::FeatureList::IsEnabled(features::kUseDnsHttpsSvcb);
239*6777b538SAndroid Build Coastguard Worker   options.insecure_extra_time_max =
240*6777b538SAndroid Build Coastguard Worker       features::kUseDnsHttpsSvcbInsecureExtraTimeMax.Get();
241*6777b538SAndroid Build Coastguard Worker   options.insecure_extra_time_percent =
242*6777b538SAndroid Build Coastguard Worker       features::kUseDnsHttpsSvcbInsecureExtraTimePercent.Get();
243*6777b538SAndroid Build Coastguard Worker   options.insecure_extra_time_min =
244*6777b538SAndroid Build Coastguard Worker       features::kUseDnsHttpsSvcbInsecureExtraTimeMin.Get();
245*6777b538SAndroid Build Coastguard Worker   options.secure_extra_time_max =
246*6777b538SAndroid Build Coastguard Worker       features::kUseDnsHttpsSvcbSecureExtraTimeMax.Get();
247*6777b538SAndroid Build Coastguard Worker   options.secure_extra_time_percent =
248*6777b538SAndroid Build Coastguard Worker       features::kUseDnsHttpsSvcbSecureExtraTimePercent.Get();
249*6777b538SAndroid Build Coastguard Worker   options.secure_extra_time_min =
250*6777b538SAndroid Build Coastguard Worker       features::kUseDnsHttpsSvcbSecureExtraTimeMin.Get();
251*6777b538SAndroid Build Coastguard Worker   return options;
252*6777b538SAndroid Build Coastguard Worker }
253*6777b538SAndroid Build Coastguard Worker 
254*6777b538SAndroid Build Coastguard Worker HostResolver::ManagerOptions::ManagerOptions() = default;
255*6777b538SAndroid Build Coastguard Worker 
256*6777b538SAndroid Build Coastguard Worker HostResolver::ManagerOptions::ManagerOptions(const ManagerOptions& other) =
257*6777b538SAndroid Build Coastguard Worker     default;
258*6777b538SAndroid Build Coastguard Worker HostResolver::ManagerOptions::ManagerOptions(ManagerOptions&& other) = default;
259*6777b538SAndroid Build Coastguard Worker 
260*6777b538SAndroid Build Coastguard Worker HostResolver::ManagerOptions::~ManagerOptions() = default;
261*6777b538SAndroid Build Coastguard Worker 
262*6777b538SAndroid Build Coastguard Worker const std::vector<bool>*
GetExperimentalResultsForTesting() const263*6777b538SAndroid Build Coastguard Worker HostResolver::ResolveHostRequest::GetExperimentalResultsForTesting() const {
264*6777b538SAndroid Build Coastguard Worker   NOTREACHED();
265*6777b538SAndroid Build Coastguard Worker   return nullptr;
266*6777b538SAndroid Build Coastguard Worker }
267*6777b538SAndroid Build Coastguard Worker 
CreateResolver(HostResolverManager * manager,std::string_view host_mapping_rules,bool enable_caching)268*6777b538SAndroid Build Coastguard Worker std::unique_ptr<HostResolver> HostResolver::Factory::CreateResolver(
269*6777b538SAndroid Build Coastguard Worker     HostResolverManager* manager,
270*6777b538SAndroid Build Coastguard Worker     std::string_view host_mapping_rules,
271*6777b538SAndroid Build Coastguard Worker     bool enable_caching) {
272*6777b538SAndroid Build Coastguard Worker   return HostResolver::CreateResolver(manager, host_mapping_rules,
273*6777b538SAndroid Build Coastguard Worker                                       enable_caching);
274*6777b538SAndroid Build Coastguard Worker }
275*6777b538SAndroid Build Coastguard Worker 
CreateStandaloneResolver(NetLog * net_log,const ManagerOptions & options,std::string_view host_mapping_rules,bool enable_caching)276*6777b538SAndroid Build Coastguard Worker std::unique_ptr<HostResolver> HostResolver::Factory::CreateStandaloneResolver(
277*6777b538SAndroid Build Coastguard Worker     NetLog* net_log,
278*6777b538SAndroid Build Coastguard Worker     const ManagerOptions& options,
279*6777b538SAndroid Build Coastguard Worker     std::string_view host_mapping_rules,
280*6777b538SAndroid Build Coastguard Worker     bool enable_caching) {
281*6777b538SAndroid Build Coastguard Worker   return HostResolver::CreateStandaloneResolver(
282*6777b538SAndroid Build Coastguard Worker       net_log, options, host_mapping_rules, enable_caching);
283*6777b538SAndroid Build Coastguard Worker }
284*6777b538SAndroid Build Coastguard Worker 
285*6777b538SAndroid Build Coastguard Worker HostResolver::ResolveHostParameters::ResolveHostParameters() = default;
286*6777b538SAndroid Build Coastguard Worker 
287*6777b538SAndroid Build Coastguard Worker HostResolver::ResolveHostParameters::ResolveHostParameters(
288*6777b538SAndroid Build Coastguard Worker     const ResolveHostParameters& other) = default;
289*6777b538SAndroid Build Coastguard Worker 
290*6777b538SAndroid Build Coastguard Worker HostResolver::~HostResolver() = default;
291*6777b538SAndroid Build Coastguard Worker 
292*6777b538SAndroid Build Coastguard Worker std::unique_ptr<HostResolver::ProbeRequest>
CreateDohProbeRequest()293*6777b538SAndroid Build Coastguard Worker HostResolver::CreateDohProbeRequest() {
294*6777b538SAndroid Build Coastguard Worker   // Should be overridden in any HostResolver implementation where this method
295*6777b538SAndroid Build Coastguard Worker   // may be called.
296*6777b538SAndroid Build Coastguard Worker   NOTREACHED();
297*6777b538SAndroid Build Coastguard Worker   return nullptr;
298*6777b538SAndroid Build Coastguard Worker }
299*6777b538SAndroid Build Coastguard Worker 
CreateMdnsListener(const HostPortPair & host,DnsQueryType query_type)300*6777b538SAndroid Build Coastguard Worker std::unique_ptr<HostResolver::MdnsListener> HostResolver::CreateMdnsListener(
301*6777b538SAndroid Build Coastguard Worker     const HostPortPair& host,
302*6777b538SAndroid Build Coastguard Worker     DnsQueryType query_type) {
303*6777b538SAndroid Build Coastguard Worker   // Should be overridden in any HostResolver implementation where this method
304*6777b538SAndroid Build Coastguard Worker   // may be called.
305*6777b538SAndroid Build Coastguard Worker   NOTREACHED();
306*6777b538SAndroid Build Coastguard Worker   return nullptr;
307*6777b538SAndroid Build Coastguard Worker }
308*6777b538SAndroid Build Coastguard Worker 
GetHostCache()309*6777b538SAndroid Build Coastguard Worker HostCache* HostResolver::GetHostCache() {
310*6777b538SAndroid Build Coastguard Worker   return nullptr;
311*6777b538SAndroid Build Coastguard Worker }
312*6777b538SAndroid Build Coastguard Worker 
GetDnsConfigAsValue() const313*6777b538SAndroid Build Coastguard Worker base::Value::Dict HostResolver::GetDnsConfigAsValue() const {
314*6777b538SAndroid Build Coastguard Worker   return base::Value::Dict();
315*6777b538SAndroid Build Coastguard Worker }
316*6777b538SAndroid Build Coastguard Worker 
SetRequestContext(URLRequestContext * request_context)317*6777b538SAndroid Build Coastguard Worker void HostResolver::SetRequestContext(URLRequestContext* request_context) {
318*6777b538SAndroid Build Coastguard Worker   // Should be overridden in any HostResolver implementation where this method
319*6777b538SAndroid Build Coastguard Worker   // may be called.
320*6777b538SAndroid Build Coastguard Worker   NOTREACHED();
321*6777b538SAndroid Build Coastguard Worker }
322*6777b538SAndroid Build Coastguard Worker 
GetManagerForTesting()323*6777b538SAndroid Build Coastguard Worker HostResolverManager* HostResolver::GetManagerForTesting() {
324*6777b538SAndroid Build Coastguard Worker   // Should be overridden in any HostResolver implementation where this method
325*6777b538SAndroid Build Coastguard Worker   // may be called.
326*6777b538SAndroid Build Coastguard Worker   NOTREACHED();
327*6777b538SAndroid Build Coastguard Worker   return nullptr;
328*6777b538SAndroid Build Coastguard Worker }
329*6777b538SAndroid Build Coastguard Worker 
GetContextForTesting() const330*6777b538SAndroid Build Coastguard Worker const URLRequestContext* HostResolver::GetContextForTesting() const {
331*6777b538SAndroid Build Coastguard Worker   // Should be overridden in any HostResolver implementation where this method
332*6777b538SAndroid Build Coastguard Worker   // may be called.
333*6777b538SAndroid Build Coastguard Worker   NOTREACHED();
334*6777b538SAndroid Build Coastguard Worker   return nullptr;
335*6777b538SAndroid Build Coastguard Worker }
336*6777b538SAndroid Build Coastguard Worker 
GetTargetNetworkForTesting() const337*6777b538SAndroid Build Coastguard Worker handles::NetworkHandle HostResolver::GetTargetNetworkForTesting() const {
338*6777b538SAndroid Build Coastguard Worker   return handles::kInvalidNetworkHandle;
339*6777b538SAndroid Build Coastguard Worker }
340*6777b538SAndroid Build Coastguard Worker 
341*6777b538SAndroid Build Coastguard Worker // static
CreateResolver(HostResolverManager * manager,std::string_view host_mapping_rules,bool enable_caching)342*6777b538SAndroid Build Coastguard Worker std::unique_ptr<HostResolver> HostResolver::CreateResolver(
343*6777b538SAndroid Build Coastguard Worker     HostResolverManager* manager,
344*6777b538SAndroid Build Coastguard Worker     std::string_view host_mapping_rules,
345*6777b538SAndroid Build Coastguard Worker     bool enable_caching) {
346*6777b538SAndroid Build Coastguard Worker   DCHECK(manager);
347*6777b538SAndroid Build Coastguard Worker 
348*6777b538SAndroid Build Coastguard Worker   auto resolve_context = std::make_unique<ResolveContext>(
349*6777b538SAndroid Build Coastguard Worker       nullptr /* url_request_context */, enable_caching);
350*6777b538SAndroid Build Coastguard Worker 
351*6777b538SAndroid Build Coastguard Worker   auto resolver = std::make_unique<ContextHostResolver>(
352*6777b538SAndroid Build Coastguard Worker       manager, std::move(resolve_context));
353*6777b538SAndroid Build Coastguard Worker 
354*6777b538SAndroid Build Coastguard Worker   if (host_mapping_rules.empty())
355*6777b538SAndroid Build Coastguard Worker     return resolver;
356*6777b538SAndroid Build Coastguard Worker   auto remapped_resolver =
357*6777b538SAndroid Build Coastguard Worker       std::make_unique<MappedHostResolver>(std::move(resolver));
358*6777b538SAndroid Build Coastguard Worker   remapped_resolver->SetRulesFromString(host_mapping_rules);
359*6777b538SAndroid Build Coastguard Worker   return remapped_resolver;
360*6777b538SAndroid Build Coastguard Worker }
361*6777b538SAndroid Build Coastguard Worker 
362*6777b538SAndroid Build Coastguard Worker // static
CreateStandaloneResolver(NetLog * net_log,std::optional<ManagerOptions> options,std::string_view host_mapping_rules,bool enable_caching)363*6777b538SAndroid Build Coastguard Worker std::unique_ptr<HostResolver> HostResolver::CreateStandaloneResolver(
364*6777b538SAndroid Build Coastguard Worker     NetLog* net_log,
365*6777b538SAndroid Build Coastguard Worker     std::optional<ManagerOptions> options,
366*6777b538SAndroid Build Coastguard Worker     std::string_view host_mapping_rules,
367*6777b538SAndroid Build Coastguard Worker     bool enable_caching) {
368*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<ContextHostResolver> resolver =
369*6777b538SAndroid Build Coastguard Worker       CreateStandaloneContextResolver(net_log, std::move(options),
370*6777b538SAndroid Build Coastguard Worker                                       enable_caching);
371*6777b538SAndroid Build Coastguard Worker 
372*6777b538SAndroid Build Coastguard Worker   if (host_mapping_rules.empty())
373*6777b538SAndroid Build Coastguard Worker     return resolver;
374*6777b538SAndroid Build Coastguard Worker   auto remapped_resolver =
375*6777b538SAndroid Build Coastguard Worker       std::make_unique<MappedHostResolver>(std::move(resolver));
376*6777b538SAndroid Build Coastguard Worker   remapped_resolver->SetRulesFromString(host_mapping_rules);
377*6777b538SAndroid Build Coastguard Worker   return remapped_resolver;
378*6777b538SAndroid Build Coastguard Worker }
379*6777b538SAndroid Build Coastguard Worker 
380*6777b538SAndroid Build Coastguard Worker // static
381*6777b538SAndroid Build Coastguard Worker std::unique_ptr<ContextHostResolver>
CreateStandaloneContextResolver(NetLog * net_log,std::optional<ManagerOptions> options,bool enable_caching)382*6777b538SAndroid Build Coastguard Worker HostResolver::CreateStandaloneContextResolver(
383*6777b538SAndroid Build Coastguard Worker     NetLog* net_log,
384*6777b538SAndroid Build Coastguard Worker     std::optional<ManagerOptions> options,
385*6777b538SAndroid Build Coastguard Worker     bool enable_caching) {
386*6777b538SAndroid Build Coastguard Worker   auto resolve_context = std::make_unique<ResolveContext>(
387*6777b538SAndroid Build Coastguard Worker       nullptr /* url_request_context */, enable_caching);
388*6777b538SAndroid Build Coastguard Worker 
389*6777b538SAndroid Build Coastguard Worker   return std::make_unique<ContextHostResolver>(
390*6777b538SAndroid Build Coastguard Worker       std::make_unique<HostResolverManager>(
391*6777b538SAndroid Build Coastguard Worker           std::move(options).value_or(ManagerOptions()),
392*6777b538SAndroid Build Coastguard Worker           NetworkChangeNotifier::GetSystemDnsConfigNotifier(), net_log),
393*6777b538SAndroid Build Coastguard Worker       std::move(resolve_context));
394*6777b538SAndroid Build Coastguard Worker }
395*6777b538SAndroid Build Coastguard Worker 
396*6777b538SAndroid Build Coastguard Worker // static
397*6777b538SAndroid Build Coastguard Worker std::unique_ptr<HostResolver>
CreateStandaloneNetworkBoundResolver(NetLog * net_log,handles::NetworkHandle target_network,std::optional<ManagerOptions> options,std::string_view host_mapping_rules,bool enable_caching)398*6777b538SAndroid Build Coastguard Worker HostResolver::CreateStandaloneNetworkBoundResolver(
399*6777b538SAndroid Build Coastguard Worker     NetLog* net_log,
400*6777b538SAndroid Build Coastguard Worker     handles::NetworkHandle target_network,
401*6777b538SAndroid Build Coastguard Worker     std::optional<ManagerOptions> options,
402*6777b538SAndroid Build Coastguard Worker     std::string_view host_mapping_rules,
403*6777b538SAndroid Build Coastguard Worker     bool enable_caching) {
404*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
405*6777b538SAndroid Build Coastguard Worker   // Note that the logic below uses Android APIs that don't work on a sandboxed
406*6777b538SAndroid Build Coastguard Worker   // process: This is not problematic because this function is used only by
407*6777b538SAndroid Build Coastguard Worker   // Cronet which doesn't enable sandboxing.
408*6777b538SAndroid Build Coastguard Worker 
409*6777b538SAndroid Build Coastguard Worker   auto resolve_context = std::make_unique<ResolveContext>(
410*6777b538SAndroid Build Coastguard Worker       nullptr /*url_request_context */, enable_caching);
411*6777b538SAndroid Build Coastguard Worker   auto manager_options = std::move(options).value_or(ManagerOptions());
412*6777b538SAndroid Build Coastguard Worker   // Support the use of the built-in resolver when possible.
413*6777b538SAndroid Build Coastguard Worker   bool is_builtin_resolver_supported =
414*6777b538SAndroid Build Coastguard Worker       manager_options.insecure_dns_client_enabled &&
415*6777b538SAndroid Build Coastguard Worker       base::android::BuildInfo::GetInstance()->sdk_int() >=
416*6777b538SAndroid Build Coastguard Worker           base::android::SDK_VERSION_P;
417*6777b538SAndroid Build Coastguard Worker   if (is_builtin_resolver_supported) {
418*6777b538SAndroid Build Coastguard Worker     // Pre-existing DnsConfigOverrides is currently ignored, consider extending
419*6777b538SAndroid Build Coastguard Worker     // if a use case arises.
420*6777b538SAndroid Build Coastguard Worker     DCHECK(manager_options.dns_config_overrides == DnsConfigOverrides());
421*6777b538SAndroid Build Coastguard Worker 
422*6777b538SAndroid Build Coastguard Worker     std::vector<IPEndPoint> dns_servers;
423*6777b538SAndroid Build Coastguard Worker     bool dns_over_tls_active;
424*6777b538SAndroid Build Coastguard Worker     std::string dns_over_tls_hostname;
425*6777b538SAndroid Build Coastguard Worker     std::vector<std::string> search_suffixes;
426*6777b538SAndroid Build Coastguard Worker     if (android::GetDnsServersForNetwork(&dns_servers, &dns_over_tls_active,
427*6777b538SAndroid Build Coastguard Worker                                          &dns_over_tls_hostname,
428*6777b538SAndroid Build Coastguard Worker                                          &search_suffixes, target_network)) {
429*6777b538SAndroid Build Coastguard Worker       DnsConfigOverrides dns_config_overrides =
430*6777b538SAndroid Build Coastguard Worker           DnsConfigOverrides::CreateOverridingEverythingWithDefaults();
431*6777b538SAndroid Build Coastguard Worker       dns_config_overrides.nameservers = dns_servers;
432*6777b538SAndroid Build Coastguard Worker       // Android APIs don't specify whether to use DoT or DoH. So, leave the
433*6777b538SAndroid Build Coastguard Worker       // decision to `DnsConfig::allow_dns_over_https_upgrade` default value.
434*6777b538SAndroid Build Coastguard Worker       dns_config_overrides.dns_over_tls_active = dns_over_tls_active;
435*6777b538SAndroid Build Coastguard Worker       dns_config_overrides.dns_over_tls_hostname = dns_over_tls_hostname;
436*6777b538SAndroid Build Coastguard Worker       dns_config_overrides.search = search_suffixes;
437*6777b538SAndroid Build Coastguard Worker 
438*6777b538SAndroid Build Coastguard Worker       manager_options.dns_config_overrides = dns_config_overrides;
439*6777b538SAndroid Build Coastguard Worker       // Regardless of DoH vs DoT, the important contract to respect is not to
440*6777b538SAndroid Build Coastguard Worker       // perform insecure DNS lookups if `dns_over_tls_active` == true.
441*6777b538SAndroid Build Coastguard Worker       manager_options.additional_types_via_insecure_dns_enabled =
442*6777b538SAndroid Build Coastguard Worker           !dns_over_tls_active;
443*6777b538SAndroid Build Coastguard Worker     } else {
444*6777b538SAndroid Build Coastguard Worker       // Disable when android::GetDnsServersForNetwork fails.
445*6777b538SAndroid Build Coastguard Worker       is_builtin_resolver_supported = false;
446*6777b538SAndroid Build Coastguard Worker     }
447*6777b538SAndroid Build Coastguard Worker   }
448*6777b538SAndroid Build Coastguard Worker 
449*6777b538SAndroid Build Coastguard Worker   manager_options.insecure_dns_client_enabled = is_builtin_resolver_supported;
450*6777b538SAndroid Build Coastguard Worker   return std::make_unique<ContextHostResolver>(
451*6777b538SAndroid Build Coastguard Worker       HostResolverManager::CreateNetworkBoundHostResolverManager(
452*6777b538SAndroid Build Coastguard Worker           manager_options, target_network, net_log),
453*6777b538SAndroid Build Coastguard Worker       std::move(resolve_context));
454*6777b538SAndroid Build Coastguard Worker #else   // !BUILDFLAG(IS_ANDROID)
455*6777b538SAndroid Build Coastguard Worker   NOTIMPLEMENTED();
456*6777b538SAndroid Build Coastguard Worker   return nullptr;
457*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_ANDROID)
458*6777b538SAndroid Build Coastguard Worker }
459*6777b538SAndroid Build Coastguard Worker 
460*6777b538SAndroid Build Coastguard Worker // static
DnsQueryTypeSetToAddressFamily(DnsQueryTypeSet dns_query_types)461*6777b538SAndroid Build Coastguard Worker AddressFamily HostResolver::DnsQueryTypeSetToAddressFamily(
462*6777b538SAndroid Build Coastguard Worker     DnsQueryTypeSet dns_query_types) {
463*6777b538SAndroid Build Coastguard Worker   DCHECK(HasAddressType(dns_query_types));
464*6777b538SAndroid Build Coastguard Worker   // If the set of query types contains A and AAAA, defer the choice of address
465*6777b538SAndroid Build Coastguard Worker   // family. Otherwise, pick the corresponding address family.
466*6777b538SAndroid Build Coastguard Worker   if (dns_query_types.HasAll({DnsQueryType::A, DnsQueryType::AAAA}))
467*6777b538SAndroid Build Coastguard Worker     return ADDRESS_FAMILY_UNSPECIFIED;
468*6777b538SAndroid Build Coastguard Worker   if (dns_query_types.Has(DnsQueryType::AAAA))
469*6777b538SAndroid Build Coastguard Worker     return ADDRESS_FAMILY_IPV6;
470*6777b538SAndroid Build Coastguard Worker   DCHECK(dns_query_types.Has(DnsQueryType::A));
471*6777b538SAndroid Build Coastguard Worker   return ADDRESS_FAMILY_IPV4;
472*6777b538SAndroid Build Coastguard Worker }
473*6777b538SAndroid Build Coastguard Worker 
474*6777b538SAndroid Build Coastguard Worker // static
ParametersToHostResolverFlags(const ResolveHostParameters & parameters)475*6777b538SAndroid Build Coastguard Worker HostResolverFlags HostResolver::ParametersToHostResolverFlags(
476*6777b538SAndroid Build Coastguard Worker     const ResolveHostParameters& parameters) {
477*6777b538SAndroid Build Coastguard Worker   HostResolverFlags flags = 0;
478*6777b538SAndroid Build Coastguard Worker   if (parameters.include_canonical_name)
479*6777b538SAndroid Build Coastguard Worker     flags |= HOST_RESOLVER_CANONNAME;
480*6777b538SAndroid Build Coastguard Worker   if (parameters.loopback_only)
481*6777b538SAndroid Build Coastguard Worker     flags |= HOST_RESOLVER_LOOPBACK_ONLY;
482*6777b538SAndroid Build Coastguard Worker   if (parameters.avoid_multicast_resolution)
483*6777b538SAndroid Build Coastguard Worker     flags |= HOST_RESOLVER_AVOID_MULTICAST;
484*6777b538SAndroid Build Coastguard Worker   return flags;
485*6777b538SAndroid Build Coastguard Worker }
486*6777b538SAndroid Build Coastguard Worker 
487*6777b538SAndroid Build Coastguard Worker // static
SquashErrorCode(int error)488*6777b538SAndroid Build Coastguard Worker int HostResolver::SquashErrorCode(int error) {
489*6777b538SAndroid Build Coastguard Worker   // TODO(crbug.com/1043281): Consider squashing ERR_INTERNET_DISCONNECTED.
490*6777b538SAndroid Build Coastguard Worker   if (error == OK || error == ERR_IO_PENDING ||
491*6777b538SAndroid Build Coastguard Worker       error == ERR_INTERNET_DISCONNECTED || error == ERR_NAME_NOT_RESOLVED ||
492*6777b538SAndroid Build Coastguard Worker       error == ERR_DNS_NAME_HTTPS_ONLY) {
493*6777b538SAndroid Build Coastguard Worker     return error;
494*6777b538SAndroid Build Coastguard Worker   } else {
495*6777b538SAndroid Build Coastguard Worker     return ERR_NAME_NOT_RESOLVED;
496*6777b538SAndroid Build Coastguard Worker   }
497*6777b538SAndroid Build Coastguard Worker }
498*6777b538SAndroid Build Coastguard Worker 
499*6777b538SAndroid Build Coastguard Worker // static
EndpointResultToAddressList(base::span<const HostResolverEndpointResult> endpoints,const std::set<std::string> & aliases)500*6777b538SAndroid Build Coastguard Worker AddressList HostResolver::EndpointResultToAddressList(
501*6777b538SAndroid Build Coastguard Worker     base::span<const HostResolverEndpointResult> endpoints,
502*6777b538SAndroid Build Coastguard Worker     const std::set<std::string>& aliases) {
503*6777b538SAndroid Build Coastguard Worker   AddressList list;
504*6777b538SAndroid Build Coastguard Worker 
505*6777b538SAndroid Build Coastguard Worker   auto non_protocol_endpoint =
506*6777b538SAndroid Build Coastguard Worker       base::ranges::find_if(endpoints, &EndpointResultIsNonProtocol);
507*6777b538SAndroid Build Coastguard Worker   if (non_protocol_endpoint == endpoints.end())
508*6777b538SAndroid Build Coastguard Worker     return list;
509*6777b538SAndroid Build Coastguard Worker 
510*6777b538SAndroid Build Coastguard Worker   list.endpoints() = non_protocol_endpoint->ip_endpoints;
511*6777b538SAndroid Build Coastguard Worker 
512*6777b538SAndroid Build Coastguard Worker   std::vector<std::string> aliases_vector(aliases.begin(), aliases.end());
513*6777b538SAndroid Build Coastguard Worker   list.SetDnsAliases(std::move(aliases_vector));
514*6777b538SAndroid Build Coastguard Worker 
515*6777b538SAndroid Build Coastguard Worker   return list;
516*6777b538SAndroid Build Coastguard Worker }
517*6777b538SAndroid Build Coastguard Worker 
518*6777b538SAndroid Build Coastguard Worker // static
AllProtocolEndpointsHaveEch(base::span<const HostResolverEndpointResult> endpoints)519*6777b538SAndroid Build Coastguard Worker bool HostResolver::AllProtocolEndpointsHaveEch(
520*6777b538SAndroid Build Coastguard Worker     base::span<const HostResolverEndpointResult> endpoints) {
521*6777b538SAndroid Build Coastguard Worker   bool has_svcb = false;
522*6777b538SAndroid Build Coastguard Worker   for (const auto& endpoint : endpoints) {
523*6777b538SAndroid Build Coastguard Worker     if (!endpoint.metadata.supported_protocol_alpns.empty()) {
524*6777b538SAndroid Build Coastguard Worker       has_svcb = true;
525*6777b538SAndroid Build Coastguard Worker       if (endpoint.metadata.ech_config_list.empty()) {
526*6777b538SAndroid Build Coastguard Worker         return false;  // There is a non-ECH SVCB/HTTPS route.
527*6777b538SAndroid Build Coastguard Worker       }
528*6777b538SAndroid Build Coastguard Worker     }
529*6777b538SAndroid Build Coastguard Worker   }
530*6777b538SAndroid Build Coastguard Worker   // Either there were no SVCB/HTTPS records (should be SVCB-optional), or there
531*6777b538SAndroid Build Coastguard Worker   // were and all supported ECH (should be SVCB-reliant).
532*6777b538SAndroid Build Coastguard Worker   return has_svcb;
533*6777b538SAndroid Build Coastguard Worker }
534*6777b538SAndroid Build Coastguard Worker 
535*6777b538SAndroid Build Coastguard Worker // static
MayUseNAT64ForIPv4Literal(HostResolverFlags flags,HostResolverSource source,const IPAddress & ip_address)536*6777b538SAndroid Build Coastguard Worker bool HostResolver::MayUseNAT64ForIPv4Literal(HostResolverFlags flags,
537*6777b538SAndroid Build Coastguard Worker                                              HostResolverSource source,
538*6777b538SAndroid Build Coastguard Worker                                              const IPAddress& ip_address) {
539*6777b538SAndroid Build Coastguard Worker   return !(flags & HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6) &&
540*6777b538SAndroid Build Coastguard Worker          ip_address.IsValid() && ip_address.IsIPv4() &&
541*6777b538SAndroid Build Coastguard Worker          base::FeatureList::IsEnabled(features::kUseNAT64ForIPv4Literal) &&
542*6777b538SAndroid Build Coastguard Worker          (source != HostResolverSource::LOCAL_ONLY);
543*6777b538SAndroid Build Coastguard Worker }
544*6777b538SAndroid Build Coastguard Worker 
545*6777b538SAndroid Build Coastguard Worker HostResolver::HostResolver() = default;
546*6777b538SAndroid Build Coastguard Worker 
547*6777b538SAndroid Build Coastguard Worker // static
548*6777b538SAndroid Build Coastguard Worker std::unique_ptr<HostResolver::ResolveHostRequest>
CreateFailingRequest(int error)549*6777b538SAndroid Build Coastguard Worker HostResolver::CreateFailingRequest(int error) {
550*6777b538SAndroid Build Coastguard Worker   return std::make_unique<FailingRequestImpl>(error);
551*6777b538SAndroid Build Coastguard Worker }
552*6777b538SAndroid Build Coastguard Worker 
553*6777b538SAndroid Build Coastguard Worker // static
554*6777b538SAndroid Build Coastguard Worker std::unique_ptr<HostResolver::ProbeRequest>
CreateFailingProbeRequest(int error)555*6777b538SAndroid Build Coastguard Worker HostResolver::CreateFailingProbeRequest(int error) {
556*6777b538SAndroid Build Coastguard Worker   return std::make_unique<FailingRequestImpl>(error);
557*6777b538SAndroid Build Coastguard Worker }
558*6777b538SAndroid Build Coastguard Worker 
559*6777b538SAndroid Build Coastguard Worker }  // namespace net
560