• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <unordered_set>
10 #include <vector>
11 
12 #include "base/memory/raw_ptr.h"
13 #include "base/sequence_checker.h"
14 #include "base/values.h"
15 #include "net/base/net_export.h"
16 #include "net/base/network_handle.h"
17 #include "net/base/network_isolation_key.h"
18 #include "net/dns/host_resolver.h"
19 #include "net/dns/host_resolver_system_task.h"
20 #include "net/log/net_log_with_source.h"
21 #include "third_party/abseil-cpp/absl/types/optional.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       absl::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 absl::optional<ResolveHostParameters>& optional_parameters)
67       override;
68   std::unique_ptr<ProbeRequest> CreateDohProbeRequest() override;
69   std::unique_ptr<MdnsListener> CreateMdnsListener(
70       const HostPortPair& host,
71       DnsQueryType query_type) override;
72   HostCache* GetHostCache() override;
73   base::Value::Dict GetDnsConfigAsValue() const override;
74   void SetRequestContext(URLRequestContext* request_context) override;
75   HostResolverManager* GetManagerForTesting() override;
76   const URLRequestContext* GetContextForTesting() const override;
77   handles::NetworkHandle GetTargetNetworkForTesting() const override;
78 
79   // Returns the number of host cache entries that were restored, or 0 if there
80   // is no cache.
81   size_t LastRestoredCacheSize() const;
82   // Returns the number of entries in the host cache, or 0 if there is no cache.
83   size_t CacheSize() const;
84 
85   void SetHostResolverSystemParamsForTest(
86       const HostResolverSystemTask::Params& host_resolver_system_params);
87   void SetTickClockForTesting(const base::TickClock* tick_clock);
resolve_context_for_testing()88   ResolveContext* resolve_context_for_testing() {
89     return resolve_context_.get();
90   }
91 
92  private:
93   std::unique_ptr<HostResolverManager> owned_manager_;
94   // `manager_` might point to `owned_manager_`. It must be declared last and
95   // cleared first.
96   const raw_ptr<HostResolverManager> manager_;
97   std::unique_ptr<ResolveContext> resolve_context_;
98 
99   // If true, the context is shutting down. Subsequent request Start() calls
100   // will always fail immediately with ERR_CONTEXT_SHUT_DOWN.
101   bool shutting_down_ = false;
102 
103   SEQUENCE_CHECKER(sequence_checker_);
104 };
105 
106 }  // namespace net
107 
108 #endif  // NET_DNS_CONTEXT_HOST_RESOLVER_H_
109