1*6777b538SAndroid Build Coastguard Worker // Copyright 2019 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef NET_DNS_CONTEXT_HOST_RESOLVER_H_ 6*6777b538SAndroid Build Coastguard Worker #define NET_DNS_CONTEXT_HOST_RESOLVER_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <memory> 9*6777b538SAndroid Build Coastguard Worker #include <optional> 10*6777b538SAndroid Build Coastguard Worker #include <unordered_set> 11*6777b538SAndroid Build Coastguard Worker #include <vector> 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h" 14*6777b538SAndroid Build Coastguard Worker #include "base/sequence_checker.h" 15*6777b538SAndroid Build Coastguard Worker #include "base/values.h" 16*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h" 17*6777b538SAndroid Build Coastguard Worker #include "net/base/network_handle.h" 18*6777b538SAndroid Build Coastguard Worker #include "net/base/network_isolation_key.h" 19*6777b538SAndroid Build Coastguard Worker #include "net/dns/host_resolver.h" 20*6777b538SAndroid Build Coastguard Worker #include "net/dns/host_resolver_system_task.h" 21*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log_with_source.h" 22*6777b538SAndroid Build Coastguard Worker #include "url/scheme_host_port.h" 23*6777b538SAndroid Build Coastguard Worker 24*6777b538SAndroid Build Coastguard Worker namespace base { 25*6777b538SAndroid Build Coastguard Worker class TickClock; 26*6777b538SAndroid Build Coastguard Worker } // namespace base 27*6777b538SAndroid Build Coastguard Worker 28*6777b538SAndroid Build Coastguard Worker namespace net { 29*6777b538SAndroid Build Coastguard Worker 30*6777b538SAndroid Build Coastguard Worker class HostCache; 31*6777b538SAndroid Build Coastguard Worker class HostResolverManager; 32*6777b538SAndroid Build Coastguard Worker class ResolveContext; 33*6777b538SAndroid Build Coastguard Worker class URLRequestContext; 34*6777b538SAndroid Build Coastguard Worker 35*6777b538SAndroid Build Coastguard Worker // Wrapper for HostResolverManager, expected to be owned by a URLRequestContext, 36*6777b538SAndroid Build Coastguard Worker // that sets per-URLRequestContext parameters for created requests. Except for 37*6777b538SAndroid Build Coastguard Worker // tests, typically only interacted with through the HostResolver interface. 38*6777b538SAndroid Build Coastguard Worker // 39*6777b538SAndroid Build Coastguard Worker // See HostResolver::Create[...]() methods for construction. 40*6777b538SAndroid Build Coastguard Worker class NET_EXPORT ContextHostResolver : public HostResolver { 41*6777b538SAndroid Build Coastguard Worker public: 42*6777b538SAndroid Build Coastguard Worker // Creates a ContextHostResolver that forwards all of its requests through 43*6777b538SAndroid Build Coastguard Worker // |manager|. Requests will be cached using |host_cache| if not null. 44*6777b538SAndroid Build Coastguard Worker ContextHostResolver(HostResolverManager* manager, 45*6777b538SAndroid Build Coastguard Worker std::unique_ptr<ResolveContext> resolve_context); 46*6777b538SAndroid Build Coastguard Worker // Same except the created resolver will own its own HostResolverManager. 47*6777b538SAndroid Build Coastguard Worker ContextHostResolver(std::unique_ptr<HostResolverManager> owned_manager, 48*6777b538SAndroid Build Coastguard Worker std::unique_ptr<ResolveContext> resolve_context); 49*6777b538SAndroid Build Coastguard Worker 50*6777b538SAndroid Build Coastguard Worker ContextHostResolver(const ContextHostResolver&) = delete; 51*6777b538SAndroid Build Coastguard Worker ContextHostResolver& operator=(const ContextHostResolver&) = delete; 52*6777b538SAndroid Build Coastguard Worker 53*6777b538SAndroid Build Coastguard Worker ~ContextHostResolver() override; 54*6777b538SAndroid Build Coastguard Worker 55*6777b538SAndroid Build Coastguard Worker // HostResolver methods: 56*6777b538SAndroid Build Coastguard Worker void OnShutdown() override; 57*6777b538SAndroid Build Coastguard Worker std::unique_ptr<ResolveHostRequest> CreateRequest( 58*6777b538SAndroid Build Coastguard Worker url::SchemeHostPort host, 59*6777b538SAndroid Build Coastguard Worker NetworkAnonymizationKey network_anonymization_key, 60*6777b538SAndroid Build Coastguard Worker NetLogWithSource net_log, 61*6777b538SAndroid Build Coastguard Worker std::optional<ResolveHostParameters> optional_parameters) override; 62*6777b538SAndroid Build Coastguard Worker std::unique_ptr<ResolveHostRequest> CreateRequest( 63*6777b538SAndroid Build Coastguard Worker const HostPortPair& host, 64*6777b538SAndroid Build Coastguard Worker const NetworkAnonymizationKey& network_anonymization_key, 65*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& net_log, 66*6777b538SAndroid Build Coastguard Worker const std::optional<ResolveHostParameters>& optional_parameters) override; 67*6777b538SAndroid Build Coastguard Worker std::unique_ptr<ServiceEndpointRequest> CreateServiceEndpointRequest( 68*6777b538SAndroid Build Coastguard Worker Host host, 69*6777b538SAndroid Build Coastguard Worker NetworkAnonymizationKey network_anonymization_key, 70*6777b538SAndroid Build Coastguard Worker NetLogWithSource net_log, 71*6777b538SAndroid Build Coastguard Worker ResolveHostParameters parameters) override; 72*6777b538SAndroid Build Coastguard Worker std::unique_ptr<ProbeRequest> CreateDohProbeRequest() override; 73*6777b538SAndroid Build Coastguard Worker std::unique_ptr<MdnsListener> CreateMdnsListener( 74*6777b538SAndroid Build Coastguard Worker const HostPortPair& host, 75*6777b538SAndroid Build Coastguard Worker DnsQueryType query_type) override; 76*6777b538SAndroid Build Coastguard Worker HostCache* GetHostCache() override; 77*6777b538SAndroid Build Coastguard Worker base::Value::Dict GetDnsConfigAsValue() const override; 78*6777b538SAndroid Build Coastguard Worker void SetRequestContext(URLRequestContext* request_context) override; 79*6777b538SAndroid Build Coastguard Worker HostResolverManager* GetManagerForTesting() override; 80*6777b538SAndroid Build Coastguard Worker const URLRequestContext* GetContextForTesting() const override; 81*6777b538SAndroid Build Coastguard Worker handles::NetworkHandle GetTargetNetworkForTesting() const override; 82*6777b538SAndroid Build Coastguard Worker 83*6777b538SAndroid Build Coastguard Worker // Returns the number of host cache entries that were restored, or 0 if there 84*6777b538SAndroid Build Coastguard Worker // is no cache. 85*6777b538SAndroid Build Coastguard Worker size_t LastRestoredCacheSize() const; 86*6777b538SAndroid Build Coastguard Worker // Returns the number of entries in the host cache, or 0 if there is no cache. 87*6777b538SAndroid Build Coastguard Worker size_t CacheSize() const; 88*6777b538SAndroid Build Coastguard Worker 89*6777b538SAndroid Build Coastguard Worker void SetHostResolverSystemParamsForTest( 90*6777b538SAndroid Build Coastguard Worker const HostResolverSystemTask::Params& host_resolver_system_params); 91*6777b538SAndroid Build Coastguard Worker void SetTickClockForTesting(const base::TickClock* tick_clock); resolve_context_for_testing()92*6777b538SAndroid Build Coastguard Worker ResolveContext* resolve_context_for_testing() { 93*6777b538SAndroid Build Coastguard Worker return resolve_context_.get(); 94*6777b538SAndroid Build Coastguard Worker } 95*6777b538SAndroid Build Coastguard Worker 96*6777b538SAndroid Build Coastguard Worker private: 97*6777b538SAndroid Build Coastguard Worker std::unique_ptr<HostResolverManager> owned_manager_; 98*6777b538SAndroid Build Coastguard Worker // `manager_` might point to `owned_manager_`. It must be declared last and 99*6777b538SAndroid Build Coastguard Worker // cleared first. 100*6777b538SAndroid Build Coastguard Worker const raw_ptr<HostResolverManager> manager_; 101*6777b538SAndroid Build Coastguard Worker std::unique_ptr<ResolveContext> resolve_context_; 102*6777b538SAndroid Build Coastguard Worker 103*6777b538SAndroid Build Coastguard Worker // If true, the context is shutting down. Subsequent request Start() calls 104*6777b538SAndroid Build Coastguard Worker // will always fail immediately with ERR_CONTEXT_SHUT_DOWN. 105*6777b538SAndroid Build Coastguard Worker bool shutting_down_ = false; 106*6777b538SAndroid Build Coastguard Worker 107*6777b538SAndroid Build Coastguard Worker SEQUENCE_CHECKER(sequence_checker_); 108*6777b538SAndroid Build Coastguard Worker }; 109*6777b538SAndroid Build Coastguard Worker 110*6777b538SAndroid Build Coastguard Worker } // namespace net 111*6777b538SAndroid Build Coastguard Worker 112*6777b538SAndroid Build Coastguard Worker #endif // NET_DNS_CONTEXT_HOST_RESOLVER_H_ 113