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 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
110 | 110 |
111 void MockHostResolverBase::CancelRequest(RequestHandle handle) { | 111 void MockHostResolverBase::CancelRequest(RequestHandle handle) { |
112 DCHECK(CalledOnValidThread()); | 112 DCHECK(CalledOnValidThread()); |
113 size_t id = reinterpret_cast<size_t>(handle); | 113 size_t id = reinterpret_cast<size_t>(handle); |
114 RequestMap::iterator it = requests_.find(id); | 114 RequestMap::iterator it = requests_.find(id); |
115 if (it != requests_.end()) { | 115 if (it != requests_.end()) { |
116 scoped_ptr<Request> req(it->second); | 116 scoped_ptr<Request> req(it->second); |
117 requests_.erase(it); | 117 requests_.erase(it); |
118 } else { | 118 } else { |
119 NOTREACHED() << "CancelRequest must NOT be called after request is " | 119 NOTREACHED() << "CancelRequest must NOT be called after request is " |
120 "complete or canceled."; | 120 "complete or canceled."; |
121 } | 121 } |
122 } | 122 } |
123 | 123 |
124 HostCache* MockHostResolverBase::GetHostCache() { | 124 HostCache* MockHostResolverBase::GetHostCache() { |
125 return cache_.get(); | 125 return cache_.get(); |
126 } | 126 } |
127 | 127 |
128 void MockHostResolverBase::ResolveAllPending() { | 128 void MockHostResolverBase::ResolveAllPending() { |
129 DCHECK(CalledOnValidThread()); | 129 DCHECK(CalledOnValidThread()); |
130 DCHECK(ondemand_mode_); | 130 DCHECK(ondemand_mode_); |
(...skipping 23 matching lines...) Expand all Loading... |
154 AddressList* addresses) { | 154 AddressList* addresses) { |
155 IPAddressNumber ip; | 155 IPAddressNumber ip; |
156 if (ParseIPLiteralToNumber(info.hostname(), &ip)) { | 156 if (ParseIPLiteralToNumber(info.hostname(), &ip)) { |
157 *addresses = AddressList::CreateFromIPAddress(ip, info.port()); | 157 *addresses = AddressList::CreateFromIPAddress(ip, info.port()); |
158 if (info.host_resolver_flags() & HOST_RESOLVER_CANONNAME) | 158 if (info.host_resolver_flags() & HOST_RESOLVER_CANONNAME) |
159 addresses->SetDefaultCanonicalName(); | 159 addresses->SetDefaultCanonicalName(); |
160 return OK; | 160 return OK; |
161 } | 161 } |
162 int rv = ERR_DNS_CACHE_MISS; | 162 int rv = ERR_DNS_CACHE_MISS; |
163 if (cache_.get() && info.allow_cached_response()) { | 163 if (cache_.get() && info.allow_cached_response()) { |
164 HostCache::Key key(info.hostname(), | 164 HostCache::Key key( |
165 info.address_family(), | 165 info.hostname(), info.address_family(), info.host_resolver_flags()); |
166 info.host_resolver_flags()); | |
167 const HostCache::Entry* entry = cache_->Lookup(key, base::TimeTicks::Now()); | 166 const HostCache::Entry* entry = cache_->Lookup(key, base::TimeTicks::Now()); |
168 if (entry) { | 167 if (entry) { |
169 rv = entry->error; | 168 rv = entry->error; |
170 if (rv == OK) | 169 if (rv == OK) |
171 *addresses = AddressList::CopyWithPort(entry->addrlist, info.port()); | 170 *addresses = AddressList::CopyWithPort(entry->addrlist, info.port()); |
172 } | 171 } |
173 } | 172 } |
174 return rv; | 173 return rv; |
175 } | 174 } |
176 | 175 |
177 int MockHostResolverBase::ResolveProc(size_t id, | 176 int MockHostResolverBase::ResolveProc(size_t id, |
178 const RequestInfo& info, | 177 const RequestInfo& info, |
179 AddressList* addresses) { | 178 AddressList* addresses) { |
180 AddressList addr; | 179 AddressList addr; |
181 int rv = rules_->Resolve(info.hostname(), | 180 int rv = rules_->Resolve(info.hostname(), |
182 info.address_family(), | 181 info.address_family(), |
183 info.host_resolver_flags(), | 182 info.host_resolver_flags(), |
184 &addr, | 183 &addr, |
185 NULL); | 184 NULL); |
186 if (cache_.get()) { | 185 if (cache_.get()) { |
187 HostCache::Key key(info.hostname(), | 186 HostCache::Key key( |
188 info.address_family(), | 187 info.hostname(), info.address_family(), info.host_resolver_flags()); |
189 info.host_resolver_flags()); | |
190 // Storing a failure with TTL 0 so that it overwrites previous value. | 188 // Storing a failure with TTL 0 so that it overwrites previous value. |
191 base::TimeDelta ttl; | 189 base::TimeDelta ttl; |
192 if (rv == OK) | 190 if (rv == OK) |
193 ttl = base::TimeDelta::FromSeconds(kCacheEntryTTLSeconds); | 191 ttl = base::TimeDelta::FromSeconds(kCacheEntryTTLSeconds); |
194 cache_->Set(key, HostCache::Entry(rv, addr), base::TimeTicks::Now(), ttl); | 192 cache_->Set(key, HostCache::Entry(rv, addr), base::TimeTicks::Now(), ttl); |
195 } | 193 } |
196 if (rv == OK) | 194 if (rv == OK) |
197 *addresses = AddressList::CopyWithPort(addr, info.port()); | 195 *addresses = AddressList::CopyWithPort(addr, info.port()); |
198 return rv; | 196 return rv; |
199 } | 197 } |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
242 canonical_name(canonical_name), | 240 canonical_name(canonical_name), |
243 latency_ms(latency_ms) {} | 241 latency_ms(latency_ms) {} |
244 }; | 242 }; |
245 | 243 |
246 RuleBasedHostResolverProc::RuleBasedHostResolverProc(HostResolverProc* previous) | 244 RuleBasedHostResolverProc::RuleBasedHostResolverProc(HostResolverProc* previous) |
247 : HostResolverProc(previous) { | 245 : HostResolverProc(previous) { |
248 } | 246 } |
249 | 247 |
250 void RuleBasedHostResolverProc::AddRule(const std::string& host_pattern, | 248 void RuleBasedHostResolverProc::AddRule(const std::string& host_pattern, |
251 const std::string& replacement) { | 249 const std::string& replacement) { |
252 AddRuleForAddressFamily(host_pattern, ADDRESS_FAMILY_UNSPECIFIED, | 250 AddRuleForAddressFamily( |
253 replacement); | 251 host_pattern, ADDRESS_FAMILY_UNSPECIFIED, replacement); |
254 } | 252 } |
255 | 253 |
256 void RuleBasedHostResolverProc::AddRuleForAddressFamily( | 254 void RuleBasedHostResolverProc::AddRuleForAddressFamily( |
257 const std::string& host_pattern, | 255 const std::string& host_pattern, |
258 AddressFamily address_family, | 256 AddressFamily address_family, |
259 const std::string& replacement) { | 257 const std::string& replacement) { |
260 DCHECK(!replacement.empty()); | 258 DCHECK(!replacement.empty()); |
261 HostResolverFlags flags = HOST_RESOLVER_LOOPBACK_ONLY | | 259 HostResolverFlags flags = HOST_RESOLVER_LOOPBACK_ONLY | |
262 HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6; | 260 HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6; |
263 Rule rule(Rule::kResolverTypeSystem, | 261 Rule rule(Rule::kResolverTypeSystem, |
264 host_pattern, | 262 host_pattern, |
265 address_family, | 263 address_family, |
266 flags, | 264 flags, |
267 replacement, | 265 replacement, |
268 std::string(), | 266 std::string(), |
269 0); | 267 0); |
270 rules_.push_back(rule); | 268 rules_.push_back(rule); |
271 } | 269 } |
272 | 270 |
273 void RuleBasedHostResolverProc::AddIPLiteralRule( | 271 void RuleBasedHostResolverProc::AddIPLiteralRule( |
274 const std::string& host_pattern, | 272 const std::string& host_pattern, |
275 const std::string& ip_literal, | 273 const std::string& ip_literal, |
276 const std::string& canonical_name) { | 274 const std::string& canonical_name) { |
277 // Literals are always resolved to themselves by HostResolverImpl, | 275 // Literals are always resolved to themselves by HostResolverImpl, |
278 // consequently we do not support remapping them. | 276 // consequently we do not support remapping them. |
279 IPAddressNumber ip_number; | 277 IPAddressNumber ip_number; |
280 DCHECK(!ParseIPLiteralToNumber(host_pattern, &ip_number)); | 278 DCHECK(!ParseIPLiteralToNumber(host_pattern, &ip_number)); |
281 HostResolverFlags flags = HOST_RESOLVER_LOOPBACK_ONLY | | 279 HostResolverFlags flags = HOST_RESOLVER_LOOPBACK_ONLY | |
282 HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6; | 280 HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6; |
283 if (!canonical_name.empty()) | 281 if (!canonical_name.empty()) |
284 flags |= HOST_RESOLVER_CANONNAME; | 282 flags |= HOST_RESOLVER_CANONNAME; |
285 Rule rule(Rule::kResolverTypeIPLiteral, host_pattern, | 283 Rule rule(Rule::kResolverTypeIPLiteral, |
286 ADDRESS_FAMILY_UNSPECIFIED, flags, ip_literal, canonical_name, | 284 host_pattern, |
| 285 ADDRESS_FAMILY_UNSPECIFIED, |
| 286 flags, |
| 287 ip_literal, |
| 288 canonical_name, |
287 0); | 289 0); |
288 rules_.push_back(rule); | 290 rules_.push_back(rule); |
289 } | 291 } |
290 | 292 |
291 void RuleBasedHostResolverProc::AddRuleWithLatency( | 293 void RuleBasedHostResolverProc::AddRuleWithLatency( |
292 const std::string& host_pattern, | 294 const std::string& host_pattern, |
293 const std::string& replacement, | 295 const std::string& replacement, |
294 int latency_ms) { | 296 int latency_ms) { |
295 DCHECK(!replacement.empty()); | 297 DCHECK(!replacement.empty()); |
296 HostResolverFlags flags = HOST_RESOLVER_LOOPBACK_ONLY | | 298 HostResolverFlags flags = HOST_RESOLVER_LOOPBACK_ONLY | |
297 HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6; | 299 HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6; |
298 Rule rule(Rule::kResolverTypeSystem, | 300 Rule rule(Rule::kResolverTypeSystem, |
299 host_pattern, | 301 host_pattern, |
300 ADDRESS_FAMILY_UNSPECIFIED, | 302 ADDRESS_FAMILY_UNSPECIFIED, |
301 flags, | 303 flags, |
302 replacement, | 304 replacement, |
303 std::string(), | 305 std::string(), |
304 latency_ms); | 306 latency_ms); |
305 rules_.push_back(rule); | 307 rules_.push_back(rule); |
306 } | 308 } |
307 | 309 |
308 void RuleBasedHostResolverProc::AllowDirectLookup( | 310 void RuleBasedHostResolverProc::AllowDirectLookup( |
309 const std::string& host_pattern) { | 311 const std::string& host_pattern) { |
310 HostResolverFlags flags = HOST_RESOLVER_LOOPBACK_ONLY | | 312 HostResolverFlags flags = HOST_RESOLVER_LOOPBACK_ONLY | |
311 HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6; | 313 HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6; |
312 Rule rule(Rule::kResolverTypeSystem, | 314 Rule rule(Rule::kResolverTypeSystem, |
313 host_pattern, | 315 host_pattern, |
314 ADDRESS_FAMILY_UNSPECIFIED, | 316 ADDRESS_FAMILY_UNSPECIFIED, |
315 flags, | 317 flags, |
316 std::string(), | 318 std::string(), |
317 std::string(), | 319 std::string(), |
318 0); | 320 0); |
319 rules_.push_back(rule); | 321 rules_.push_back(rule); |
320 } | 322 } |
321 | 323 |
322 void RuleBasedHostResolverProc::AddSimulatedFailure( | 324 void RuleBasedHostResolverProc::AddSimulatedFailure( |
323 const std::string& host_pattern) { | 325 const std::string& host_pattern) { |
324 HostResolverFlags flags = HOST_RESOLVER_LOOPBACK_ONLY | | 326 HostResolverFlags flags = HOST_RESOLVER_LOOPBACK_ONLY | |
325 HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6; | 327 HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6; |
326 Rule rule(Rule::kResolverTypeFail, | 328 Rule rule(Rule::kResolverTypeFail, |
327 host_pattern, | 329 host_pattern, |
328 ADDRESS_FAMILY_UNSPECIFIED, | 330 ADDRESS_FAMILY_UNSPECIFIED, |
329 flags, | 331 flags, |
330 std::string(), | 332 std::string(), |
331 std::string(), | 333 std::string(), |
332 0); | 334 0); |
333 rules_.push_back(rule); | 335 rules_.push_back(rule); |
334 } | 336 } |
335 | 337 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
370 switch (r->resolver_type) { | 372 switch (r->resolver_type) { |
371 case Rule::kResolverTypeFail: | 373 case Rule::kResolverTypeFail: |
372 return ERR_NAME_NOT_RESOLVED; | 374 return ERR_NAME_NOT_RESOLVED; |
373 case Rule::kResolverTypeSystem: | 375 case Rule::kResolverTypeSystem: |
374 #if defined(OS_WIN) | 376 #if defined(OS_WIN) |
375 net::EnsureWinsockInit(); | 377 net::EnsureWinsockInit(); |
376 #endif | 378 #endif |
377 return SystemHostResolverCall(effective_host, | 379 return SystemHostResolverCall(effective_host, |
378 address_family, | 380 address_family, |
379 host_resolver_flags, | 381 host_resolver_flags, |
380 addrlist, os_error); | 382 addrlist, |
| 383 os_error); |
381 case Rule::kResolverTypeIPLiteral: | 384 case Rule::kResolverTypeIPLiteral: |
382 return ParseAddressList(effective_host, | 385 return ParseAddressList(effective_host, r->canonical_name, addrlist); |
383 r->canonical_name, | |
384 addrlist); | |
385 default: | 386 default: |
386 NOTREACHED(); | 387 NOTREACHED(); |
387 return ERR_UNEXPECTED; | 388 return ERR_UNEXPECTED; |
388 } | 389 } |
389 } | 390 } |
390 } | 391 } |
391 return ResolveUsingPrevious(host, address_family, | 392 return ResolveUsingPrevious( |
392 host_resolver_flags, addrlist, os_error); | 393 host, address_family, host_resolver_flags, addrlist, os_error); |
393 } | 394 } |
394 | 395 |
395 RuleBasedHostResolverProc::~RuleBasedHostResolverProc() { | 396 RuleBasedHostResolverProc::~RuleBasedHostResolverProc() { |
396 } | 397 } |
397 | 398 |
398 RuleBasedHostResolverProc* CreateCatchAllHostResolverProc() { | 399 RuleBasedHostResolverProc* CreateCatchAllHostResolverProc() { |
399 RuleBasedHostResolverProc* catchall = new RuleBasedHostResolverProc(NULL); | 400 RuleBasedHostResolverProc* catchall = new RuleBasedHostResolverProc(NULL); |
400 catchall->AddIPLiteralRule("*", "127.0.0.1", "localhost"); | 401 catchall->AddIPLiteralRule("*", "127.0.0.1", "localhost"); |
401 | 402 |
402 // Next add a rules-based layer the use controls. | 403 // Next add a rules-based layer the use controls. |
(...skipping 12 matching lines...) Expand all Loading... |
415 } | 416 } |
416 | 417 |
417 int HangingHostResolver::ResolveFromCache(const RequestInfo& info, | 418 int HangingHostResolver::ResolveFromCache(const RequestInfo& info, |
418 AddressList* addresses, | 419 AddressList* addresses, |
419 const BoundNetLog& net_log) { | 420 const BoundNetLog& net_log) { |
420 return ERR_DNS_CACHE_MISS; | 421 return ERR_DNS_CACHE_MISS; |
421 } | 422 } |
422 | 423 |
423 //----------------------------------------------------------------------------- | 424 //----------------------------------------------------------------------------- |
424 | 425 |
425 ScopedDefaultHostResolverProc::ScopedDefaultHostResolverProc() {} | 426 ScopedDefaultHostResolverProc::ScopedDefaultHostResolverProc() { |
| 427 } |
426 | 428 |
427 ScopedDefaultHostResolverProc::ScopedDefaultHostResolverProc( | 429 ScopedDefaultHostResolverProc::ScopedDefaultHostResolverProc( |
428 HostResolverProc* proc) { | 430 HostResolverProc* proc) { |
429 Init(proc); | 431 Init(proc); |
430 } | 432 } |
431 | 433 |
432 ScopedDefaultHostResolverProc::~ScopedDefaultHostResolverProc() { | 434 ScopedDefaultHostResolverProc::~ScopedDefaultHostResolverProc() { |
433 HostResolverProc* old_proc = | 435 HostResolverProc* old_proc = |
434 HostResolverProc::SetDefault(previous_proc_.get()); | 436 HostResolverProc::SetDefault(previous_proc_.get()); |
435 // The lifetimes of multiple instances must be nested. | 437 // The lifetimes of multiple instances must be nested. |
436 CHECK_EQ(old_proc, current_proc_); | 438 CHECK_EQ(old_proc, current_proc_); |
437 } | 439 } |
438 | 440 |
439 void ScopedDefaultHostResolverProc::Init(HostResolverProc* proc) { | 441 void ScopedDefaultHostResolverProc::Init(HostResolverProc* proc) { |
440 current_proc_ = proc; | 442 current_proc_ = proc; |
441 previous_proc_ = HostResolverProc::SetDefault(current_proc_.get()); | 443 previous_proc_ = HostResolverProc::SetDefault(current_proc_.get()); |
442 current_proc_->SetLastProc(previous_proc_.get()); | 444 current_proc_->SetLastProc(previous_proc_.get()); |
443 } | 445 } |
444 | 446 |
445 } // namespace net | 447 } // namespace net |
OLD | NEW |