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