| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/dns/mock_host_resolver.h" | 5 #include "net/dns/mock_host_resolver.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 48 IPAddress ip_address; | 48 IPAddress ip_address; |
| 49 if (!ip_address.AssignFromIPLiteral(address)) { | 49 if (!ip_address.AssignFromIPLiteral(address)) { |
| 50 LOG(WARNING) << "Not a supported IP literal: " << address.as_string(); | 50 LOG(WARNING) << "Not a supported IP literal: " << address.as_string(); |
| 51 return ERR_UNEXPECTED; | 51 return ERR_UNEXPECTED; |
| 52 } | 52 } |
| 53 addrlist->push_back(IPEndPoint(ip_address, 0)); | 53 addrlist->push_back(IPEndPoint(ip_address, 0)); |
| 54 } | 54 } |
| 55 return OK; | 55 return OK; |
| 56 } | 56 } |
| 57 | 57 |
| 58 struct MockHostResolverBase::Request { | 58 class MockHostResolverBase::RequestImpl : public HostResolver::Request { |
| 59 Request(const RequestInfo& req_info, | 59 public: |
| 60 AddressList* addr, | 60 RequestImpl(const RequestInfo& req_info, |
| 61 const CompletionCallback& cb) | 61 AddressList* addr, |
| 62 : info(req_info), addresses(addr), callback(cb) {} | 62 const CompletionCallback& cb, |
| 63 RequestInfo info; | 63 size_t id, |
| 64 AddressList* addresses; | 64 MockHostResolverBase* resolver) |
| 65 CompletionCallback callback; | 65 : info_(req_info), |
| 66 addresses_(addr), |
| 67 callback_(cb), |
| 68 id_(id), |
| 69 resolver_(resolver) {} |
| 70 |
| 71 ~RequestImpl() override { |
| 72 if (resolver_) |
| 73 resolver_->RemoveRequest(id_); |
| 74 } |
| 75 |
| 76 void ChangeRequestPriority(RequestPriority priority) override {} |
| 77 |
| 78 private: |
| 79 friend MockHostResolverBase; |
| 80 |
| 81 RequestInfo info_; |
| 82 AddressList* addresses_; |
| 83 CompletionCallback callback_; |
| 84 size_t id_; |
| 85 MockHostResolverBase* resolver_; |
| 86 |
| 87 DISALLOW_COPY_AND_ASSIGN(RequestImpl); |
| 66 }; | 88 }; |
| 67 | 89 |
| 68 MockHostResolverBase::~MockHostResolverBase() { | 90 MockHostResolverBase::~MockHostResolverBase() { |
| 91 for (auto map_it : requests_) { |
| 92 map_it.second->resolver_ = nullptr; |
| 93 } |
| 69 STLDeleteValues(&requests_); | 94 STLDeleteValues(&requests_); |
| 70 } | 95 } |
| 71 | 96 |
| 72 int MockHostResolverBase::Resolve(const RequestInfo& info, | 97 int MockHostResolverBase::Resolve(const RequestInfo& info, |
| 73 RequestPriority priority, | 98 RequestPriority priority, |
| 74 AddressList* addresses, | 99 AddressList* addresses, |
| 75 const CompletionCallback& callback, | 100 const CompletionCallback& callback, |
| 76 RequestHandle* handle, | 101 std::unique_ptr<Request>* handle, |
| 77 const BoundNetLog& net_log) { | 102 const BoundNetLog& net_log) { |
| 78 DCHECK(CalledOnValidThread()); | 103 DCHECK(CalledOnValidThread()); |
| 79 last_request_priority_ = priority; | 104 last_request_priority_ = priority; |
| 80 num_resolve_++; | 105 num_resolve_++; |
| 81 size_t id = next_request_id_++; | 106 size_t id = next_request_id_++; |
| 82 int rv = ResolveFromIPLiteralOrCache(info, addresses); | 107 int rv = ResolveFromIPLiteralOrCache(info, addresses); |
| 83 if (rv != ERR_DNS_CACHE_MISS) { | 108 if (rv != ERR_DNS_CACHE_MISS) { |
| 84 return rv; | 109 return rv; |
| 85 } | 110 } |
| 86 if (synchronous_mode_) { | 111 if (synchronous_mode_) { |
| 87 return ResolveProc(id, info, addresses); | 112 return ResolveProc(id, info, addresses); |
| 88 } | 113 } |
| 114 |
| 89 // Store the request for asynchronous resolution | 115 // Store the request for asynchronous resolution |
| 90 Request* req = new Request(info, addresses, callback); | 116 std::unique_ptr<RequestImpl> req( |
| 91 requests_[id] = req; | 117 new RequestImpl(info, addresses, callback, id, this)); |
| 92 if (handle) | 118 requests_[id] = req.get(); |
| 93 *handle = reinterpret_cast<RequestHandle>(id); | 119 *handle = std::move(req); |
| 94 | 120 |
| 95 if (!ondemand_mode_) { | 121 if (!ondemand_mode_) { |
| 96 base::ThreadTaskRunnerHandle::Get()->PostTask( | 122 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 97 FROM_HERE, | 123 FROM_HERE, |
| 98 base::Bind(&MockHostResolverBase::ResolveNow, AsWeakPtr(), id)); | 124 base::Bind(&MockHostResolverBase::ResolveNow, AsWeakPtr(), id)); |
| 99 } | 125 } |
| 100 | 126 |
| 101 return ERR_IO_PENDING; | 127 return ERR_IO_PENDING; |
| 102 } | 128 } |
| 103 | 129 |
| 104 int MockHostResolverBase::ResolveFromCache(const RequestInfo& info, | 130 int MockHostResolverBase::ResolveFromCache(const RequestInfo& info, |
| 105 AddressList* addresses, | 131 AddressList* addresses, |
| 106 const BoundNetLog& net_log) { | 132 const BoundNetLog& net_log) { |
| 107 num_resolve_from_cache_++; | 133 num_resolve_from_cache_++; |
| 108 DCHECK(CalledOnValidThread()); | 134 DCHECK(CalledOnValidThread()); |
| 109 next_request_id_++; | 135 next_request_id_++; |
| 110 int rv = ResolveFromIPLiteralOrCache(info, addresses); | 136 int rv = ResolveFromIPLiteralOrCache(info, addresses); |
| 111 return rv; | 137 return rv; |
| 112 } | 138 } |
| 113 | 139 |
| 114 void MockHostResolverBase::CancelRequest(RequestHandle handle) { | 140 void MockHostResolverBase::RemoveRequest(size_t id) { |
| 115 DCHECK(CalledOnValidThread()); | 141 if (requests_.empty()) |
| 116 size_t id = reinterpret_cast<size_t>(handle); | 142 return; |
| 117 RequestMap::iterator it = requests_.find(id); | 143 |
| 118 if (it != requests_.end()) { | 144 auto it = requests_.find(id); |
| 119 std::unique_ptr<Request> req(it->second); | 145 if (it != requests_.end()) |
| 120 requests_.erase(it); | 146 requests_.erase(it); |
| 121 } else { | |
| 122 NOTREACHED() << "CancelRequest must NOT be called after request is " | |
| 123 "complete or canceled."; | |
| 124 } | |
| 125 } | 147 } |
| 126 | 148 |
| 127 HostCache* MockHostResolverBase::GetHostCache() { | 149 HostCache* MockHostResolverBase::GetHostCache() { |
| 128 return cache_.get(); | 150 return cache_.get(); |
| 129 } | 151 } |
| 130 | 152 |
| 131 void MockHostResolverBase::ResolveAllPending() { | 153 void MockHostResolverBase::ResolveAllPending() { |
| 132 DCHECK(CalledOnValidThread()); | 154 DCHECK(CalledOnValidThread()); |
| 133 DCHECK(ondemand_mode_); | 155 DCHECK(ondemand_mode_); |
| 134 for (RequestMap::iterator i = requests_.begin(); i != requests_.end(); ++i) { | 156 for (RequestMap::iterator i = requests_.begin(); i != requests_.end(); ++i) { |
| 157 DLOG(ERROR) << "1"; |
| 135 base::ThreadTaskRunnerHandle::Get()->PostTask( | 158 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 136 FROM_HERE, | 159 FROM_HERE, |
| 137 base::Bind(&MockHostResolverBase::ResolveNow, AsWeakPtr(), i->first)); | 160 base::Bind(&MockHostResolverBase::ResolveNow, AsWeakPtr(), i->first)); |
| 138 } | 161 } |
| 139 } | 162 } |
| 140 | 163 |
| 141 // start id from 1 to distinguish from NULL RequestHandle | 164 // start id from 1 to distinguish from NULL RequestHandle |
| 142 MockHostResolverBase::MockHostResolverBase(bool use_caching) | 165 MockHostResolverBase::MockHostResolverBase(bool use_caching) |
| 143 : last_request_priority_(DEFAULT_PRIORITY), | 166 : last_request_priority_(DEFAULT_PRIORITY), |
| 144 synchronous_mode_(false), | 167 synchronous_mode_(false), |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 180 *addresses = AddressList::CopyWithPort(entry->addresses(), info.port()); | 203 *addresses = AddressList::CopyWithPort(entry->addresses(), info.port()); |
| 181 } | 204 } |
| 182 } | 205 } |
| 183 return rv; | 206 return rv; |
| 184 } | 207 } |
| 185 | 208 |
| 186 int MockHostResolverBase::ResolveProc(size_t id, | 209 int MockHostResolverBase::ResolveProc(size_t id, |
| 187 const RequestInfo& info, | 210 const RequestInfo& info, |
| 188 AddressList* addresses) { | 211 AddressList* addresses) { |
| 189 AddressList addr; | 212 AddressList addr; |
| 190 int rv = rules_->Resolve(info.hostname(), | 213 int rv = rules_->Resolve(info.hostname(), info.address_family(), |
| 191 info.address_family(), | 214 info.host_resolver_flags(), &addr, nullptr); |
| 192 info.host_resolver_flags(), | |
| 193 &addr, | |
| 194 NULL); | |
| 195 if (cache_.get()) { | 215 if (cache_.get()) { |
| 196 HostCache::Key key(info.hostname(), | 216 HostCache::Key key(info.hostname(), |
| 197 info.address_family(), | 217 info.address_family(), |
| 198 info.host_resolver_flags()); | 218 info.host_resolver_flags()); |
| 199 // Storing a failure with TTL 0 so that it overwrites previous value. | 219 // Storing a failure with TTL 0 so that it overwrites previous value. |
| 200 base::TimeDelta ttl; | 220 base::TimeDelta ttl; |
| 201 if (rv == OK) | 221 if (rv == OK) |
| 202 ttl = base::TimeDelta::FromSeconds(kCacheEntryTTLSeconds); | 222 ttl = base::TimeDelta::FromSeconds(kCacheEntryTTLSeconds); |
| 203 cache_->Set(key, HostCache::Entry(rv, addr), base::TimeTicks::Now(), ttl); | 223 cache_->Set(key, HostCache::Entry(rv, addr), base::TimeTicks::Now(), ttl); |
| 204 } | 224 } |
| 205 if (rv == OK) | 225 if (rv == OK) |
| 206 *addresses = AddressList::CopyWithPort(addr, info.port()); | 226 *addresses = AddressList::CopyWithPort(addr, info.port()); |
| 207 return rv; | 227 return rv; |
| 208 } | 228 } |
| 209 | 229 |
| 210 void MockHostResolverBase::ResolveNow(size_t id) { | 230 void MockHostResolverBase::ResolveNow(size_t id) { |
| 211 RequestMap::iterator it = requests_.find(id); | 231 RequestMap::iterator it = requests_.find(id); |
| 212 if (it == requests_.end()) | 232 if (it == requests_.end()) |
| 213 return; // was canceled | 233 return; // was canceled |
| 214 | 234 |
| 215 std::unique_ptr<Request> req(it->second); | 235 RequestImpl* req = it->second; |
| 216 requests_.erase(it); | 236 it->second->resolver_ = nullptr; |
| 217 int rv = ResolveProc(id, req->info, req->addresses); | 237 requests_.erase(id); |
| 218 if (!req->callback.is_null()) | 238 |
| 219 req->callback.Run(rv); | 239 int rv = ResolveProc(id, req->info_, req->addresses_); |
| 240 if (!req->callback_.is_null()) |
| 241 req->callback_.Run(rv); |
| 220 } | 242 } |
| 221 | 243 |
| 222 //----------------------------------------------------------------------------- | 244 //----------------------------------------------------------------------------- |
| 223 | 245 |
| 224 struct RuleBasedHostResolverProc::Rule { | 246 struct RuleBasedHostResolverProc::Rule { |
| 225 enum ResolverType { | 247 enum ResolverType { |
| 226 kResolverTypeFail, | 248 kResolverTypeFail, |
| 227 kResolverTypeSystem, | 249 kResolverTypeSystem, |
| 228 kResolverTypeIPLiteral, | 250 kResolverTypeIPLiteral, |
| 229 }; | 251 }; |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 418 // Next add a rules-based layer the use controls. | 440 // Next add a rules-based layer the use controls. |
| 419 return new RuleBasedHostResolverProc(catchall); | 441 return new RuleBasedHostResolverProc(catchall); |
| 420 } | 442 } |
| 421 | 443 |
| 422 //----------------------------------------------------------------------------- | 444 //----------------------------------------------------------------------------- |
| 423 | 445 |
| 424 int HangingHostResolver::Resolve(const RequestInfo& info, | 446 int HangingHostResolver::Resolve(const RequestInfo& info, |
| 425 RequestPriority priority, | 447 RequestPriority priority, |
| 426 AddressList* addresses, | 448 AddressList* addresses, |
| 427 const CompletionCallback& callback, | 449 const CompletionCallback& callback, |
| 428 RequestHandle* out_req, | 450 std::unique_ptr<Request>* out_req, |
| 429 const BoundNetLog& net_log) { | 451 const BoundNetLog& net_log) { |
| 430 return ERR_IO_PENDING; | 452 return ERR_IO_PENDING; |
| 431 } | 453 } |
| 432 | 454 |
| 433 int HangingHostResolver::ResolveFromCache(const RequestInfo& info, | 455 int HangingHostResolver::ResolveFromCache(const RequestInfo& info, |
| 434 AddressList* addresses, | 456 AddressList* addresses, |
| 435 const BoundNetLog& net_log) { | 457 const BoundNetLog& net_log) { |
| 436 return ERR_DNS_CACHE_MISS; | 458 return ERR_DNS_CACHE_MISS; |
| 437 } | 459 } |
| 438 | 460 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 452 CHECK_EQ(old_proc, current_proc_.get()); | 474 CHECK_EQ(old_proc, current_proc_.get()); |
| 453 } | 475 } |
| 454 | 476 |
| 455 void ScopedDefaultHostResolverProc::Init(HostResolverProc* proc) { | 477 void ScopedDefaultHostResolverProc::Init(HostResolverProc* proc) { |
| 456 current_proc_ = proc; | 478 current_proc_ = proc; |
| 457 previous_proc_ = HostResolverProc::SetDefault(current_proc_.get()); | 479 previous_proc_ = HostResolverProc::SetDefault(current_proc_.get()); |
| 458 current_proc_->SetLastProc(previous_proc_.get()); | 480 current_proc_->SetLastProc(previous_proc_.get()); |
| 459 } | 481 } |
| 460 | 482 |
| 461 } // namespace net | 483 } // namespace net |
| OLD | NEW |