// Copyright 2019 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef NET_DNS_CONTEXT_HOST_RESOLVER_H_ #define NET_DNS_CONTEXT_HOST_RESOLVER_H_ #include #include #include #include #include "base/memory/raw_ptr.h" #include "base/sequence_checker.h" #include "base/values.h" #include "net/base/net_export.h" #include "net/base/network_handle.h" #include "net/base/network_isolation_key.h" #include "net/dns/host_resolver.h" #include "net/dns/host_resolver_system_task.h" #include "net/log/net_log_with_source.h" #include "url/scheme_host_port.h" namespace base { class TickClock; } // namespace base namespace net { class HostCache; class HostResolverManager; class ResolveContext; class URLRequestContext; // Wrapper for HostResolverManager, expected to be owned by a URLRequestContext, // that sets per-URLRequestContext parameters for created requests. Except for // tests, typically only interacted with through the HostResolver interface. // // See HostResolver::Create[...]() methods for construction. class NET_EXPORT ContextHostResolver : public HostResolver { public: // Creates a ContextHostResolver that forwards all of its requests through // |manager|. Requests will be cached using |host_cache| if not null. ContextHostResolver(HostResolverManager* manager, std::unique_ptr resolve_context); // Same except the created resolver will own its own HostResolverManager. ContextHostResolver(std::unique_ptr owned_manager, std::unique_ptr resolve_context); ContextHostResolver(const ContextHostResolver&) = delete; ContextHostResolver& operator=(const ContextHostResolver&) = delete; ~ContextHostResolver() override; // HostResolver methods: void OnShutdown() override; std::unique_ptr CreateRequest( url::SchemeHostPort host, NetworkAnonymizationKey network_anonymization_key, NetLogWithSource net_log, std::optional optional_parameters) override; std::unique_ptr CreateRequest( const HostPortPair& host, const NetworkAnonymizationKey& network_anonymization_key, const NetLogWithSource& net_log, const std::optional& optional_parameters) override; std::unique_ptr CreateServiceEndpointRequest( Host host, NetworkAnonymizationKey network_anonymization_key, NetLogWithSource net_log, ResolveHostParameters parameters) override; std::unique_ptr CreateDohProbeRequest() override; std::unique_ptr CreateMdnsListener( const HostPortPair& host, DnsQueryType query_type) override; HostCache* GetHostCache() override; base::Value::Dict GetDnsConfigAsValue() const override; void SetRequestContext(URLRequestContext* request_context) override; HostResolverManager* GetManagerForTesting() override; const URLRequestContext* GetContextForTesting() const override; handles::NetworkHandle GetTargetNetworkForTesting() const override; // Returns the number of host cache entries that were restored, or 0 if there // is no cache. size_t LastRestoredCacheSize() const; // Returns the number of entries in the host cache, or 0 if there is no cache. size_t CacheSize() const; void SetHostResolverSystemParamsForTest( const HostResolverSystemTask::Params& host_resolver_system_params); void SetTickClockForTesting(const base::TickClock* tick_clock); ResolveContext* resolve_context_for_testing() { return resolve_context_.get(); } private: std::unique_ptr owned_manager_; // `manager_` might point to `owned_manager_`. It must be declared last and // cleared first. const raw_ptr manager_; std::unique_ptr resolve_context_; // If true, the context is shutting down. Subsequent request Start() calls // will always fail immediately with ERR_CONTEXT_SHUT_DOWN. bool shutting_down_ = false; SEQUENCE_CHECKER(sequence_checker_); }; } // namespace net #endif // NET_DNS_CONTEXT_HOST_RESOLVER_H_