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

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: 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"
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698