xref: /aosp_15_r20/external/cronet/net/dns/host_resolver_manager_request_impl.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2024 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_HOST_RESOLVER_MANAGER_REQUEST_IMPL_H_
6 #define NET_DNS_HOST_RESOLVER_MANAGER_REQUEST_IMPL_H_
7 
8 #include <deque>
9 #include <optional>
10 #include <set>
11 #include <string>
12 #include <vector>
13 
14 #include "base/containers/linked_list.h"
15 #include "base/memory/raw_ptr.h"
16 #include "base/memory/safe_ref.h"
17 #include "base/memory/weak_ptr.h"
18 #include "base/sequence_checker.h"
19 #include "base/time/tick_clock.h"
20 #include "net/base/address_list.h"
21 #include "net/base/completion_once_callback.h"
22 #include "net/base/network_anonymization_key.h"
23 #include "net/base/request_priority.h"
24 #include "net/dns/host_cache.h"
25 #include "net/dns/host_resolver.h"
26 #include "net/dns/host_resolver_manager.h"
27 #include "net/dns/host_resolver_manager_job.h"
28 #include "net/dns/public/host_resolver_results.h"
29 #include "net/dns/public/resolve_error_info.h"
30 #include "net/log/net_log_with_source.h"
31 
32 namespace net {
33 
34 class ClientSocketFactory;
35 class ResolveContext;
36 
37 // Holds the callback and request parameters for an outstanding request.
38 //
39 // The RequestImpl is owned by the end user of host resolution. Deletion prior
40 // to the request having completed means the request was cancelled by the
41 // caller.
42 //
43 // Both the RequestImpl and its associated Job hold non-owning pointers to each
44 // other. Care must be taken to clear the corresponding pointer when
45 // cancellation is initiated by the Job (OnJobCancelled) vs by the end user
46 // (~RequestImpl).
47 class HostResolverManager::RequestImpl
48     : public HostResolver::ResolveHostRequest,
49       public base::LinkNode<HostResolverManager::RequestImpl> {
50  public:
51   RequestImpl(NetLogWithSource source_net_log,
52               HostResolver::Host request_host,
53               NetworkAnonymizationKey network_anonymization_key,
54               std::optional<ResolveHostParameters> optional_parameters,
55               base::WeakPtr<ResolveContext> resolve_context,
56               base::WeakPtr<HostResolverManager> resolver,
57               const base::TickClock* tick_clock);
58 
59   RequestImpl(const RequestImpl&) = delete;
60   RequestImpl& operator=(const RequestImpl&) = delete;
61 
62   ~RequestImpl() override;
63 
64   // HostResolver::ResolveHostRequest implementations:
65   int Start(CompletionOnceCallback callback) override;
66   const AddressList* GetAddressResults() const override;
67   const std::vector<HostResolverEndpointResult>* GetEndpointResults()
68       const override;
69   const std::vector<std::string>* GetTextResults() const override;
70   const std::vector<HostPortPair>* GetHostnameResults() const override;
71   const std::set<std::string>* GetDnsAliasResults() const override;
72   const std::vector<bool>* GetExperimentalResultsForTesting() const override;
73   net::ResolveErrorInfo GetResolveErrorInfo() const override;
74   const std::optional<HostCache::EntryStaleness>& GetStaleInfo() const override;
75   void ChangeRequestPriority(RequestPriority priority) override;
76 
77   void set_results(HostCache::Entry results);
78   void set_error_info(int error, bool is_secure_network_error);
79   void set_stale_info(HostCache::EntryStaleness stale_info);
80 
81   void AssignJob(base::SafeRef<Job> job);
82 
HasJob()83   bool HasJob() const { return job_.has_value(); }
84 
85   // Gets the Job's key. Crashes if no Job has been assigned.
86   const JobKey& GetJobKey() const;
87 
88   // Unassigns the Job without calling completion callback.
89   void OnJobCancelled(const JobKey& key);
90 
91   // Cleans up Job assignment, marks request completed, and calls the completion
92   // callback. |is_secure_network_error| indicates whether |error| came from a
93   // secure DNS lookup.
94   void OnJobCompleted(const JobKey& job_key,
95                       int error,
96                       bool is_secure_network_error);
97 
98   // NetLog for the source, passed in HostResolver::Resolve.
source_net_log()99   const NetLogWithSource& source_net_log() { return source_net_log_; }
100 
request_host()101   const HostResolver::Host& request_host() const { return request_host_; }
102 
network_anonymization_key()103   const NetworkAnonymizationKey& network_anonymization_key() const {
104     return network_anonymization_key_;
105   }
106 
parameters()107   const ResolveHostParameters& parameters() const { return parameters_; }
108 
resolve_context()109   ResolveContext* resolve_context() const { return resolve_context_.get(); }
110 
host_cache()111   HostCache* host_cache() const {
112     return resolve_context_ ? resolve_context_->host_cache() : nullptr;
113   }
114 
priority()115   RequestPriority priority() const { return priority_; }
set_priority(RequestPriority priority)116   void set_priority(RequestPriority priority) { priority_ = priority; }
117 
118  private:
119   enum ResolveState {
120     STATE_IPV6_REACHABILITY,
121     STATE_GET_PARAMETERS,
122     STATE_GET_PARAMETERS_COMPLETE,
123     STATE_RESOLVE_LOCALLY,
124     STATE_START_JOB,
125     STATE_FINISH_REQUEST,
126     STATE_NONE,
127   };
128 
129   int DoLoop(int rv);
130   void OnIOComplete(int rv);
131   int DoIPv6Reachability();
132   int DoGetParameters();
133   int DoGetParametersComplete(int rv);
134   int DoResolveLocally();
135   int DoStartJob();
136   int DoFinishRequest(int rv);
137 
138   void FixUpEndpointAndAliasResults();
139 
140   // Logging and metrics for when a request has just been started.
141   void LogStartRequest();
142 
143   // Logging and metrics for when a request has just completed (before its
144   // callback is run).
145   void LogFinishRequest(int net_error, bool async_completion);
146 
147   // Logs when a request has been cancelled.
148   void LogCancelRequest();
149 
150   ClientSocketFactory* GetClientSocketFactory();
151 
152   const NetLogWithSource source_net_log_;
153 
154   const HostResolver::Host request_host_;
155   const NetworkAnonymizationKey network_anonymization_key_;
156   ResolveHostParameters parameters_;
157   base::WeakPtr<ResolveContext> resolve_context_;
158 
159   RequestPriority priority_;
160 
161   ResolveState next_state_;
162   JobKey job_key_;
163   IPAddress ip_address_;
164 
165   std::deque<TaskType> tasks_;
166   // The resolve job that this request is dependent on.
167   std::optional<base::SafeRef<Job>> job_;
168   base::WeakPtr<HostResolverManager> resolver_ = nullptr;
169 
170   // The user's callback to invoke when the request completes.
171   CompletionOnceCallback callback_;
172 
173   bool complete_ = false;
174   bool only_ipv6_reachable_ = false;
175   std::optional<HostCache::Entry> results_;
176   std::optional<HostCache::EntryStaleness> stale_info_;
177   std::optional<AddressList> legacy_address_results_;
178   std::optional<std::vector<HostResolverEndpointResult>> endpoint_results_;
179   std::optional<std::set<std::string>> fixed_up_dns_alias_results_;
180   ResolveErrorInfo error_info_;
181 
182   const raw_ptr<const base::TickClock> tick_clock_;
183   base::TimeTicks request_time_;
184 
185   SEQUENCE_CHECKER(sequence_checker_);
186 
187   base::WeakPtrFactory<RequestImpl> weak_ptr_factory_{this};
188 };
189 
190 }  // namespace net
191 
192 #endif  // NET_DNS_HOST_RESOLVER_MANAGER_REQUEST_IMPL_H_
193