diff options
Diffstat (limited to 'net/base/host_resolver.h')
-rw-r--r-- | net/base/host_resolver.h | 80 |
1 files changed, 73 insertions, 7 deletions
diff --git a/net/base/host_resolver.h b/net/base/host_resolver.h index a67419a..9a7b7b9 100644 --- a/net/base/host_resolver.h +++ b/net/base/host_resolver.h @@ -11,6 +11,7 @@ #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" @@ -19,6 +20,7 @@ class MessageLoop; namespace net { class AddressList; +class DnsResolutionObserver; class HostMapper; // This class represents the task of resolving hostnames (or IP address @@ -58,6 +60,46 @@ class HostMapper; // class 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_; + }; + // Creates a HostResolver that caches up to |max_cache_entries| for // |cache_duration_ms| milliseconds. // @@ -74,9 +116,9 @@ class HostResolver { class Request; // Resolves the given hostname (or IP address literal), filling out the - // |addresses| object upon success. The |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. + // |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. // @@ -85,18 +127,26 @@ class HostResolver { // 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 std::string& hostname, int port, - AddressList* addresses, CompletionCallback* callback, - Request** req); + 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(DnsResolutionObserver* observer); + + // Unregisters an observer previously added by AddObserver(). + void RemoveObserver(DnsResolutionObserver* observer); + private: class Job; typedef std::vector<Request*> RequestsList; typedef base::hash_map<std::string, scoped_refptr<Job> > JobMap; + typedef std::vector<DnsResolutionObserver*> ObserversList; // Adds a job to outstanding jobs list. void AddOutstandingJob(Job* job); @@ -110,6 +160,15 @@ class HostResolver { // Callback for when |job| has completed with |error| and |addrlist|. void OnJobComplete(Job* job, int error, const AddressList& addrlist); + // Notify all obsevers of the start of a resolve request. + void NotifyObserversStartRequest(int request_id, + const RequestInfo& info); + + // Notify all obsevers of the completion of a resolve request. + void NotifyObserversFinishRequest(int request_id, + const RequestInfo& info, + int error); + // Cache of host resolution results. HostCache cache_; @@ -120,6 +179,13 @@ class HostResolver { // 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_; + DISALLOW_COPY_AND_ASSIGN(HostResolver); }; @@ -137,7 +203,7 @@ class SingleRequestHostResolver { // Resolves the given hostname (or IP address literal), filling out the // |addresses| object upon success. See HostResolver::Resolve() for details. - int Resolve(const std::string& hostname, int port, + int Resolve(const HostResolver::RequestInfo& info, AddressList* addresses, CompletionCallback* callback); private: |