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