xref: /aosp_15_r20/external/cronet/net/dns/host_resolver.h (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 #ifndef NET_DNS_HOST_RESOLVER_H_
6*6777b538SAndroid Build Coastguard Worker #define NET_DNS_HOST_RESOLVER_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
9*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker #include <memory>
12*6777b538SAndroid Build Coastguard Worker #include <optional>
13*6777b538SAndroid Build Coastguard Worker #include <set>
14*6777b538SAndroid Build Coastguard Worker #include <string>
15*6777b538SAndroid Build Coastguard Worker #include <string_view>
16*6777b538SAndroid Build Coastguard Worker #include <vector>
17*6777b538SAndroid Build Coastguard Worker 
18*6777b538SAndroid Build Coastguard Worker #include "base/containers/span.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/values.h"
20*6777b538SAndroid Build Coastguard Worker #include "net/base/address_family.h"
21*6777b538SAndroid Build Coastguard Worker #include "net/base/completion_once_callback.h"
22*6777b538SAndroid Build Coastguard Worker #include "net/base/host_port_pair.h"
23*6777b538SAndroid Build Coastguard Worker #include "net/base/network_anonymization_key.h"
24*6777b538SAndroid Build Coastguard Worker #include "net/base/network_handle.h"
25*6777b538SAndroid Build Coastguard Worker #include "net/base/request_priority.h"
26*6777b538SAndroid Build Coastguard Worker #include "net/dns/host_cache.h"
27*6777b538SAndroid Build Coastguard Worker #include "net/dns/host_resolver_system_task.h"
28*6777b538SAndroid Build Coastguard Worker #include "net/dns/public/dns_config_overrides.h"
29*6777b538SAndroid Build Coastguard Worker #include "net/dns/public/dns_query_type.h"
30*6777b538SAndroid Build Coastguard Worker #include "net/dns/public/host_resolver_results.h"
31*6777b538SAndroid Build Coastguard Worker #include "net/dns/public/host_resolver_source.h"
32*6777b538SAndroid Build Coastguard Worker #include "net/dns/public/mdns_listener_update_type.h"
33*6777b538SAndroid Build Coastguard Worker #include "net/dns/public/resolve_error_info.h"
34*6777b538SAndroid Build Coastguard Worker #include "net/dns/public/secure_dns_policy.h"
35*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log_with_source.h"
36*6777b538SAndroid Build Coastguard Worker #include "third_party/abseil-cpp/absl/types/variant.h"
37*6777b538SAndroid Build Coastguard Worker #include "url/scheme_host_port.h"
38*6777b538SAndroid Build Coastguard Worker 
39*6777b538SAndroid Build Coastguard Worker namespace net {
40*6777b538SAndroid Build Coastguard Worker 
41*6777b538SAndroid Build Coastguard Worker class AddressList;
42*6777b538SAndroid Build Coastguard Worker class ContextHostResolver;
43*6777b538SAndroid Build Coastguard Worker class DnsClient;
44*6777b538SAndroid Build Coastguard Worker struct DnsConfigOverrides;
45*6777b538SAndroid Build Coastguard Worker class HostResolverManager;
46*6777b538SAndroid Build Coastguard Worker class NetLog;
47*6777b538SAndroid Build Coastguard Worker class URLRequestContext;
48*6777b538SAndroid Build Coastguard Worker 
49*6777b538SAndroid Build Coastguard Worker // This class represents the task of resolving hostnames (or IP address
50*6777b538SAndroid Build Coastguard Worker // literal) to an AddressList object (or other DNS-style results).
51*6777b538SAndroid Build Coastguard Worker //
52*6777b538SAndroid Build Coastguard Worker // Typically implemented by ContextHostResolver or wrappers thereof. See
53*6777b538SAndroid Build Coastguard Worker // HostResolver::Create[...]() methods for construction or URLRequestContext for
54*6777b538SAndroid Build Coastguard Worker // retrieval.
55*6777b538SAndroid Build Coastguard Worker //
56*6777b538SAndroid Build Coastguard Worker // See mock_host_resolver.h for test implementations.
57*6777b538SAndroid Build Coastguard Worker class NET_EXPORT HostResolver {
58*6777b538SAndroid Build Coastguard Worker  public:
59*6777b538SAndroid Build Coastguard Worker   class NET_EXPORT Host {
60*6777b538SAndroid Build Coastguard Worker    public:
61*6777b538SAndroid Build Coastguard Worker     explicit Host(absl::variant<url::SchemeHostPort, HostPortPair> host);
62*6777b538SAndroid Build Coastguard Worker     ~Host();
63*6777b538SAndroid Build Coastguard Worker 
64*6777b538SAndroid Build Coastguard Worker     Host(const Host&);
65*6777b538SAndroid Build Coastguard Worker     Host& operator=(const Host&);
66*6777b538SAndroid Build Coastguard Worker     Host(Host&&);
67*6777b538SAndroid Build Coastguard Worker     Host& operator=(Host&&);
68*6777b538SAndroid Build Coastguard Worker 
69*6777b538SAndroid Build Coastguard Worker     bool HasScheme() const;
70*6777b538SAndroid Build Coastguard Worker     const std::string& GetScheme() const;
71*6777b538SAndroid Build Coastguard Worker     std::string GetHostname() const;  // With brackets for IPv6 literals.
72*6777b538SAndroid Build Coastguard Worker     std::string_view GetHostnameWithoutBrackets() const;
73*6777b538SAndroid Build Coastguard Worker     uint16_t GetPort() const;
74*6777b538SAndroid Build Coastguard Worker 
75*6777b538SAndroid Build Coastguard Worker     std::string ToString() const;
76*6777b538SAndroid Build Coastguard Worker 
77*6777b538SAndroid Build Coastguard Worker     const url::SchemeHostPort& AsSchemeHostPort() const;
78*6777b538SAndroid Build Coastguard Worker 
79*6777b538SAndroid Build Coastguard Worker     bool operator==(const Host& other) const { return host_ == other.host_; }
80*6777b538SAndroid Build Coastguard Worker 
81*6777b538SAndroid Build Coastguard Worker     bool operator<(const Host& other) const { return host_ < other.host_; }
82*6777b538SAndroid Build Coastguard Worker 
83*6777b538SAndroid Build Coastguard Worker    private:
84*6777b538SAndroid Build Coastguard Worker     absl::variant<url::SchemeHostPort, HostPortPair> host_;
85*6777b538SAndroid Build Coastguard Worker   };
86*6777b538SAndroid Build Coastguard Worker 
87*6777b538SAndroid Build Coastguard Worker   // Handler for an individual host resolution request. Created by
88*6777b538SAndroid Build Coastguard Worker   // HostResolver::CreateRequest().
89*6777b538SAndroid Build Coastguard Worker   //
90*6777b538SAndroid Build Coastguard Worker   // TODO(crbug.com/1290920): Most result retrieval here follows a pattern where
91*6777b538SAndroid Build Coastguard Worker   // it may return null or empty for requests where that result type is not
92*6777b538SAndroid Build Coastguard Worker   // available. Clean this up to always return empty for such cases and remove
93*6777b538SAndroid Build Coastguard Worker   // nullability from the return types.
94*6777b538SAndroid Build Coastguard Worker   class ResolveHostRequest {
95*6777b538SAndroid Build Coastguard Worker    public:
96*6777b538SAndroid Build Coastguard Worker     // Destruction cancels the request if running asynchronously, causing the
97*6777b538SAndroid Build Coastguard Worker     // callback to never be invoked.
98*6777b538SAndroid Build Coastguard Worker     virtual ~ResolveHostRequest() = default;
99*6777b538SAndroid Build Coastguard Worker 
100*6777b538SAndroid Build Coastguard Worker     // Starts the request and returns a network error code.
101*6777b538SAndroid Build Coastguard Worker     //
102*6777b538SAndroid Build Coastguard Worker     // If the request could not be handled synchronously, returns
103*6777b538SAndroid Build Coastguard Worker     // |ERR_IO_PENDING|, and completion will be signaled later via |callback|.
104*6777b538SAndroid Build Coastguard Worker     // On any other returned value, the request was handled synchronously and
105*6777b538SAndroid Build Coastguard Worker     // |callback| will not be invoked.
106*6777b538SAndroid Build Coastguard Worker     //
107*6777b538SAndroid Build Coastguard Worker     // Results in ERR_NAME_NOT_RESOLVED if the hostname is not resolved. More
108*6777b538SAndroid Build Coastguard Worker     // detail about the underlying error can be retrieved using
109*6777b538SAndroid Build Coastguard Worker     // GetResolveErrorInfo().
110*6777b538SAndroid Build Coastguard Worker     //
111*6777b538SAndroid Build Coastguard Worker     // The parent HostResolver must still be alive when Start() is called,  but
112*6777b538SAndroid Build Coastguard Worker     // if it is destroyed before an asynchronous result completes, the request
113*6777b538SAndroid Build Coastguard Worker     // will be automatically cancelled.
114*6777b538SAndroid Build Coastguard Worker     //
115*6777b538SAndroid Build Coastguard Worker     // If cancelled before |callback| is invoked, it will never be invoked.
116*6777b538SAndroid Build Coastguard Worker     virtual int Start(CompletionOnceCallback callback) = 0;
117*6777b538SAndroid Build Coastguard Worker 
118*6777b538SAndroid Build Coastguard Worker     // Address record (A or AAAA) results of the request. Should only be called
119*6777b538SAndroid Build Coastguard Worker     // after Start() signals completion, either by invoking the callback or by
120*6777b538SAndroid Build Coastguard Worker     // returning a result other than |ERR_IO_PENDING|. May return nullptr or
121*6777b538SAndroid Build Coastguard Worker     // empty for non-address requests.
122*6777b538SAndroid Build Coastguard Worker     //
123*6777b538SAndroid Build Coastguard Worker     // TODO(crbug.com/1264933): Remove and replace all usage with
124*6777b538SAndroid Build Coastguard Worker     // GetEndpointResults().
125*6777b538SAndroid Build Coastguard Worker     virtual const AddressList* GetAddressResults() const = 0;
126*6777b538SAndroid Build Coastguard Worker 
127*6777b538SAndroid Build Coastguard Worker     // Endpoint results for `A`, `AAAA`, `UNSPECIFIED`, or `HTTPS` requests.
128*6777b538SAndroid Build Coastguard Worker     // Should only be called after Start() signals completion, either by
129*6777b538SAndroid Build Coastguard Worker     // invoking the callback or by returning a result other than
130*6777b538SAndroid Build Coastguard Worker     // `ERR_IO_PENDING`. May return nullptr or empty for non-address/HTTPS
131*6777b538SAndroid Build Coastguard Worker     // requests.
132*6777b538SAndroid Build Coastguard Worker     virtual const std::vector<HostResolverEndpointResult>* GetEndpointResults()
133*6777b538SAndroid Build Coastguard Worker         const = 0;
134*6777b538SAndroid Build Coastguard Worker 
135*6777b538SAndroid Build Coastguard Worker     // Text record (TXT) results of the request. Should only be called after
136*6777b538SAndroid Build Coastguard Worker     // Start() signals completion, either by invoking the callback or by
137*6777b538SAndroid Build Coastguard Worker     // returning a result other than |ERR_IO_PENDING|. May return nullptr or
138*6777b538SAndroid Build Coastguard Worker     // empty for non-TXT requests.
139*6777b538SAndroid Build Coastguard Worker     virtual const std::vector<std::string>* GetTextResults() const = 0;
140*6777b538SAndroid Build Coastguard Worker 
141*6777b538SAndroid Build Coastguard Worker     // Hostname record (SRV or PTR) results of the request. For SRV results,
142*6777b538SAndroid Build Coastguard Worker     // hostnames are ordered according to their priorities and weights. See RFC
143*6777b538SAndroid Build Coastguard Worker     // 2782. May return nullptr or empty for non-SRV/PTR requests.
144*6777b538SAndroid Build Coastguard Worker     //
145*6777b538SAndroid Build Coastguard Worker     // Should only be called after Start() signals completion, either by
146*6777b538SAndroid Build Coastguard Worker     // invoking the callback or by returning a result other than
147*6777b538SAndroid Build Coastguard Worker     // |ERR_IO_PENDING|.
148*6777b538SAndroid Build Coastguard Worker     virtual const std::vector<HostPortPair>* GetHostnameResults() const = 0;
149*6777b538SAndroid Build Coastguard Worker 
150*6777b538SAndroid Build Coastguard Worker     // Any DNS record aliases, such as CNAME aliases, found as a result of an
151*6777b538SAndroid Build Coastguard Worker     // address query. Includes all known aliases, e.g. from A, AAAA, or HTTPS,
152*6777b538SAndroid Build Coastguard Worker     // not just from the address used for the connection, in no particular
153*6777b538SAndroid Build Coastguard Worker     // order. Should only be called after Start() signals completion, either by
154*6777b538SAndroid Build Coastguard Worker     // invoking the callback or by returning a result other than
155*6777b538SAndroid Build Coastguard Worker     // `ERR_IO_PENDING`. Returns a list of aliases that has been fixed up and
156*6777b538SAndroid Build Coastguard Worker     // canonicalized (as URL hostnames), and thus may differ from the results
157*6777b538SAndroid Build Coastguard Worker     // stored directly in the AddressList. May return nullptr or empty for
158*6777b538SAndroid Build Coastguard Worker     // non-address/HTTPS requests.
159*6777b538SAndroid Build Coastguard Worker     //
160*6777b538SAndroid Build Coastguard Worker     // If `ResolveHostParameters::include_canonical_name` was true, alias
161*6777b538SAndroid Build Coastguard Worker     // results will always be the single "canonical name" received from the
162*6777b538SAndroid Build Coastguard Worker     // system resolver without URL hostname canonicalization (or an empty set or
163*6777b538SAndroid Build Coastguard Worker     // `nullptr` in the unusual case that the system resolver did not give a
164*6777b538SAndroid Build Coastguard Worker     // canonical name).
165*6777b538SAndroid Build Coastguard Worker     virtual const std::set<std::string>* GetDnsAliasResults() const = 0;
166*6777b538SAndroid Build Coastguard Worker 
167*6777b538SAndroid Build Coastguard Worker     // Result of an experimental query. Meaning depends on the specific query
168*6777b538SAndroid Build Coastguard Worker     // type, but each boolean value generally refers to a valid or invalid
169*6777b538SAndroid Build Coastguard Worker     // record of the experimental type. May return nullptr or empty for requests
170*6777b538SAndroid Build Coastguard Worker     // without experimental result behavior.
171*6777b538SAndroid Build Coastguard Worker     NET_EXPORT virtual const std::vector<bool>*
172*6777b538SAndroid Build Coastguard Worker     GetExperimentalResultsForTesting() const;
173*6777b538SAndroid Build Coastguard Worker 
174*6777b538SAndroid Build Coastguard Worker     // Error info for the request.
175*6777b538SAndroid Build Coastguard Worker     //
176*6777b538SAndroid Build Coastguard Worker     // Should only be called after Start() signals completion, either by
177*6777b538SAndroid Build Coastguard Worker     // invoking the callback or by returning a result other than
178*6777b538SAndroid Build Coastguard Worker     // |ERR_IO_PENDING|.
179*6777b538SAndroid Build Coastguard Worker     virtual ResolveErrorInfo GetResolveErrorInfo() const = 0;
180*6777b538SAndroid Build Coastguard Worker 
181*6777b538SAndroid Build Coastguard Worker     // Information about the result's staleness in the host cache. Only
182*6777b538SAndroid Build Coastguard Worker     // available if results were received from the host cache, otherwise
183*6777b538SAndroid Build Coastguard Worker     // returns nullopt.
184*6777b538SAndroid Build Coastguard Worker     //
185*6777b538SAndroid Build Coastguard Worker     // Should only be called after Start() signals completion, either by
186*6777b538SAndroid Build Coastguard Worker     // invoking the callback or by returning a result other than
187*6777b538SAndroid Build Coastguard Worker     // |ERR_IO_PENDING|.
188*6777b538SAndroid Build Coastguard Worker     virtual const std::optional<HostCache::EntryStaleness>& GetStaleInfo()
189*6777b538SAndroid Build Coastguard Worker         const = 0;
190*6777b538SAndroid Build Coastguard Worker 
191*6777b538SAndroid Build Coastguard Worker     // Changes the priority of the specified request. Can only be called while
192*6777b538SAndroid Build Coastguard Worker     // the request is running (after Start() returns |ERR_IO_PENDING| and before
193*6777b538SAndroid Build Coastguard Worker     // the callback is invoked).
ChangeRequestPriority(RequestPriority priority)194*6777b538SAndroid Build Coastguard Worker     virtual void ChangeRequestPriority(RequestPriority priority) {}
195*6777b538SAndroid Build Coastguard Worker   };
196*6777b538SAndroid Build Coastguard Worker 
197*6777b538SAndroid Build Coastguard Worker   // Handler for a service endpoint resolution request. Unlike
198*6777b538SAndroid Build Coastguard Worker   // ResolveHostRequest, which waits for all responses, this could provide
199*6777b538SAndroid Build Coastguard Worker   // intermediate endpoint candidates in the middle of the resolution.
200*6777b538SAndroid Build Coastguard Worker   //
201*6777b538SAndroid Build Coastguard Worker   // A client owns an instance of this class. Destruction cancels the request.
202*6777b538SAndroid Build Coastguard Worker   class ServiceEndpointRequest {
203*6777b538SAndroid Build Coastguard Worker    public:
204*6777b538SAndroid Build Coastguard Worker     class Delegate {
205*6777b538SAndroid Build Coastguard Worker      public:
206*6777b538SAndroid Build Coastguard Worker       virtual ~Delegate() = default;
207*6777b538SAndroid Build Coastguard Worker 
208*6777b538SAndroid Build Coastguard Worker       // Called when the request has updated endpoints.
209*6777b538SAndroid Build Coastguard Worker       virtual void OnServiceEndpointsUpdated() = 0;
210*6777b538SAndroid Build Coastguard Worker 
211*6777b538SAndroid Build Coastguard Worker       // Called when all queries are responded or an error occurred.
212*6777b538SAndroid Build Coastguard Worker       // Note that this can be called without OnServiceEndpointsUpdated().
213*6777b538SAndroid Build Coastguard Worker       virtual void OnServiceEndpointRequestFinished(int rv) = 0;
214*6777b538SAndroid Build Coastguard Worker     };
215*6777b538SAndroid Build Coastguard Worker 
216*6777b538SAndroid Build Coastguard Worker     virtual ~ServiceEndpointRequest() = default;
217*6777b538SAndroid Build Coastguard Worker 
218*6777b538SAndroid Build Coastguard Worker     // Starts resolving service endpoints. `delegate` is used only when this
219*6777b538SAndroid Build Coastguard Worker     // method returns ERR_IO_PENDING. When the return value is other than
220*6777b538SAndroid Build Coastguard Worker     // ERR_IO_PENDING, resolution completed (or an error occurred)
221*6777b538SAndroid Build Coastguard Worker     // synchronously, and GetEndpointResults() will return finalized results.
222*6777b538SAndroid Build Coastguard Worker     virtual int Start(Delegate* delegate) = 0;
223*6777b538SAndroid Build Coastguard Worker 
224*6777b538SAndroid Build Coastguard Worker     // The current available service endpoints. These can be changed over time
225*6777b538SAndroid Build Coastguard Worker     // while resolution is still ongoing. Changes are signaled by a call to the
226*6777b538SAndroid Build Coastguard Worker     // delegate's OnServiceEndpointsUpdated(). Results are finalized when
227*6777b538SAndroid Build Coastguard Worker     // Start() finished synchronously (returning other than ERR_IO_PENDING), or
228*6777b538SAndroid Build Coastguard Worker     // delegate's OnServiceEndpointRequestFinished() is called.
229*6777b538SAndroid Build Coastguard Worker     virtual const std::vector<ServiceEndpoint>& GetEndpointResults() = 0;
230*6777b538SAndroid Build Coastguard Worker 
231*6777b538SAndroid Build Coastguard Worker     // Any DNS record aliases, such as CNAME aliases, found as a result of
232*6777b538SAndroid Build Coastguard Worker     // addresses and HTTPS queries. These can be changed over time while
233*6777b538SAndroid Build Coastguard Worker     // resolution is still ongoing. See also the comment on
234*6777b538SAndroid Build Coastguard Worker     // Request::GetDnsAliasResults() for details.
235*6777b538SAndroid Build Coastguard Worker     virtual const std::set<std::string>& GetDnsAliasResults() = 0;
236*6777b538SAndroid Build Coastguard Worker 
237*6777b538SAndroid Build Coastguard Worker     // True if the client of this request can attempt cryptographic handshakes.
238*6777b538SAndroid Build Coastguard Worker     // If false, the provided service endpoints via GetEndpointResults() are not
239*6777b538SAndroid Build Coastguard Worker     // finalized to the point to allow completing transactions, and data or
240*6777b538SAndroid Build Coastguard Worker     // cryptographic handshakes must not be sent. This can be changed over time
241*6777b538SAndroid Build Coastguard Worker     // while resolution is still ongoing.
242*6777b538SAndroid Build Coastguard Worker     // TODO(crbug.com/41493696): Consider renaming this to
243*6777b538SAndroid Build Coastguard Worker     // `IsSvcbResolutionCompleted()` when Chrome supports HTTPS follow-up
244*6777b538SAndroid Build Coastguard Worker     // queries.
245*6777b538SAndroid Build Coastguard Worker     virtual bool EndpointsCryptoReady() = 0;
246*6777b538SAndroid Build Coastguard Worker   };
247*6777b538SAndroid Build Coastguard Worker 
248*6777b538SAndroid Build Coastguard Worker   // Handler for an activation of probes controlled by a HostResolver. Created
249*6777b538SAndroid Build Coastguard Worker   // by HostResolver::CreateDohProbeRequest().
250*6777b538SAndroid Build Coastguard Worker   class ProbeRequest {
251*6777b538SAndroid Build Coastguard Worker    public:
252*6777b538SAndroid Build Coastguard Worker     // Destruction cancels the request and all probes.
253*6777b538SAndroid Build Coastguard Worker     virtual ~ProbeRequest() = default;
254*6777b538SAndroid Build Coastguard Worker 
255*6777b538SAndroid Build Coastguard Worker     // Activates async running of probes. Always returns ERR_IO_PENDING or an
256*6777b538SAndroid Build Coastguard Worker     // error from activating probes. No callback as probes will never "complete"
257*6777b538SAndroid Build Coastguard Worker     // until cancellation.
258*6777b538SAndroid Build Coastguard Worker     virtual int Start() = 0;
259*6777b538SAndroid Build Coastguard Worker   };
260*6777b538SAndroid Build Coastguard Worker 
261*6777b538SAndroid Build Coastguard Worker   // The options for features::kUseDnsHttpsSvcb experiment. See the comments
262*6777b538SAndroid Build Coastguard Worker   // in net/base/features.h for more details.
263*6777b538SAndroid Build Coastguard Worker   struct NET_EXPORT HttpsSvcbOptions {
264*6777b538SAndroid Build Coastguard Worker     HttpsSvcbOptions();
265*6777b538SAndroid Build Coastguard Worker     HttpsSvcbOptions(const HttpsSvcbOptions&);
266*6777b538SAndroid Build Coastguard Worker     HttpsSvcbOptions(HttpsSvcbOptions&&);
267*6777b538SAndroid Build Coastguard Worker     HttpsSvcbOptions& operator=(const HttpsSvcbOptions&) = default;
268*6777b538SAndroid Build Coastguard Worker     HttpsSvcbOptions& operator=(HttpsSvcbOptions&&) = default;
269*6777b538SAndroid Build Coastguard Worker     ~HttpsSvcbOptions();
270*6777b538SAndroid Build Coastguard Worker 
271*6777b538SAndroid Build Coastguard Worker     static HttpsSvcbOptions FromDict(const base::Value::Dict& dict);
272*6777b538SAndroid Build Coastguard Worker     static HttpsSvcbOptions FromFeatures();
273*6777b538SAndroid Build Coastguard Worker 
274*6777b538SAndroid Build Coastguard Worker     bool enable = false;
275*6777b538SAndroid Build Coastguard Worker     base::TimeDelta insecure_extra_time_max;
276*6777b538SAndroid Build Coastguard Worker     int insecure_extra_time_percent = 0;
277*6777b538SAndroid Build Coastguard Worker     base::TimeDelta insecure_extra_time_min;
278*6777b538SAndroid Build Coastguard Worker     base::TimeDelta secure_extra_time_max;
279*6777b538SAndroid Build Coastguard Worker     int secure_extra_time_percent = 0;
280*6777b538SAndroid Build Coastguard Worker     base::TimeDelta secure_extra_time_min;
281*6777b538SAndroid Build Coastguard Worker   };
282*6777b538SAndroid Build Coastguard Worker 
283*6777b538SAndroid Build Coastguard Worker   // Parameter-grouping struct for additional optional parameters for creation
284*6777b538SAndroid Build Coastguard Worker   // of HostResolverManagers and stand-alone HostResolvers.
285*6777b538SAndroid Build Coastguard Worker   struct NET_EXPORT ManagerOptions {
286*6777b538SAndroid Build Coastguard Worker     ManagerOptions();
287*6777b538SAndroid Build Coastguard Worker     ManagerOptions(const ManagerOptions&);
288*6777b538SAndroid Build Coastguard Worker     ManagerOptions(ManagerOptions&&);
289*6777b538SAndroid Build Coastguard Worker     ManagerOptions& operator=(const ManagerOptions&) = default;
290*6777b538SAndroid Build Coastguard Worker     ManagerOptions& operator=(ManagerOptions&&) = default;
291*6777b538SAndroid Build Coastguard Worker     ~ManagerOptions();
292*6777b538SAndroid Build Coastguard Worker 
293*6777b538SAndroid Build Coastguard Worker     // Set |max_concurrent_resolves| to this to select a default level
294*6777b538SAndroid Build Coastguard Worker     // of concurrency.
295*6777b538SAndroid Build Coastguard Worker     static const size_t kDefaultParallelism = 0;
296*6777b538SAndroid Build Coastguard Worker 
297*6777b538SAndroid Build Coastguard Worker     // How many resolve requests will be allowed to run in parallel.
298*6777b538SAndroid Build Coastguard Worker     // |kDefaultParallelism| for the resolver to choose a default value.
299*6777b538SAndroid Build Coastguard Worker     size_t max_concurrent_resolves = kDefaultParallelism;
300*6777b538SAndroid Build Coastguard Worker 
301*6777b538SAndroid Build Coastguard Worker     // The maximum number of times to retry for host resolution if using the
302*6777b538SAndroid Build Coastguard Worker     // system resolver. No effect when the system resolver is not used.
303*6777b538SAndroid Build Coastguard Worker     // |kDefaultRetryAttempts| for the resolver to choose a default value.
304*6777b538SAndroid Build Coastguard Worker     size_t max_system_retry_attempts =
305*6777b538SAndroid Build Coastguard Worker         HostResolverSystemTask::Params::kDefaultRetryAttempts;
306*6777b538SAndroid Build Coastguard Worker 
307*6777b538SAndroid Build Coastguard Worker     // Initial setting for whether the insecure portion of the built-in
308*6777b538SAndroid Build Coastguard Worker     // asynchronous DnsClient is enabled or disabled. See HostResolverManager::
309*6777b538SAndroid Build Coastguard Worker     // SetInsecureDnsClientEnabled() for details.
310*6777b538SAndroid Build Coastguard Worker     bool insecure_dns_client_enabled = false;
311*6777b538SAndroid Build Coastguard Worker 
312*6777b538SAndroid Build Coastguard Worker     // Initial setting for whether additional DNS types (e.g. HTTPS) may be
313*6777b538SAndroid Build Coastguard Worker     // queried when using the built-in resolver for insecure DNS.
314*6777b538SAndroid Build Coastguard Worker     bool additional_types_via_insecure_dns_enabled = true;
315*6777b538SAndroid Build Coastguard Worker 
316*6777b538SAndroid Build Coastguard Worker     // Initial configuration overrides for the built-in asynchronous DnsClient.
317*6777b538SAndroid Build Coastguard Worker     // See HostResolverManager::SetDnsConfigOverrides() for details.
318*6777b538SAndroid Build Coastguard Worker     DnsConfigOverrides dns_config_overrides;
319*6777b538SAndroid Build Coastguard Worker 
320*6777b538SAndroid Build Coastguard Worker     // If set to |false|, when on a WiFi connection, IPv6 will be assumed to be
321*6777b538SAndroid Build Coastguard Worker     // unreachable without actually checking. See https://crbug.com/696569 for
322*6777b538SAndroid Build Coastguard Worker     // further context.
323*6777b538SAndroid Build Coastguard Worker     bool check_ipv6_on_wifi = true;
324*6777b538SAndroid Build Coastguard Worker 
325*6777b538SAndroid Build Coastguard Worker     // An experimental options for features::kUseDnsHttpsSvcb
326*6777b538SAndroid Build Coastguard Worker     // and features::kUseDnsHttpsSvcbAlpn.
327*6777b538SAndroid Build Coastguard Worker     std::optional<HostResolver::HttpsSvcbOptions> https_svcb_options;
328*6777b538SAndroid Build Coastguard Worker   };
329*6777b538SAndroid Build Coastguard Worker 
330*6777b538SAndroid Build Coastguard Worker   // Factory class. Useful for classes that need to inject and override resolver
331*6777b538SAndroid Build Coastguard Worker   // creation for tests.
332*6777b538SAndroid Build Coastguard Worker   class NET_EXPORT Factory {
333*6777b538SAndroid Build Coastguard Worker    public:
334*6777b538SAndroid Build Coastguard Worker     virtual ~Factory() = default;
335*6777b538SAndroid Build Coastguard Worker 
336*6777b538SAndroid Build Coastguard Worker     // See HostResolver::CreateResolver.
337*6777b538SAndroid Build Coastguard Worker     virtual std::unique_ptr<HostResolver> CreateResolver(
338*6777b538SAndroid Build Coastguard Worker         HostResolverManager* manager,
339*6777b538SAndroid Build Coastguard Worker         std::string_view host_mapping_rules,
340*6777b538SAndroid Build Coastguard Worker         bool enable_caching);
341*6777b538SAndroid Build Coastguard Worker 
342*6777b538SAndroid Build Coastguard Worker     // See HostResolver::CreateStandaloneResolver.
343*6777b538SAndroid Build Coastguard Worker     virtual std::unique_ptr<HostResolver> CreateStandaloneResolver(
344*6777b538SAndroid Build Coastguard Worker         NetLog* net_log,
345*6777b538SAndroid Build Coastguard Worker         const ManagerOptions& options,
346*6777b538SAndroid Build Coastguard Worker         std::string_view host_mapping_rules,
347*6777b538SAndroid Build Coastguard Worker         bool enable_caching);
348*6777b538SAndroid Build Coastguard Worker   };
349*6777b538SAndroid Build Coastguard Worker 
350*6777b538SAndroid Build Coastguard Worker   // Parameter-grouping struct for additional optional parameters for
351*6777b538SAndroid Build Coastguard Worker   // CreateRequest() calls. All fields are optional and have a reasonable
352*6777b538SAndroid Build Coastguard Worker   // default.
353*6777b538SAndroid Build Coastguard Worker   struct NET_EXPORT ResolveHostParameters {
354*6777b538SAndroid Build Coastguard Worker     ResolveHostParameters();
355*6777b538SAndroid Build Coastguard Worker     ResolveHostParameters(const ResolveHostParameters& other);
356*6777b538SAndroid Build Coastguard Worker 
357*6777b538SAndroid Build Coastguard Worker     // Requested DNS query type. If UNSPECIFIED, the resolver will select a set
358*6777b538SAndroid Build Coastguard Worker     // of queries automatically. It will select A, AAAA, or both as the address
359*6777b538SAndroid Build Coastguard Worker     // queries, depending on IPv4/IPv6 settings and reachability. It may also
360*6777b538SAndroid Build Coastguard Worker     // replace UNSPECIFIED with additional queries, such as HTTPS.
361*6777b538SAndroid Build Coastguard Worker     DnsQueryType dns_query_type = DnsQueryType::UNSPECIFIED;
362*6777b538SAndroid Build Coastguard Worker 
363*6777b538SAndroid Build Coastguard Worker     // The initial net priority for the host resolution request.
364*6777b538SAndroid Build Coastguard Worker     RequestPriority initial_priority = RequestPriority::DEFAULT_PRIORITY;
365*6777b538SAndroid Build Coastguard Worker 
366*6777b538SAndroid Build Coastguard Worker     // The source to use for resolved addresses. Default allows the resolver to
367*6777b538SAndroid Build Coastguard Worker     // pick an appropriate source. Only affects use of big external sources (eg
368*6777b538SAndroid Build Coastguard Worker     // calling the system for resolution or using DNS). Even if a source is
369*6777b538SAndroid Build Coastguard Worker     // specified, results can still come from cache, resolving "localhost" or
370*6777b538SAndroid Build Coastguard Worker     // IP literals, etc.
371*6777b538SAndroid Build Coastguard Worker     HostResolverSource source = HostResolverSource::ANY;
372*6777b538SAndroid Build Coastguard Worker 
373*6777b538SAndroid Build Coastguard Worker     enum class CacheUsage {
374*6777b538SAndroid Build Coastguard Worker       // Results may come from the host cache if non-stale.
375*6777b538SAndroid Build Coastguard Worker       ALLOWED,
376*6777b538SAndroid Build Coastguard Worker 
377*6777b538SAndroid Build Coastguard Worker       // Results may come from the host cache even if stale (by expiration or
378*6777b538SAndroid Build Coastguard Worker       // network changes). In secure dns AUTOMATIC mode, the cache is checked
379*6777b538SAndroid Build Coastguard Worker       // for both secure and insecure results prior to any secure DNS lookups to
380*6777b538SAndroid Build Coastguard Worker       // minimize response time.
381*6777b538SAndroid Build Coastguard Worker       STALE_ALLOWED,
382*6777b538SAndroid Build Coastguard Worker 
383*6777b538SAndroid Build Coastguard Worker       // Results will not come from the host cache.
384*6777b538SAndroid Build Coastguard Worker       DISALLOWED,
385*6777b538SAndroid Build Coastguard Worker     };
386*6777b538SAndroid Build Coastguard Worker     CacheUsage cache_usage = CacheUsage::ALLOWED;
387*6777b538SAndroid Build Coastguard Worker 
388*6777b538SAndroid Build Coastguard Worker     // If |true|, requests special behavior that the "canonical name" be
389*6777b538SAndroid Build Coastguard Worker     // requested from the system and be returned as the only entry in
390*6777b538SAndroid Build Coastguard Worker     // `ResolveHostRequest::GetDnsAliasResults()` results. Setting this
391*6777b538SAndroid Build Coastguard Worker     // parameter is disallowed for any requests that cannot be resolved using
392*6777b538SAndroid Build Coastguard Worker     // the system resolver, e.g. non-address requests or requests specifying a
393*6777b538SAndroid Build Coastguard Worker     // non-`SYSTEM` `source`.
394*6777b538SAndroid Build Coastguard Worker     //
395*6777b538SAndroid Build Coastguard Worker     // TODO(crbug.com/1282281): Consider allowing the built-in resolver to still
396*6777b538SAndroid Build Coastguard Worker     // be used with this parameter. Would then function as a request to just
397*6777b538SAndroid Build Coastguard Worker     // keep the single final name from the alias chain instead of all aliases,
398*6777b538SAndroid Build Coastguard Worker     // and also skip the canonicalization unless that canonicalization is found
399*6777b538SAndroid Build Coastguard Worker     // to be fine for usage.
400*6777b538SAndroid Build Coastguard Worker     bool include_canonical_name = false;
401*6777b538SAndroid Build Coastguard Worker 
402*6777b538SAndroid Build Coastguard Worker     // Hint to the resolver that resolution is only being requested for loopback
403*6777b538SAndroid Build Coastguard Worker     // hosts.
404*6777b538SAndroid Build Coastguard Worker     bool loopback_only = false;
405*6777b538SAndroid Build Coastguard Worker 
406*6777b538SAndroid Build Coastguard Worker     // Set |true| iff the host resolve request is only being made speculatively
407*6777b538SAndroid Build Coastguard Worker     // to fill the cache and the result addresses will not be used. The request
408*6777b538SAndroid Build Coastguard Worker     // will receive special logging/observer treatment, and the result addresses
409*6777b538SAndroid Build Coastguard Worker     // will always be |std::nullopt|.
410*6777b538SAndroid Build Coastguard Worker     bool is_speculative = false;
411*6777b538SAndroid Build Coastguard Worker 
412*6777b538SAndroid Build Coastguard Worker     // If `true`, resolver may (but is not guaranteed to) take steps to avoid
413*6777b538SAndroid Build Coastguard Worker     // the name being resolved via LLMNR or mDNS. Useful for requests where it
414*6777b538SAndroid Build Coastguard Worker     // is not desired to wait for longer timeouts on potential negative results,
415*6777b538SAndroid Build Coastguard Worker     // as is typically the case for LLMNR or mDNS queries without any results.
416*6777b538SAndroid Build Coastguard Worker     bool avoid_multicast_resolution = false;
417*6777b538SAndroid Build Coastguard Worker 
418*6777b538SAndroid Build Coastguard Worker     // Controls the resolver's Secure DNS behavior for this request.
419*6777b538SAndroid Build Coastguard Worker     SecureDnsPolicy secure_dns_policy = SecureDnsPolicy::kAllow;
420*6777b538SAndroid Build Coastguard Worker   };
421*6777b538SAndroid Build Coastguard Worker 
422*6777b538SAndroid Build Coastguard Worker   // Handler for an ongoing MDNS listening operation. Created by
423*6777b538SAndroid Build Coastguard Worker   // HostResolver::CreateMdnsListener().
424*6777b538SAndroid Build Coastguard Worker   class MdnsListener {
425*6777b538SAndroid Build Coastguard Worker    public:
426*6777b538SAndroid Build Coastguard Worker     // Delegate type for result update notifications from MdnsListener. All
427*6777b538SAndroid Build Coastguard Worker     // methods have a |result_type| field to allow a single delegate to be
428*6777b538SAndroid Build Coastguard Worker     // passed to multiple MdnsListeners and be used to listen for updates for
429*6777b538SAndroid Build Coastguard Worker     // multiple types for the same host.
430*6777b538SAndroid Build Coastguard Worker     class Delegate {
431*6777b538SAndroid Build Coastguard Worker      public:
432*6777b538SAndroid Build Coastguard Worker       virtual ~Delegate() = default;
433*6777b538SAndroid Build Coastguard Worker 
434*6777b538SAndroid Build Coastguard Worker       virtual void OnAddressResult(MdnsListenerUpdateType update_type,
435*6777b538SAndroid Build Coastguard Worker                                    DnsQueryType result_type,
436*6777b538SAndroid Build Coastguard Worker                                    IPEndPoint address) = 0;
437*6777b538SAndroid Build Coastguard Worker       virtual void OnTextResult(MdnsListenerUpdateType update_type,
438*6777b538SAndroid Build Coastguard Worker                                 DnsQueryType result_type,
439*6777b538SAndroid Build Coastguard Worker                                 std::vector<std::string> text_records) = 0;
440*6777b538SAndroid Build Coastguard Worker       virtual void OnHostnameResult(MdnsListenerUpdateType update_type,
441*6777b538SAndroid Build Coastguard Worker                                     DnsQueryType result_type,
442*6777b538SAndroid Build Coastguard Worker                                     HostPortPair host) = 0;
443*6777b538SAndroid Build Coastguard Worker 
444*6777b538SAndroid Build Coastguard Worker       // For results which may be valid MDNS but are not handled/parsed by
445*6777b538SAndroid Build Coastguard Worker       // HostResolver, e.g. pointers to the root domain.
446*6777b538SAndroid Build Coastguard Worker       virtual void OnUnhandledResult(MdnsListenerUpdateType update_type,
447*6777b538SAndroid Build Coastguard Worker                                      DnsQueryType result_type) = 0;
448*6777b538SAndroid Build Coastguard Worker     };
449*6777b538SAndroid Build Coastguard Worker 
450*6777b538SAndroid Build Coastguard Worker     // Destruction cancels the listening operation.
451*6777b538SAndroid Build Coastguard Worker     virtual ~MdnsListener() = default;
452*6777b538SAndroid Build Coastguard Worker 
453*6777b538SAndroid Build Coastguard Worker     // Begins the listening operation, invoking |delegate| whenever results are
454*6777b538SAndroid Build Coastguard Worker     // updated. |delegate| will no longer be called once the listening operation
455*6777b538SAndroid Build Coastguard Worker     // is cancelled (via destruction of |this|).
456*6777b538SAndroid Build Coastguard Worker     virtual int Start(Delegate* delegate) = 0;
457*6777b538SAndroid Build Coastguard Worker   };
458*6777b538SAndroid Build Coastguard Worker 
459*6777b538SAndroid Build Coastguard Worker   HostResolver(const HostResolver&) = delete;
460*6777b538SAndroid Build Coastguard Worker   HostResolver& operator=(const HostResolver&) = delete;
461*6777b538SAndroid Build Coastguard Worker 
462*6777b538SAndroid Build Coastguard Worker   // If any completion callbacks are pending when the resolver is destroyed,
463*6777b538SAndroid Build Coastguard Worker   // the host resolutions are cancelled, and the completion callbacks will not
464*6777b538SAndroid Build Coastguard Worker   // be called.
465*6777b538SAndroid Build Coastguard Worker   virtual ~HostResolver();
466*6777b538SAndroid Build Coastguard Worker 
467*6777b538SAndroid Build Coastguard Worker   // Cancels any pending requests without calling callbacks, same as
468*6777b538SAndroid Build Coastguard Worker   // destruction, except also leaves the resolver in a mostly-noop state. Any
469*6777b538SAndroid Build Coastguard Worker   // future request Start() calls (for requests created before or after
470*6777b538SAndroid Build Coastguard Worker   // OnShutdown()) will immediately fail with ERR_CONTEXT_SHUT_DOWN.
471*6777b538SAndroid Build Coastguard Worker   virtual void OnShutdown() = 0;
472*6777b538SAndroid Build Coastguard Worker 
473*6777b538SAndroid Build Coastguard Worker   // Creates a request to resolve the given hostname (or IP address literal).
474*6777b538SAndroid Build Coastguard Worker   // Profiling information for the request is saved to |net_log| if non-NULL.
475*6777b538SAndroid Build Coastguard Worker   //
476*6777b538SAndroid Build Coastguard Worker   // Additional parameters may be set using |optional_parameters|. Reasonable
477*6777b538SAndroid Build Coastguard Worker   // defaults will be used if passed |nullptr|.
478*6777b538SAndroid Build Coastguard Worker   virtual std::unique_ptr<ResolveHostRequest> CreateRequest(
479*6777b538SAndroid Build Coastguard Worker       url::SchemeHostPort host,
480*6777b538SAndroid Build Coastguard Worker       NetworkAnonymizationKey network_anonymization_key,
481*6777b538SAndroid Build Coastguard Worker       NetLogWithSource net_log,
482*6777b538SAndroid Build Coastguard Worker       std::optional<ResolveHostParameters> optional_parameters) = 0;
483*6777b538SAndroid Build Coastguard Worker 
484*6777b538SAndroid Build Coastguard Worker   // Create requests when scheme is unknown or non-standard.
485*6777b538SAndroid Build Coastguard Worker   // TODO(crbug.com/1206799): Rename to discourage use when scheme is known.
486*6777b538SAndroid Build Coastguard Worker   virtual std::unique_ptr<ResolveHostRequest> CreateRequest(
487*6777b538SAndroid Build Coastguard Worker       const HostPortPair& host,
488*6777b538SAndroid Build Coastguard Worker       const NetworkAnonymizationKey& network_anonymization_key,
489*6777b538SAndroid Build Coastguard Worker       const NetLogWithSource& net_log,
490*6777b538SAndroid Build Coastguard Worker       const std::optional<ResolveHostParameters>& optional_parameters) = 0;
491*6777b538SAndroid Build Coastguard Worker 
492*6777b538SAndroid Build Coastguard Worker   // Creates a service endpoint resolution request.
493*6777b538SAndroid Build Coastguard Worker   virtual std::unique_ptr<ServiceEndpointRequest> CreateServiceEndpointRequest(
494*6777b538SAndroid Build Coastguard Worker       Host host,
495*6777b538SAndroid Build Coastguard Worker       NetworkAnonymizationKey network_anonymization_key,
496*6777b538SAndroid Build Coastguard Worker       NetLogWithSource net_log,
497*6777b538SAndroid Build Coastguard Worker       ResolveHostParameters parameters) = 0;
498*6777b538SAndroid Build Coastguard Worker 
499*6777b538SAndroid Build Coastguard Worker   // Creates a request to probe configured DoH servers to find which can be used
500*6777b538SAndroid Build Coastguard Worker   // successfully.
501*6777b538SAndroid Build Coastguard Worker   virtual std::unique_ptr<ProbeRequest> CreateDohProbeRequest();
502*6777b538SAndroid Build Coastguard Worker 
503*6777b538SAndroid Build Coastguard Worker   // Create a listener to watch for updates to an MDNS result.
504*6777b538SAndroid Build Coastguard Worker   virtual std::unique_ptr<MdnsListener> CreateMdnsListener(
505*6777b538SAndroid Build Coastguard Worker       const HostPortPair& host,
506*6777b538SAndroid Build Coastguard Worker       DnsQueryType query_type);
507*6777b538SAndroid Build Coastguard Worker 
508*6777b538SAndroid Build Coastguard Worker   // Returns the HostResolverCache |this| uses, or NULL if there isn't one.
509*6777b538SAndroid Build Coastguard Worker   // Used primarily to clear the cache and for getting debug information.
510*6777b538SAndroid Build Coastguard Worker   virtual HostCache* GetHostCache();
511*6777b538SAndroid Build Coastguard Worker 
512*6777b538SAndroid Build Coastguard Worker   // Returns the current DNS configuration |this| is using, as a Value.
513*6777b538SAndroid Build Coastguard Worker   virtual base::Value::Dict GetDnsConfigAsValue() const;
514*6777b538SAndroid Build Coastguard Worker 
515*6777b538SAndroid Build Coastguard Worker   // Set the associated URLRequestContext, generally expected to be called by
516*6777b538SAndroid Build Coastguard Worker   // URLRequestContextBuilder on passing ownership of |this| to a context. May
517*6777b538SAndroid Build Coastguard Worker   // only be called once.
518*6777b538SAndroid Build Coastguard Worker   virtual void SetRequestContext(URLRequestContext* request_context);
519*6777b538SAndroid Build Coastguard Worker 
520*6777b538SAndroid Build Coastguard Worker   virtual HostResolverManager* GetManagerForTesting();
521*6777b538SAndroid Build Coastguard Worker   virtual const URLRequestContext* GetContextForTesting() const;
522*6777b538SAndroid Build Coastguard Worker   virtual handles::NetworkHandle GetTargetNetworkForTesting() const;
523*6777b538SAndroid Build Coastguard Worker 
524*6777b538SAndroid Build Coastguard Worker   // Creates a new HostResolver. |manager| must outlive the returned resolver.
525*6777b538SAndroid Build Coastguard Worker   //
526*6777b538SAndroid Build Coastguard Worker   // If |mapping_rules| is non-empty, the mapping rules will be applied to
527*6777b538SAndroid Build Coastguard Worker   // requests.  See MappedHostResolver for details.
528*6777b538SAndroid Build Coastguard Worker   static std::unique_ptr<HostResolver> CreateResolver(
529*6777b538SAndroid Build Coastguard Worker       HostResolverManager* manager,
530*6777b538SAndroid Build Coastguard Worker       std::string_view host_mapping_rules = "",
531*6777b538SAndroid Build Coastguard Worker       bool enable_caching = true);
532*6777b538SAndroid Build Coastguard Worker 
533*6777b538SAndroid Build Coastguard Worker   // Creates a HostResolver independent of any global HostResolverManager. Only
534*6777b538SAndroid Build Coastguard Worker   // for tests and standalone tools not part of the browser.
535*6777b538SAndroid Build Coastguard Worker   //
536*6777b538SAndroid Build Coastguard Worker   // If |mapping_rules| is non-empty, the mapping rules will be applied to
537*6777b538SAndroid Build Coastguard Worker   // requests.  See MappedHostResolver for details.
538*6777b538SAndroid Build Coastguard Worker   static std::unique_ptr<HostResolver> CreateStandaloneResolver(
539*6777b538SAndroid Build Coastguard Worker       NetLog* net_log,
540*6777b538SAndroid Build Coastguard Worker       std::optional<ManagerOptions> options = std::nullopt,
541*6777b538SAndroid Build Coastguard Worker       std::string_view host_mapping_rules = "",
542*6777b538SAndroid Build Coastguard Worker       bool enable_caching = true);
543*6777b538SAndroid Build Coastguard Worker   // Same, but explicitly returns the implementing ContextHostResolver. Only
544*6777b538SAndroid Build Coastguard Worker   // used by tests and by StaleHostResolver in Cronet. No mapping rules can be
545*6777b538SAndroid Build Coastguard Worker   // applied because doing so requires wrapping the ContextHostResolver.
546*6777b538SAndroid Build Coastguard Worker   static std::unique_ptr<ContextHostResolver> CreateStandaloneContextResolver(
547*6777b538SAndroid Build Coastguard Worker       NetLog* net_log,
548*6777b538SAndroid Build Coastguard Worker       std::optional<ManagerOptions> options = std::nullopt,
549*6777b538SAndroid Build Coastguard Worker       bool enable_caching = true);
550*6777b538SAndroid Build Coastguard Worker   // Same, but bind the resolver to `target_network`: all lookups will be
551*6777b538SAndroid Build Coastguard Worker   // performed exclusively for `target_network`, lookups will fail if
552*6777b538SAndroid Build Coastguard Worker   // `target_network` disconnects. This can only be used by network-bound
553*6777b538SAndroid Build Coastguard Worker   // URLRequestContexts.
554*6777b538SAndroid Build Coastguard Worker   // Due to the current implementation, if `options` is specified, its
555*6777b538SAndroid Build Coastguard Worker   // DnsConfigOverrides parameter must be empty.
556*6777b538SAndroid Build Coastguard Worker   // Only implemented for Android starting from Marshmallow.
557*6777b538SAndroid Build Coastguard Worker   static std::unique_ptr<HostResolver> CreateStandaloneNetworkBoundResolver(
558*6777b538SAndroid Build Coastguard Worker       NetLog* net_log,
559*6777b538SAndroid Build Coastguard Worker       handles::NetworkHandle network,
560*6777b538SAndroid Build Coastguard Worker       std::optional<ManagerOptions> options = std::nullopt,
561*6777b538SAndroid Build Coastguard Worker       std::string_view host_mapping_rules = "",
562*6777b538SAndroid Build Coastguard Worker       bool enable_caching = true);
563*6777b538SAndroid Build Coastguard Worker 
564*6777b538SAndroid Build Coastguard Worker   // Helpers for interacting with HostCache and ProcResolver.
565*6777b538SAndroid Build Coastguard Worker   static AddressFamily DnsQueryTypeSetToAddressFamily(
566*6777b538SAndroid Build Coastguard Worker       DnsQueryTypeSet query_types);
567*6777b538SAndroid Build Coastguard Worker   static HostResolverFlags ParametersToHostResolverFlags(
568*6777b538SAndroid Build Coastguard Worker       const ResolveHostParameters& parameters);
569*6777b538SAndroid Build Coastguard Worker 
570*6777b538SAndroid Build Coastguard Worker   // Helper for squashing error code to a small set of DNS error codes.
571*6777b538SAndroid Build Coastguard Worker   static int SquashErrorCode(int error);
572*6777b538SAndroid Build Coastguard Worker 
573*6777b538SAndroid Build Coastguard Worker   // Builds an AddressList from the first non-protocol endpoint found in
574*6777b538SAndroid Build Coastguard Worker   // `endpoints`.
575*6777b538SAndroid Build Coastguard Worker   //
576*6777b538SAndroid Build Coastguard Worker   // TODO(crbug.com/1264933): Delete once `AddressList` usage is fully replaced
577*6777b538SAndroid Build Coastguard Worker   // in `HostResolver` and results.
578*6777b538SAndroid Build Coastguard Worker   static AddressList EndpointResultToAddressList(
579*6777b538SAndroid Build Coastguard Worker       base::span<const HostResolverEndpointResult> endpoints,
580*6777b538SAndroid Build Coastguard Worker       const std::set<std::string>& aliases);
581*6777b538SAndroid Build Coastguard Worker 
582*6777b538SAndroid Build Coastguard Worker   // Returns whether there is at least one protocol endpoint in `endpoints`, and
583*6777b538SAndroid Build Coastguard Worker   // all such endpoints have ECH parameters. This can be used to implement the
584*6777b538SAndroid Build Coastguard Worker   // guidance in section 10.1 of draft-ietf-dnsop-svcb-https-11.
585*6777b538SAndroid Build Coastguard Worker   static bool AllProtocolEndpointsHaveEch(
586*6777b538SAndroid Build Coastguard Worker       base::span<const HostResolverEndpointResult> endpoints);
587*6777b538SAndroid Build Coastguard Worker 
588*6777b538SAndroid Build Coastguard Worker   // Returns true if NAT64 can be used in place of an IPv4 address during host
589*6777b538SAndroid Build Coastguard Worker   // resolution.
590*6777b538SAndroid Build Coastguard Worker   static bool MayUseNAT64ForIPv4Literal(HostResolverFlags flags,
591*6777b538SAndroid Build Coastguard Worker                                         HostResolverSource source,
592*6777b538SAndroid Build Coastguard Worker                                         const IPAddress& ip_address);
593*6777b538SAndroid Build Coastguard Worker 
594*6777b538SAndroid Build Coastguard Worker  protected:
595*6777b538SAndroid Build Coastguard Worker   HostResolver();
596*6777b538SAndroid Build Coastguard Worker 
597*6777b538SAndroid Build Coastguard Worker   // Utility to create a request implementation that always fails with |error|
598*6777b538SAndroid Build Coastguard Worker   // immediately on start.
599*6777b538SAndroid Build Coastguard Worker   static std::unique_ptr<ResolveHostRequest> CreateFailingRequest(int error);
600*6777b538SAndroid Build Coastguard Worker   static std::unique_ptr<ProbeRequest> CreateFailingProbeRequest(int error);
601*6777b538SAndroid Build Coastguard Worker };
602*6777b538SAndroid Build Coastguard Worker 
603*6777b538SAndroid Build Coastguard Worker }  // namespace net
604*6777b538SAndroid Build Coastguard Worker 
605*6777b538SAndroid Build Coastguard Worker #endif  // NET_DNS_HOST_RESOLVER_H_
606