Index: net/base/host_resolver.h |
=================================================================== |
--- net/base/host_resolver.h (revision 18360) |
+++ net/base/host_resolver.h (working copy) |
@@ -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 @@ |
namespace net { |
class AddressList; |
+class DnsResolutionObserver; |
class HostMapper; |
// This class represents the task of resolving hostnames (or IP address |
@@ -58,6 +60,46 @@ |
// |
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 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 @@ |
// 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 @@ |
// 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 @@ |
// 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 @@ |
// 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: |