Index: net/dns/async_host_resolver.cc |
diff --git a/net/dns/async_host_resolver.cc b/net/dns/async_host_resolver.cc |
index 757a00fe969aece445e1f43f0f52e1317d0f85a2..27d307ea9b0aa6a2ba1ca336a4815326c5de8231 100644 |
--- a/net/dns/async_host_resolver.cc |
+++ b/net/dns/async_host_resolver.cc |
@@ -37,8 +37,6 @@ class RequestParameters : public NetLog::EventParameters { |
dict->SetInteger("address_family", |
static_cast<int>(info_.address_family())); |
dict->SetBoolean("allow_cached_response", info_.allow_cached_response()); |
- dict->SetBoolean("only_use_cached_response", |
- info_.only_use_cached_response()); |
dict->SetBoolean("is_speculative", info_.is_speculative()); |
dict->SetInteger("priority", info_.priority()); |
@@ -114,7 +112,7 @@ class AsyncHostResolver::Request { |
int id() const { return id_; } |
int result() const { return result_; } |
const Key& key() const { |
- DCHECK(IsValidKey()); |
+ DCHECK(IsValid()); |
return key_; |
} |
const HostResolver::RequestInfo& info() const { return info_; } |
@@ -122,63 +120,24 @@ class AsyncHostResolver::Request { |
const BoundNetLog& source_net_log() const { return source_net_log_; } |
const BoundNetLog& request_net_log() const { return request_net_log_; } |
- bool ResolveSynchronously() { |
- bool resolve_succeeded = true; |
+ bool ResolveAsIp() { |
IPAddressNumber ip_number; |
- if (info_.hostname().empty()) |
- result_ = ERR_NAME_NOT_RESOLVED; |
- else if (ParseIPLiteralToNumber(info_.hostname(), &ip_number)) |
- result_ = ServeAsIp(ip_number); |
- else if (!IsValidKey()) |
+ if (!ParseIPLiteralToNumber(info_.hostname(), &ip_number)) |
+ return false; |
+ |
+ if (ip_number.size() != kIPv4AddressSize) { |
result_ = ERR_NAME_NOT_RESOLVED; |
- else if (ServeFromCache()) |
+ } else { |
+ *addresses_ = AddressList::CreateFromIPAddressWithCname( |
+ ip_number, |
+ info_.port(), |
+ info_.host_resolver_flags() & HOST_RESOLVER_CANONNAME); |
result_ = OK; |
- else if (info_.only_use_cached_response()) |
- result_ = ERR_NAME_NOT_RESOLVED; |
- else |
- resolve_succeeded = false; |
- return resolve_succeeded; |
- } |
- |
- // Called when a request completes synchronously; we do not have an |
- // AddressList argument, since in case of a successful synchronous |
- // completion, ResolveSynchronously would set the |addresses_| and in |
- // case of an unsuccessful synchronous completion, we do not touch |
- // |addresses_|. |
- void OnSyncComplete(int result) { |
- callback_ = NULL; |
- resolver_->OnFinish(this, result); |
- } |
- |
- // Called when a request completes asynchronously. |
- void OnAsyncComplete(int result, const AddressList& addresses) { |
- if (result == OK) |
- *addresses_ = CreateAddressListUsingPort(addresses, info_.port()); |
- DCHECK(callback_); |
- CompletionCallback* callback = callback_; |
- callback_ = NULL; |
- resolver_->OnFinish(this, result); |
- callback->Run(result); |
- } |
- |
- private: |
- bool IsValidKey() const { return !key_.first.empty(); } |
- |
- int ServeAsIp(const IPAddressNumber& ip_number) { |
- if (ip_number.size() != kIPv4AddressSize) |
- return ERR_NAME_NOT_RESOLVED; |
- *addresses_ = AddressList::CreateFromIPAddressWithCname( |
- ip_number, |
- info_.port(), |
- info_.host_resolver_flags() & HOST_RESOLVER_CANONNAME); |
- return OK; |
+ } |
+ return true; |
} |
bool ServeFromCache() { |
- // Sanity check -- it shouldn't be the case that allow_cached_response is |
- // false while only_use_cached_response is true. |
- DCHECK(info_.allow_cached_response() || !info_.only_use_cached_response()); |
- |
HostCache* cache = resolver_->cache_.get(); |
if (!cache || !info_.allow_cached_response()) |
return false; |
@@ -191,6 +150,7 @@ class AsyncHostResolver::Request { |
request_net_log_.AddEvent( |
NetLog::TYPE_ASYNC_HOST_RESOLVER_CACHE_HIT, NULL); |
DCHECK_EQ(OK, cache_entry->error); |
+ result_ = cache_entry->error; |
*addresses_ = |
CreateAddressListUsingPort(cache_entry->addrlist, info_.port()); |
return true; |
@@ -198,6 +158,33 @@ class AsyncHostResolver::Request { |
return false; |
} |
+ // Called when a request completes synchronously; we do not have an |
+ // AddressList argument, since in case of a successful synchronous |
+ // completion, either ResolveAsIp or ServerFromCache would set the |
+ // |addresses_| and in case of an unsuccessful synchronous completion, we |
+ // do not touch |addresses_|. |
+ void OnSyncComplete(int result) { |
+ callback_ = NULL; |
+ resolver_->OnFinish(this, result); |
+ } |
+ |
+ // Called when a request completes asynchronously. |
+ void OnAsyncComplete(int result, const AddressList& addresses) { |
+ if (result == OK) |
+ *addresses_ = CreateAddressListUsingPort(addresses, info_.port()); |
+ DCHECK(callback_); |
+ CompletionCallback* callback = callback_; |
+ callback_ = NULL; |
+ resolver_->OnFinish(this, result); |
+ callback->Run(result); |
+ } |
+ |
+ // Returns true if request has a validly formed hostname. |
+ bool IsValid() const { |
+ return !info_.hostname().empty() && !key_.first.empty(); |
+ } |
+ |
+ private: |
AsyncHostResolver* resolver_; |
BoundNetLog source_net_log_; |
BoundNetLog request_net_log_; |
@@ -246,11 +233,15 @@ int AsyncHostResolver::Resolve(const RequestInfo& info, |
CompletionCallback* callback, |
RequestHandle* out_req, |
const BoundNetLog& source_net_log) { |
+ DCHECK(addresses); |
+ DCHECK(callback); |
scoped_ptr<Request> request( |
CreateNewRequest(info, callback, addresses, source_net_log)); |
int rv = ERR_UNEXPECTED; |
- if (request->ResolveSynchronously()) |
+ if (!request->IsValid()) |
+ rv = ERR_NAME_NOT_RESOLVED; |
+ else if (request->ResolveAsIp() || request->ServeFromCache()) |
rv = request->result(); |
else if (AttachToRequestList(request.get())) |
rv = ERR_IO_PENDING; |
@@ -269,6 +260,22 @@ int AsyncHostResolver::Resolve(const RequestInfo& info, |
return rv; |
} |
+int AsyncHostResolver::ResolveFromCache(const RequestInfo& info, |
+ AddressList* addresses, |
+ const BoundNetLog& source_net_log) { |
+ scoped_ptr<Request> request( |
+ CreateNewRequest(info, NULL, addresses, source_net_log)); |
+ int rv = ERR_UNEXPECTED; |
+ if (!request->IsValid()) |
+ rv = ERR_NAME_NOT_RESOLVED; |
+ else if (request->ResolveAsIp() || request->ServeFromCache()) |
+ rv = request->result(); |
+ else |
+ rv = ERR_DNS_CACHE_MISS; |
+ request->OnSyncComplete(rv); |
+ return rv; |
+} |
+ |
void AsyncHostResolver::OnStart(Request* request) { |
DCHECK(request); |