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