Chromium Code Reviews| 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" |
| 11 #include "base/callback_helpers.h" | |
| 11 #include "base/location.h" | 12 #include "base/location.h" |
| 12 #include "base/memory/ref_counted.h" | 13 #include "base/memory/ref_counted.h" |
| 13 #include "base/single_thread_task_runner.h" | 14 #include "base/single_thread_task_runner.h" |
| 14 #include "base/stl_util.h" | 15 #include "base/stl_util.h" |
| 15 #include "base/strings/pattern.h" | 16 #include "base/strings/pattern.h" |
| 16 #include "base/strings/string_split.h" | 17 #include "base/strings/string_split.h" |
| 17 #include "base/strings/string_util.h" | 18 #include "base/strings/string_util.h" |
| 18 #include "base/threading/platform_thread.h" | 19 #include "base/threading/platform_thread.h" |
| 19 #include "base/threading/thread_task_runner_handle.h" | 20 #include "base/threading/thread_task_runner_handle.h" |
| 20 #include "net/base/ip_address.h" | 21 #include "net/base/ip_address.h" |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 48 IPAddress ip_address; | 49 IPAddress ip_address; |
| 49 if (!ip_address.AssignFromIPLiteral(address)) { | 50 if (!ip_address.AssignFromIPLiteral(address)) { |
| 50 LOG(WARNING) << "Not a supported IP literal: " << address.as_string(); | 51 LOG(WARNING) << "Not a supported IP literal: " << address.as_string(); |
| 51 return ERR_UNEXPECTED; | 52 return ERR_UNEXPECTED; |
| 52 } | 53 } |
| 53 addrlist->push_back(IPEndPoint(ip_address, 0)); | 54 addrlist->push_back(IPEndPoint(ip_address, 0)); |
| 54 } | 55 } |
| 55 return OK; | 56 return OK; |
| 56 } | 57 } |
| 57 | 58 |
| 58 struct MockHostResolverBase::Request { | 59 class MockHostResolverBase::RequestImpl : public HostResolver::Request { |
| 59 Request(const RequestInfo& req_info, | 60 public: |
| 60 AddressList* addr, | 61 RequestImpl(const RequestInfo& req_info, |
| 61 const CompletionCallback& cb) | 62 AddressList* addr, |
| 62 : info(req_info), addresses(addr), callback(cb) {} | 63 const CompletionCallback& cb, |
| 63 RequestInfo info; | 64 MockHostResolverBase* resolver, |
| 64 AddressList* addresses; | 65 size_t id) |
| 65 CompletionCallback callback; | 66 : info_(req_info), |
| 67 addresses_(addr), | |
| 68 callback_(cb), | |
| 69 resolver_(resolver), | |
| 70 id_(id) {} | |
| 71 | |
| 72 ~RequestImpl() override { | |
| 73 if (resolver_) | |
| 74 resolver_->DetachRequest(id_); | |
| 75 } | |
| 76 | |
| 77 void ChangeRequestPriority(RequestPriority priority) override {} | |
| 78 | |
| 79 void OnResolveCancelled(MockHostResolverBase* resolver_) { | |
|
mmenke
2016/07/19 19:03:56
This isn't used.
maksims (do not use this acc)
2016/07/21 07:12:46
Done.
| |
| 80 DCHECK_EQ(resolver_, resolver_); | |
| 81 resolver_ = nullptr; | |
| 82 addresses_ = nullptr; | |
| 83 callback_.Reset(); | |
| 84 } | |
| 85 | |
| 86 void OnResolveCompleted(MockHostResolverBase* resolver, int error) { | |
| 87 DCHECK_EQ(resolver_, resolver); | |
| 88 resolver_ = nullptr; | |
| 89 addresses_ = nullptr; | |
| 90 base::ResetAndReturn(&callback_).Run(error); | |
| 91 } | |
| 92 | |
| 93 RequestInfo info() { return info_; } | |
| 94 | |
| 95 AddressList* addresses() { return addresses_; } | |
| 96 | |
| 97 private: | |
| 98 RequestInfo info_; | |
| 99 AddressList* addresses_; | |
| 100 CompletionCallback callback_; | |
| 101 MockHostResolverBase* resolver_; | |
| 102 size_t id_; | |
| 103 | |
| 104 DISALLOW_COPY_AND_ASSIGN(RequestImpl); | |
| 66 }; | 105 }; |
| 67 | 106 |
| 68 MockHostResolverBase::~MockHostResolverBase() { | 107 MockHostResolverBase::~MockHostResolverBase() { |
| 69 STLDeleteValues(&requests_); | 108 requests_.clear(); |
|
mmenke
2016/07/19 19:03:56
This isn't right - if there are any requests alive
maksims (do not use this acc)
2016/07/21 07:12:46
Done.
| |
| 70 } | 109 } |
| 71 | 110 |
| 72 int MockHostResolverBase::Resolve(const RequestInfo& info, | 111 int MockHostResolverBase::Resolve(const RequestInfo& info, |
| 73 RequestPriority priority, | 112 RequestPriority priority, |
| 74 AddressList* addresses, | 113 AddressList* addresses, |
| 75 const CompletionCallback& callback, | 114 const CompletionCallback& callback, |
| 76 RequestHandle* handle, | 115 std::unique_ptr<Request>* request, |
| 77 const BoundNetLog& net_log) { | 116 const BoundNetLog& net_log) { |
| 78 DCHECK(CalledOnValidThread()); | 117 DCHECK(CalledOnValidThread()); |
| 79 last_request_priority_ = priority; | 118 last_request_priority_ = priority; |
| 80 num_resolve_++; | 119 num_resolve_++; |
| 81 size_t id = next_request_id_++; | 120 size_t id = next_request_id_++; |
| 82 int rv = ResolveFromIPLiteralOrCache(info, addresses); | 121 int rv = ResolveFromIPLiteralOrCache(info, addresses); |
| 83 if (rv != ERR_DNS_CACHE_MISS) { | 122 if (rv != ERR_DNS_CACHE_MISS) { |
| 84 return rv; | 123 return rv; |
| 85 } | 124 } |
| 86 if (synchronous_mode_) { | 125 if (synchronous_mode_) { |
| 87 return ResolveProc(id, info, addresses); | 126 return ResolveProc(info, addresses); |
| 88 } | 127 } |
| 89 // Store the request for asynchronous resolution | 128 // Store the request for asynchronous resolution |
| 90 Request* req = new Request(info, addresses, callback); | 129 std::unique_ptr<RequestImpl> req( |
| 91 requests_[id] = req; | 130 new RequestImpl(info, addresses, callback, this, id)); |
| 92 if (handle) | 131 requests_[id] = req.get(); |
| 93 *handle = reinterpret_cast<RequestHandle>(id); | 132 *request = std::move(req); |
| 94 | 133 |
| 95 if (!ondemand_mode_) { | 134 if (!ondemand_mode_) { |
| 96 base::ThreadTaskRunnerHandle::Get()->PostTask( | 135 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 97 FROM_HERE, | 136 FROM_HERE, |
| 98 base::Bind(&MockHostResolverBase::ResolveNow, AsWeakPtr(), id)); | 137 base::Bind(&MockHostResolverBase::ResolveNow, AsWeakPtr(), id)); |
| 99 } | 138 } |
| 100 | 139 |
| 101 return ERR_IO_PENDING; | 140 return ERR_IO_PENDING; |
| 102 } | 141 } |
| 103 | 142 |
| 104 int MockHostResolverBase::ResolveFromCache(const RequestInfo& info, | 143 int MockHostResolverBase::ResolveFromCache(const RequestInfo& info, |
| 105 AddressList* addresses, | 144 AddressList* addresses, |
| 106 const BoundNetLog& net_log) { | 145 const BoundNetLog& net_log) { |
| 107 num_resolve_from_cache_++; | 146 num_resolve_from_cache_++; |
| 108 DCHECK(CalledOnValidThread()); | 147 DCHECK(CalledOnValidThread()); |
| 109 next_request_id_++; | 148 next_request_id_++; |
| 110 int rv = ResolveFromIPLiteralOrCache(info, addresses); | 149 int rv = ResolveFromIPLiteralOrCache(info, addresses); |
| 111 return rv; | 150 return rv; |
| 112 } | 151 } |
| 113 | 152 |
| 114 void MockHostResolverBase::CancelRequest(RequestHandle handle) { | 153 void MockHostResolverBase::DetachRequest(size_t id) { |
| 115 DCHECK(CalledOnValidThread()); | |
| 116 size_t id = reinterpret_cast<size_t>(handle); | |
| 117 RequestMap::iterator it = requests_.find(id); | 154 RequestMap::iterator it = requests_.find(id); |
| 118 if (it != requests_.end()) { | 155 CHECK(it != requests_.end()); |
| 119 std::unique_ptr<Request> req(it->second); | 156 requests_.erase(it); |
| 120 requests_.erase(it); | |
| 121 } else { | |
| 122 NOTREACHED() << "CancelRequest must NOT be called after request is " | |
| 123 "complete or canceled."; | |
| 124 } | |
| 125 } | 157 } |
| 126 | 158 |
| 127 HostCache* MockHostResolverBase::GetHostCache() { | 159 HostCache* MockHostResolverBase::GetHostCache() { |
| 128 return cache_.get(); | 160 return cache_.get(); |
| 129 } | 161 } |
| 130 | 162 |
| 131 void MockHostResolverBase::ResolveAllPending() { | 163 void MockHostResolverBase::ResolveAllPending() { |
| 132 DCHECK(CalledOnValidThread()); | 164 DCHECK(CalledOnValidThread()); |
| 133 DCHECK(ondemand_mode_); | 165 DCHECK(ondemand_mode_); |
| 134 for (RequestMap::iterator i = requests_.begin(); i != requests_.end(); ++i) { | 166 for (RequestMap::iterator i = requests_.begin(); i != requests_.end(); ++i) { |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 176 const HostCache::Entry* entry = cache_->Lookup(key, base::TimeTicks::Now()); | 208 const HostCache::Entry* entry = cache_->Lookup(key, base::TimeTicks::Now()); |
| 177 if (entry) { | 209 if (entry) { |
| 178 rv = entry->error(); | 210 rv = entry->error(); |
| 179 if (rv == OK) | 211 if (rv == OK) |
| 180 *addresses = AddressList::CopyWithPort(entry->addresses(), info.port()); | 212 *addresses = AddressList::CopyWithPort(entry->addresses(), info.port()); |
| 181 } | 213 } |
| 182 } | 214 } |
| 183 return rv; | 215 return rv; |
| 184 } | 216 } |
| 185 | 217 |
| 186 int MockHostResolverBase::ResolveProc(size_t id, | 218 int MockHostResolverBase::ResolveProc(const RequestInfo& info, |
| 187 const RequestInfo& info, | |
| 188 AddressList* addresses) { | 219 AddressList* addresses) { |
| 189 AddressList addr; | 220 AddressList addr; |
| 190 int rv = rules_->Resolve(info.hostname(), | 221 int rv = rules_->Resolve(info.hostname(), info.address_family(), |
| 191 info.address_family(), | 222 info.host_resolver_flags(), &addr, nullptr); |
| 192 info.host_resolver_flags(), | |
| 193 &addr, | |
| 194 NULL); | |
| 195 if (cache_.get()) { | 223 if (cache_.get()) { |
| 196 HostCache::Key key(info.hostname(), | 224 HostCache::Key key(info.hostname(), |
| 197 info.address_family(), | 225 info.address_family(), |
| 198 info.host_resolver_flags()); | 226 info.host_resolver_flags()); |
| 199 // Storing a failure with TTL 0 so that it overwrites previous value. | 227 // Storing a failure with TTL 0 so that it overwrites previous value. |
| 200 base::TimeDelta ttl; | 228 base::TimeDelta ttl; |
| 201 if (rv == OK) | 229 if (rv == OK) |
| 202 ttl = base::TimeDelta::FromSeconds(kCacheEntryTTLSeconds); | 230 ttl = base::TimeDelta::FromSeconds(kCacheEntryTTLSeconds); |
| 203 cache_->Set(key, HostCache::Entry(rv, addr), base::TimeTicks::Now(), ttl); | 231 cache_->Set(key, HostCache::Entry(rv, addr), base::TimeTicks::Now(), ttl); |
| 204 } | 232 } |
| 205 if (rv == OK) | 233 if (rv == OK) |
| 206 *addresses = AddressList::CopyWithPort(addr, info.port()); | 234 *addresses = AddressList::CopyWithPort(addr, info.port()); |
| 207 return rv; | 235 return rv; |
| 208 } | 236 } |
| 209 | 237 |
| 210 void MockHostResolverBase::ResolveNow(size_t id) { | 238 void MockHostResolverBase::ResolveNow(size_t id) { |
| 211 RequestMap::iterator it = requests_.find(id); | 239 RequestMap::iterator it = requests_.find(id); |
| 212 if (it == requests_.end()) | 240 if (it == requests_.end()) |
| 213 return; // was canceled | 241 return; // was canceled |
| 214 | 242 |
| 215 std::unique_ptr<Request> req(it->second); | 243 RequestImpl* req = it->second; |
| 216 requests_.erase(it); | 244 requests_.erase(it); |
| 217 int rv = ResolveProc(id, req->info, req->addresses); | 245 |
| 218 if (!req->callback.is_null()) | 246 int error = ResolveProc(req->info(), req->addresses()); |
| 219 req->callback.Run(rv); | 247 req->OnResolveCompleted(this, error); |
| 220 } | 248 } |
| 221 | 249 |
| 222 //----------------------------------------------------------------------------- | 250 //----------------------------------------------------------------------------- |
| 223 | 251 |
| 224 struct RuleBasedHostResolverProc::Rule { | 252 struct RuleBasedHostResolverProc::Rule { |
| 225 enum ResolverType { | 253 enum ResolverType { |
| 226 kResolverTypeFail, | 254 kResolverTypeFail, |
| 227 kResolverTypeSystem, | 255 kResolverTypeSystem, |
| 228 kResolverTypeIPLiteral, | 256 kResolverTypeIPLiteral, |
| 229 }; | 257 }; |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 418 // Next add a rules-based layer the use controls. | 446 // Next add a rules-based layer the use controls. |
| 419 return new RuleBasedHostResolverProc(catchall); | 447 return new RuleBasedHostResolverProc(catchall); |
| 420 } | 448 } |
| 421 | 449 |
| 422 //----------------------------------------------------------------------------- | 450 //----------------------------------------------------------------------------- |
| 423 | 451 |
| 424 int HangingHostResolver::Resolve(const RequestInfo& info, | 452 int HangingHostResolver::Resolve(const RequestInfo& info, |
| 425 RequestPriority priority, | 453 RequestPriority priority, |
| 426 AddressList* addresses, | 454 AddressList* addresses, |
| 427 const CompletionCallback& callback, | 455 const CompletionCallback& callback, |
| 428 RequestHandle* out_req, | 456 std::unique_ptr<Request>* request, |
| 429 const BoundNetLog& net_log) { | 457 const BoundNetLog& net_log) { |
| 430 return ERR_IO_PENDING; | 458 return ERR_IO_PENDING; |
| 431 } | 459 } |
| 432 | 460 |
| 433 int HangingHostResolver::ResolveFromCache(const RequestInfo& info, | 461 int HangingHostResolver::ResolveFromCache(const RequestInfo& info, |
| 434 AddressList* addresses, | 462 AddressList* addresses, |
| 435 const BoundNetLog& net_log) { | 463 const BoundNetLog& net_log) { |
| 436 return ERR_DNS_CACHE_MISS; | 464 return ERR_DNS_CACHE_MISS; |
| 437 } | 465 } |
| 438 | 466 |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 452 CHECK_EQ(old_proc, current_proc_.get()); | 480 CHECK_EQ(old_proc, current_proc_.get()); |
| 453 } | 481 } |
| 454 | 482 |
| 455 void ScopedDefaultHostResolverProc::Init(HostResolverProc* proc) { | 483 void ScopedDefaultHostResolverProc::Init(HostResolverProc* proc) { |
| 456 current_proc_ = proc; | 484 current_proc_ = proc; |
| 457 previous_proc_ = HostResolverProc::SetDefault(current_proc_.get()); | 485 previous_proc_ = HostResolverProc::SetDefault(current_proc_.get()); |
| 458 current_proc_->SetLastProc(previous_proc_.get()); | 486 current_proc_->SetLastProc(previous_proc_.get()); |
| 459 } | 487 } |
| 460 | 488 |
| 461 } // namespace net | 489 } // namespace net |
| OLD | NEW |