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