xref: /aosp_15_r20/external/cronet/net/dns/context_host_resolver.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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