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