| 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 |