| Index: net/base/host_resolver.h
|
| ===================================================================
|
| --- net/base/host_resolver.h (revision 20760)
|
| +++ net/base/host_resolver.h (working copy)
|
| @@ -6,57 +6,26 @@
|
| #define NET_BASE_HOST_RESOLVER_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"
|
|
|
| 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
|
| +// HostResolver can handle multiple requests at a time, so when cancelling a
|
| +// request the RequestHandle 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
|
| -// 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.
|
| -//
|
| -// The way these classes fit together is illustrated by:
|
| -//
|
| -//
|
| -// +------------- HostResolver ---------------+
|
| -// | | |
|
| -// Job Job Job
|
| -// (for host1) (for host2) (for hostX)
|
| -// / | | / | | / | |
|
| -// Request ... Request Request ... Request Request ... Request
|
| -// (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.
|
| -//
|
| -// Thread safety: This class is not threadsafe, and must only be called
|
| -// from one thread!
|
| -//
|
| class HostResolver : public base::RefCounted<HostResolver> {
|
| public:
|
| // The parameters for doing a Resolve(). |hostname| and |port| are required,
|
| @@ -120,21 +89,16 @@
|
| 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);
|
| + // Opaque type used to cancel a request.
|
| + typedef void* RequestHandle;
|
|
|
| + HostResolver() {}
|
| +
|
| // 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 ~HostResolver() {}
|
|
|
| - // Opaque type used to cancel a request.
|
| - class Request;
|
| -
|
| // 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
|
| @@ -147,75 +111,24 @@
|
| // 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);
|
| + virtual int Resolve(const RequestInfo& info, AddressList* addresses,
|
| + CompletionCallback* callback, RequestHandle* out_req) = 0;
|
|
|
| // 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);
|
| + virtual void CancelRequest(RequestHandle req) = 0;
|
|
|
| // 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);
|
| + virtual void AddObserver(Observer* observer) = 0;
|
|
|
| // Unregisters an observer previously added by AddObserver().
|
| - void RemoveObserver(Observer* observer);
|
| + virtual void RemoveObserver(Observer* observer) = 0;
|
|
|
| // TODO(eroman): temp hack for http://crbug.com/15513
|
| - void Shutdown();
|
| + virtual void Shutdown() = 0;
|
|
|
| - private:
|
| - class Job;
|
| - typedef std::vector<Request*> RequestsList;
|
| - typedef base::hash_map<std::string, scoped_refptr<Job> > JobMap;
|
| - typedef std::vector<Observer*> ObserversList;
|
| -
|
| - // Adds a job to outstanding jobs list.
|
| - void AddOutstandingJob(Job* job);
|
| -
|
| - // Returns the outstanding job for |hostname|, or NULL if there is none.
|
| - Job* FindOutstandingJob(const std::string& hostname);
|
| -
|
| - // Removes |job| from the outstanding jobs list.
|
| - void RemoveOutstandingJob(Job* job);
|
| -
|
| - // Callback for when |job| has completed with |error| and |addrlist|.
|
| - void OnJobComplete(Job* job, int error, const AddressList& addrlist);
|
| -
|
| - // Notify all observers of the start of a resolve request.
|
| - void NotifyObserversStartRequest(int request_id,
|
| - const RequestInfo& info);
|
| -
|
| - // Notify all observers of the completion of a resolve request.
|
| - void NotifyObserversFinishRequest(int request_id,
|
| - const RequestInfo& info,
|
| - int error);
|
| -
|
| - // Notify all observers of the cancellation of a resolve request.
|
| - void NotifyObserversCancelRequest(int request_id,
|
| - const RequestInfo& info);
|
| -
|
| - // Cache of host resolution results.
|
| - HostCache cache_;
|
| -
|
| - // Map from hostname to outstanding job.
|
| - JobMap jobs_;
|
| -
|
| - // The job that OnJobComplete() is currently processing (needed in case
|
| - // HostResolver gets deleted from within the callback).
|
| - scoped_refptr<Job> cur_completing_job_;
|
| -
|
| - // The observers to notify when a request starts/ends.
|
| - ObserversList observers_;
|
| -
|
| - // Monotonically increasing ID number to assign to the next request.
|
| - // Observers are the only consumers of this ID number.
|
| - int next_request_id_;
|
| -
|
| - // TODO(eroman): temp hack for http://crbug.com/15513
|
| - bool shutdown_;
|
| -
|
| DISALLOW_COPY_AND_ASSIGN(HostResolver);
|
| };
|
|
|
| @@ -245,7 +158,7 @@
|
| scoped_refptr<HostResolver> resolver_;
|
|
|
| // The current request (if any).
|
| - HostResolver::Request* cur_request_;
|
| + HostResolver::RequestHandle cur_request_;
|
| CompletionCallback* cur_request_callback_;
|
|
|
| // Completion callback for when request to |resolver_| completes.
|
| @@ -254,47 +167,11 @@
|
| 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() {}
|
| +// Creates a HostResolver implementation that queries the underlying system.
|
| +// (Except if a unit-test has changed the global HostResolverProc using
|
| +// ScopedHostResolverProc to intercept requests to the system).
|
| +HostResolver* CreateSystemHostResolver();
|
|
|
| - // 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_
|
|
|