Index: net/base/host_resolver_impl.h |
=================================================================== |
--- net/base/host_resolver_impl.h (revision 20435) |
+++ net/base/host_resolver_impl.h (working copy) |
@@ -2,39 +2,21 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#ifndef NET_BASE_HOST_RESOLVER_H_ |
-#define NET_BASE_HOST_RESOLVER_H_ |
+#ifndef NET_BASE_HOST_RESOLVER_IMPL_H_ |
+#define NET_BASE_HOST_RESOLVER_IMPL_H_ |
#include <string> |
#include <vector> |
-#include "base/basictypes.h" |
-#include "base/lock.h" |
-#include "base/ref_counted.h" |
-#include "googleurl/src/gurl.h" |
-#include "net/base/completion_callback.h" |
#include "net/base/host_cache.h" |
+#include "net/base/host_resolver.h" |
+#include "net/base/host_resolver_proc.h" |
-class MessageLoop; |
- |
namespace net { |
-class AddressList; |
-class HostMapper; |
- |
-// This class represents the task of resolving hostnames (or IP address |
-// literal) to an AddressList object. |
-// |
-// HostResolver handles multiple requests at a time, so when cancelling a |
-// request the Request* handle that was returned by Resolve() needs to be |
-// given. A simpler alternative for consumers that only have 1 outstanding |
-// request at a time is to create a SingleRequestHostResolver wrapper around |
-// HostResolver (which will automatically cancel the single request when it |
-// goes out of scope). |
-// |
// For each hostname that is requested, HostResolver creates a |
-// HostResolver::Job. This job gets dispatched to a thread in the global |
-// WorkerPool, where it runs "getaddrinfo(hostname)". If requests for that same |
+// HostResolverImpl::Job. This job gets dispatched to a thread in the global |
+// WorkerPool, where it runs SystemHostResolverProc(). If requests for that same |
// host are made while the job is already outstanding, then they are attached |
// to the existing job rather than creating a new one. This avoids doing |
// parallel resolves for the same host. |
@@ -42,7 +24,7 @@ |
// The way these classes fit together is illustrated by: |
// |
// |
-// +------------- HostResolver ---------------+ |
+// +----------- HostResolverImpl -------------+ |
// | | | |
// Job Job Job |
// (for host1) (for host2) (for hostX) |
@@ -51,126 +33,52 @@ |
// (port1) (port2) (port3) (port4) (port5) (portX) |
// |
// |
-// When a HostResolver::Job finishes its work in the threadpool, the callbacks |
-// of each waiting request are run on the origin thread. |
+// When a HostResolverImpl::Job finishes its work in the threadpool, the |
+// callbacks of each waiting request are run on the origin thread. |
// |
// Thread safety: This class is not threadsafe, and must only be called |
// from one thread! |
// |
-class HostResolver : public base::RefCounted<HostResolver> { |
+class HostResolverImpl : public HostResolver { |
public: |
- // The parameters for doing a Resolve(). |hostname| and |port| are required, |
- // the rest are optional (and have reasonable defaults). |
- class RequestInfo { |
- public: |
- RequestInfo(const std::string& hostname, int port) |
- : hostname_(hostname), |
- port_(port), |
- allow_cached_response_(true), |
- is_speculative_(false) {} |
- |
- const int port() const { return port_; } |
- const std::string& hostname() const { return hostname_; } |
- |
- bool allow_cached_response() const { return allow_cached_response_; } |
- void set_allow_cached_response(bool b) { allow_cached_response_ = b; } |
- |
- bool is_speculative() const { return is_speculative_; } |
- void set_is_speculative(bool b) { is_speculative_ = b; } |
- |
- const GURL& referrer() const { return referrer_; } |
- void set_referrer(const GURL& referrer) { referrer_ = referrer; } |
- |
- private: |
- // The hostname to resolve. |
- std::string hostname_; |
- |
- // The port number to set in the result's sockaddrs. |
- int port_; |
- |
- // Whether it is ok to return a result from the host cache. |
- bool allow_cached_response_; |
- |
- // Whether this request was started by the DNS prefetcher. |
- bool is_speculative_; |
- |
- // Optional data for consumption by observers. This is the URL of the |
- // page that lead us to the navigation, for DNS prefetcher's benefit. |
- GURL referrer_; |
- }; |
- |
- // Interface for observing the requests that flow through a HostResolver. |
- class Observer { |
- public: |
- virtual ~Observer() {} |
- |
- // Called at the start of HostResolver::Resolve(). |id| is a unique number |
- // given to the request, so it can be matched up with a corresponding call |
- // to OnFinishResolutionWithStatus() or OnCancelResolution(). |
- virtual void OnStartResolution(int id, const RequestInfo& info) = 0; |
- |
- // Called on completion of request |id|. Note that if the request was |
- // cancelled, OnCancelResolution() will be called instead. |
- virtual void OnFinishResolutionWithStatus(int id, bool was_resolved, |
- const RequestInfo& info) = 0; |
- |
- // Called when request |id| has been cancelled. A request is "cancelled" |
- // if either the HostResolver is destroyed while a resolution is in |
- // progress, or HostResolver::CancelRequest() is called. |
- virtual void OnCancelResolution(int id, const RequestInfo& info) = 0; |
- }; |
- |
// Creates a HostResolver that caches up to |max_cache_entries| for |
- // |cache_duration_ms| milliseconds. |
- // |
- // TODO(eroman): Get rid of the default parameters as it violate google |
- // style. This is temporary to help with refactoring. |
- HostResolver(int max_cache_entries = 100, int cache_duration_ms = 60000); |
+ // |cache_duration_ms| milliseconds. |resolver_proc| is used to perform |
+ // the actual resolves; it must be thread-safe since it is run from |
+ // multiple worker threads. If |resolver_proc| is NULL then the default |
+ // host resolver procedure is used (which is SystemHostResolverProc except |
+ // if overridden) |
+ HostResolverImpl(HostResolverProc* resolver_proc, |
+ int max_cache_entries, |
+ int cache_duration_ms); |
// If any completion callbacks are pending when the resolver is destroyed, |
// the host resolutions are cancelled, and the completion callbacks will not |
// be called. |
- ~HostResolver(); |
+ virtual ~HostResolverImpl(); |
- // Opaque type used to cancel a request. |
- class Request; |
+ // HostResolver methods: |
+ virtual int Resolve(const RequestInfo& info, AddressList* addresses, |
+ CompletionCallback* callback, RequestHandle* out_req); |
+ virtual void CancelRequest(RequestHandle req); |
+ virtual void AddObserver(Observer* observer); |
+ virtual void RemoveObserver(Observer* observer); |
- // Resolves the given hostname (or IP address literal), filling out the |
- // |addresses| object upon success. The |info.port| parameter will be set as |
- // the sin(6)_port field of the sockaddr_in{6} struct. Returns OK if |
- // successful or an error code upon failure. |
- // |
- // When callback is null, the operation completes synchronously. |
- // |
- // When callback is non-null, the operation will be performed asynchronously. |
- // ERR_IO_PENDING is returned if it has been scheduled successfully. Real |
- // result code will be passed to the completion callback. If |req| is |
- // non-NULL, then |*req| will be filled with a handle to the async request. |
- // This handle is not valid after the request has completed. |
- int Resolve(const RequestInfo& info, AddressList* addresses, |
- CompletionCallback* callback, Request** req); |
- |
- // Cancels the specified request. |req| is the handle returned by Resolve(). |
- // After a request is cancelled, its completion callback will not be called. |
- void CancelRequest(Request* req); |
- |
- // Adds an observer to this resolver. The observer will be notified of the |
- // start and completion of all requests (excluding cancellation). |observer| |
- // must remain valid for the duration of this HostResolver's lifetime. |
- void AddObserver(Observer* observer); |
- |
- // Unregisters an observer previously added by AddObserver(). |
- void RemoveObserver(Observer* observer); |
- |
// TODO(eroman): temp hack for http://crbug.com/15513 |
- void Shutdown(); |
+ virtual void Shutdown(); |
private: |
class Job; |
+ class Request; |
typedef std::vector<Request*> RequestsList; |
typedef base::hash_map<std::string, scoped_refptr<Job> > JobMap; |
typedef std::vector<Observer*> ObserversList; |
+ // Returns the HostResolverProc to use for this instance. |
+ HostResolverProc* effective_resolver_proc() const { |
+ return resolver_proc_ ? |
+ resolver_proc_.get() : HostResolverProc::GetDefault(); |
+ } |
+ |
// Adds a job to outstanding jobs list. |
void AddOutstandingJob(Job* job); |
@@ -213,88 +121,16 @@ |
// Observers are the only consumers of this ID number. |
int next_request_id_; |
+ // The procedure to use for resolving host names. This will be NULL, except |
+ // in the case of unit-tests which inject custom host resolving behaviors. |
+ scoped_refptr<HostResolverProc> resolver_proc_; |
+ |
// TODO(eroman): temp hack for http://crbug.com/15513 |
bool shutdown_; |
- DISALLOW_COPY_AND_ASSIGN(HostResolver); |
+ DISALLOW_COPY_AND_ASSIGN(HostResolverImpl); |
}; |
-// This class represents the task of resolving a hostname (or IP address |
-// literal) to an AddressList object. It wraps HostResolver to resolve only a |
-// single hostname at a time and cancels this request when going out of scope. |
-class SingleRequestHostResolver { |
- public: |
- explicit SingleRequestHostResolver(HostResolver* resolver); |
- |
- // If a completion callback is pending when the resolver is destroyed, the |
- // host resolution is cancelled, and the completion callback will not be |
- // called. |
- ~SingleRequestHostResolver(); |
- |
- // Resolves the given hostname (or IP address literal), filling out the |
- // |addresses| object upon success. See HostResolver::Resolve() for details. |
- int Resolve(const HostResolver::RequestInfo& info, |
- AddressList* addresses, CompletionCallback* callback); |
- |
- private: |
- // Callback for when the request to |resolver_| completes, so we dispatch |
- // to the user's callback. |
- void OnResolveCompletion(int result); |
- |
- // The actual host resolver that will handle the request. |
- scoped_refptr<HostResolver> resolver_; |
- |
- // The current request (if any). |
- HostResolver::Request* cur_request_; |
- CompletionCallback* cur_request_callback_; |
- |
- // Completion callback for when request to |resolver_| completes. |
- net::CompletionCallbackImpl<SingleRequestHostResolver> callback_; |
- |
- DISALLOW_COPY_AND_ASSIGN(SingleRequestHostResolver); |
-}; |
- |
-// A helper class used in unit tests to alter hostname mappings. See |
-// SetHostMapper for details. |
-class HostMapper : public base::RefCountedThreadSafe<HostMapper> { |
- public: |
- virtual ~HostMapper() {} |
- |
- // Returns possibly altered hostname, or empty string to simulate |
- // a failed lookup. |
- virtual std::string Map(const std::string& host) = 0; |
- |
- protected: |
- // Ask previous host mapper (if set) for mapping of given host. |
- std::string MapUsingPrevious(const std::string& host); |
- |
- private: |
- friend class ScopedHostMapper; |
- |
- // Set mapper to ask when this mapper doesn't want to modify the result. |
- void set_previous_mapper(HostMapper* mapper) { |
- previous_mapper_ = mapper; |
- } |
- |
- scoped_refptr<HostMapper> previous_mapper_; |
-}; |
- |
-#ifdef UNIT_TEST |
-// This function is designed to allow unit tests to override the behavior of |
-// HostResolver. For example, a HostMapper instance can force all hostnames |
-// to map to a fixed IP address such as 127.0.0.1. |
-// |
-// The previously set HostMapper (or NULL if there was none) is returned. |
-// |
-// NOTE: This function is not thread-safe, so take care to only call this |
-// function while there are no outstanding HostResolver instances. |
-// |
-// NOTE: In most cases, you should use ScopedHostMapper instead, which is |
-// defined in host_resolver_unittest.h |
-// |
-HostMapper* SetHostMapper(HostMapper* host_mapper); |
-#endif |
- |
} // namespace net |
-#endif // NET_BASE_HOST_RESOLVER_H_ |
+#endif // NET_BASE_HOST_RESOLVER_IMPL_H_ |