OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef NET_DNS_HOST_RESOLVER_IMPL_H_ | 5 #ifndef NET_DNS_HOST_RESOLVER_IMPL_H_ |
6 #define NET_DNS_HOST_RESOLVER_IMPL_H_ | 6 #define NET_DNS_HOST_RESOLVER_IMPL_H_ |
7 | 7 |
8 #include <stddef.h> | 8 #include <stddef.h> |
9 #include <stdint.h> | 9 #include <stdint.h> |
10 | 10 |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
96 size_t max_retry_attempts; | 96 size_t max_retry_attempts; |
97 | 97 |
98 // This is the limit after which we make another attempt to resolve the host | 98 // This is the limit after which we make another attempt to resolve the host |
99 // if the worker thread has not responded yet. | 99 // if the worker thread has not responded yet. |
100 base::TimeDelta unresponsive_delay; | 100 base::TimeDelta unresponsive_delay; |
101 | 101 |
102 // Factor to grow |unresponsive_delay| when we re-re-try. | 102 // Factor to grow |unresponsive_delay| when we re-re-try. |
103 uint32_t retry_factor; | 103 uint32_t retry_factor; |
104 }; | 104 }; |
105 | 105 |
106 // Creates a HostResolver as specified by |options|. | 106 // Creates a HostResolver as specified by |options|. Blocking tasks are run on |
| 107 // the WorkerPool. |
107 // | 108 // |
108 // If Options.enable_caching is true, a cache is created using | 109 // If Options.enable_caching is true, a cache is created using |
109 // HostCache::CreateDefaultCache(). Otherwise no cache is used. | 110 // HostCache::CreateDefaultCache(). Otherwise no cache is used. |
110 // | 111 // |
111 // Options.GetDispatcherLimits() determines the maximum number of jobs that | 112 // Options.GetDispatcherLimits() determines the maximum number of jobs that |
112 // the resolver will run at once. This upper-bounds the total number of | 113 // the resolver will run at once. This upper-bounds the total number of |
113 // outstanding DNS transactions (not counting retransmissions and retries). | 114 // outstanding DNS transactions (not counting retransmissions and retries). |
114 // | 115 // |
115 // |net_log| must remain valid for the life of the HostResolverImpl. | 116 // |net_log| must remain valid for the life of the HostResolverImpl. |
116 HostResolverImpl(const Options& options, NetLog* net_log); | 117 HostResolverImpl(const Options& options, NetLog* net_log); |
(...skipping 27 matching lines...) Expand all Loading... |
144 RequestPriority priority) override; | 145 RequestPriority priority) override; |
145 void CancelRequest(RequestHandle req) override; | 146 void CancelRequest(RequestHandle req) override; |
146 void SetDnsClientEnabled(bool enabled) override; | 147 void SetDnsClientEnabled(bool enabled) override; |
147 HostCache* GetHostCache() override; | 148 HostCache* GetHostCache() override; |
148 std::unique_ptr<base::Value> GetDnsConfigAsValue() const override; | 149 std::unique_ptr<base::Value> GetDnsConfigAsValue() const override; |
149 | 150 |
150 void set_proc_params_for_test(const ProcTaskParams& proc_params) { | 151 void set_proc_params_for_test(const ProcTaskParams& proc_params) { |
151 proc_params_ = proc_params; | 152 proc_params_ = proc_params; |
152 } | 153 } |
153 | 154 |
| 155 protected: |
| 156 // Just like the public constructor, but allows the task runner used for |
| 157 // blocking tasks to be specified. Intended for testing only. |
| 158 HostResolverImpl(const Options& options, |
| 159 NetLog* net_log, |
| 160 scoped_refptr<base::TaskRunner> worker_task_runner); |
| 161 |
| 162 // Callback from HaveOnlyLoopbackAddresses probe. |
| 163 void SetHaveOnlyLoopbackAddresses(bool result); |
| 164 |
154 private: | 165 private: |
155 friend class HostResolverImplTest; | 166 friend class HostResolverImplTest; |
156 class Job; | 167 class Job; |
157 class ProcTask; | 168 class ProcTask; |
158 class LoopbackProbeJob; | 169 class LoopbackProbeJob; |
159 class DnsTask; | 170 class DnsTask; |
160 class Request; | 171 class Request; |
161 typedef HostCache::Key Key; | 172 typedef HostCache::Key Key; |
162 typedef std::map<Key, Job*> JobMap; | 173 typedef std::map<Key, Job*> JobMap; |
163 | 174 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
197 bool ServeFromHosts(const Key& key, | 208 bool ServeFromHosts(const Key& key, |
198 const RequestInfo& info, | 209 const RequestInfo& info, |
199 AddressList* addresses); | 210 AddressList* addresses); |
200 | 211 |
201 // If |key| is for a localhost name (RFC 6761), returns true and fills | 212 // If |key| is for a localhost name (RFC 6761), returns true and fills |
202 // |addresses| with the loopback IP. Otherwise returns false. | 213 // |addresses| with the loopback IP. Otherwise returns false. |
203 bool ServeLocalhost(const Key& key, | 214 bool ServeLocalhost(const Key& key, |
204 const RequestInfo& info, | 215 const RequestInfo& info, |
205 AddressList* addresses); | 216 AddressList* addresses); |
206 | 217 |
207 // Callback from HaveOnlyLoopbackAddresses probe. | |
208 void SetHaveOnlyLoopbackAddresses(bool result); | |
209 | |
210 // Returns the (hostname, address_family) key to use for |info|, choosing an | 218 // Returns the (hostname, address_family) key to use for |info|, choosing an |
211 // "effective" address family by inheriting the resolver's default address | 219 // "effective" address family by inheriting the resolver's default address |
212 // family when the request leaves it unspecified. | 220 // family when the request leaves it unspecified. |
213 Key GetEffectiveKeyForRequest(const RequestInfo& info, | 221 Key GetEffectiveKeyForRequest(const RequestInfo& info, |
214 const IPAddress* ip_address, | 222 const IPAddress* ip_address, |
215 const BoundNetLog& net_log); | 223 const BoundNetLog& net_log); |
216 | 224 |
217 // Probes IPv6 support and returns true if IPv6 support is enabled. | 225 // Probes IPv6 support and returns true if IPv6 support is enabled. |
218 // Results are cached, i.e. when called repeatedly this method returns result | 226 // Results are cached, i.e. when called repeatedly this method returns result |
219 // from the first probe for some time before probing again. | 227 // from the first probe for some time before probing again. |
220 virtual bool IsIPv6Reachable(const BoundNetLog& net_log); | 228 virtual bool IsIPv6Reachable(const BoundNetLog& net_log); |
221 | 229 |
| 230 // Asynchronously checks if only loopback IPs are available. |
| 231 virtual void RunLoopbackProbeJob(); |
| 232 |
222 // Records the result in cache if cache is present. | 233 // Records the result in cache if cache is present. |
223 void CacheResult(const Key& key, | 234 void CacheResult(const Key& key, |
224 const HostCache::Entry& entry, | 235 const HostCache::Entry& entry, |
225 base::TimeDelta ttl); | 236 base::TimeDelta ttl); |
226 | 237 |
227 // Removes |job| from |jobs_|, only if it exists. | 238 // Removes |job| from |jobs_|, only if it exists. |
228 void RemoveJob(Job* job); | 239 void RemoveJob(Job* job); |
229 | 240 |
230 // Aborts all in progress jobs with ERR_NETWORK_CHANGED and notifies their | 241 // Aborts all in progress jobs with ERR_NETWORK_CHANGED and notifies their |
231 // requests. Might start new jobs. | 242 // requests. Might start new jobs. |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
304 // True iff ProcTask has successfully resolved a hostname known to have IPv6 | 315 // True iff ProcTask has successfully resolved a hostname known to have IPv6 |
305 // addresses using ADDRESS_FAMILY_UNSPECIFIED. Reset on IP address change. | 316 // addresses using ADDRESS_FAMILY_UNSPECIFIED. Reset on IP address change. |
306 bool resolved_known_ipv6_hostname_; | 317 bool resolved_known_ipv6_hostname_; |
307 | 318 |
308 // Any resolver flags that should be added to a request by default. | 319 // Any resolver flags that should be added to a request by default. |
309 HostResolverFlags additional_resolver_flags_; | 320 HostResolverFlags additional_resolver_flags_; |
310 | 321 |
311 // Allow fallback to ProcTask if DnsTask fails. | 322 // Allow fallback to ProcTask if DnsTask fails. |
312 bool fallback_to_proctask_; | 323 bool fallback_to_proctask_; |
313 | 324 |
| 325 // Task runner used for DNS lookups using the platform resolver, and other |
| 326 // blocking operations. Usually just the worker pool's task runner for slow |
| 327 // tasks, but can be overridden for tests. |
| 328 scoped_refptr<base::TaskRunner> worker_task_runner_; |
| 329 |
314 base::WeakPtrFactory<HostResolverImpl> weak_ptr_factory_; | 330 base::WeakPtrFactory<HostResolverImpl> weak_ptr_factory_; |
315 | 331 |
316 base::WeakPtrFactory<HostResolverImpl> probe_weak_ptr_factory_; | 332 base::WeakPtrFactory<HostResolverImpl> probe_weak_ptr_factory_; |
317 | 333 |
318 DISALLOW_COPY_AND_ASSIGN(HostResolverImpl); | 334 DISALLOW_COPY_AND_ASSIGN(HostResolverImpl); |
319 }; | 335 }; |
320 | 336 |
321 // Resolves a local hostname (such as "localhost" or "localhost6") into | 337 // Resolves a local hostname (such as "localhost" or "localhost6") into |
322 // IP endpoints with the given port. Returns true if |host| is a local | 338 // IP endpoints with the given port. Returns true if |host| is a local |
323 // hostname and false otherwise. Special IPv6 names (e.g. "localhost6") | 339 // hostname and false otherwise. Special IPv6 names (e.g. "localhost6") |
324 // will resolve to an IPv6 address only, whereas other names will | 340 // will resolve to an IPv6 address only, whereas other names will |
325 // resolve to both IPv4 and IPv6. | 341 // resolve to both IPv4 and IPv6. |
326 // This function is only exposed so it can be unit-tested. | 342 // This function is only exposed so it can be unit-tested. |
327 // TODO(tfarina): It would be better to change the tests so this function | 343 // TODO(tfarina): It would be better to change the tests so this function |
328 // gets exercised indirectly through HostResolverImpl. | 344 // gets exercised indirectly through HostResolverImpl. |
329 NET_EXPORT_PRIVATE bool ResolveLocalHostname(base::StringPiece host, | 345 NET_EXPORT_PRIVATE bool ResolveLocalHostname(base::StringPiece host, |
330 uint16_t port, | 346 uint16_t port, |
331 AddressList* address_list); | 347 AddressList* address_list); |
332 | 348 |
333 } // namespace net | 349 } // namespace net |
334 | 350 |
335 #endif // NET_DNS_HOST_RESOLVER_IMPL_H_ | 351 #endif // NET_DNS_HOST_RESOLVER_IMPL_H_ |
OLD | NEW |