Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(244)

Side by Side Diff: net/dns/mock_host_resolver.cc

Issue 2116983002: Change HostResolver::Resolve() to take an std::unique_ptr<Request>* rather than a RequestHandle* (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: changed implementation of attach/detach of request Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698