| 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/http/http_server_properties_impl.h" | 5 #include "net/http/http_server_properties_impl.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
| (...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 314 if (alternate.protocol == UNINITIALIZED_ALTERNATE_PROTOCOL) { | 314 if (alternate.protocol == UNINITIALIZED_ALTERNATE_PROTOCOL) { |
| 315 LOG(DFATAL) << "Trying to mark unknown alternate protocol broken."; | 315 LOG(DFATAL) << "Trying to mark unknown alternate protocol broken."; |
| 316 return; | 316 return; |
| 317 } | 317 } |
| 318 // This server's alternate protocol information is coming from a canonical | 318 // This server's alternate protocol information is coming from a canonical |
| 319 // server. Add an entry in the map for this server explicitly so that | 319 // server. Add an entry in the map for this server explicitly so that |
| 320 // it can be marked as broken. | 320 // it can be marked as broken. |
| 321 it = alternate_protocol_map_.Put(server, alternate); | 321 it = alternate_protocol_map_.Put(server, alternate); |
| 322 } | 322 } |
| 323 it->second.is_broken = true; | 323 it->second.is_broken = true; |
| 324 int count = ++broken_alternate_protocol_map_[server]; | 324 const BrokenAlternateProtocolEntry entry(server, alternate.port, |
| 325 alternate.protocol); |
| 326 int count = ++broken_alternate_protocol_map_[entry]; |
| 325 base::TimeDelta delay = | 327 base::TimeDelta delay = |
| 326 base::TimeDelta::FromSeconds(kBrokenAlternateProtocolDelaySecs); | 328 base::TimeDelta::FromSeconds(kBrokenAlternateProtocolDelaySecs); |
| 327 BrokenAlternateProtocolEntry entry; | 329 base::TimeTicks when = base::TimeTicks::Now() + delay * (1 << (count - 1)); |
| 328 entry.server = server; | 330 broken_alternate_protocol_list_.push_back( |
| 329 entry.when = base::TimeTicks::Now() + delay * (1 << (count - 1)); | 331 BrokenAlternateProtocolEntryWithTime(entry, when)); |
| 330 broken_alternate_protocol_list_.push_back(entry); | |
| 331 | 332 |
| 332 // Do not leave this host as canonical so that we don't infer the other | 333 // Do not leave this host as canonical so that we don't infer the other |
| 333 // hosts are also broken without testing them first. | 334 // hosts are also broken without testing them first. |
| 334 RemoveCanonicalHost(server); | 335 RemoveCanonicalHost(server); |
| 335 | 336 |
| 336 // If this is the only entry in the list, schedule an expiration task. | 337 // If this is the only entry in the list, schedule an expiration task. |
| 337 // Otherwise it will be rescheduled automatically when the pending task runs. | 338 // Otherwise it will be rescheduled automatically when the pending task runs. |
| 338 if (broken_alternate_protocol_list_.size() == 1) { | 339 if (broken_alternate_protocol_list_.size() == 1) { |
| 339 ScheduleBrokenAlternateProtocolMappingsExpiration(); | 340 ScheduleBrokenAlternateProtocolMappingsExpiration(); |
| 340 } | 341 } |
| 341 } | 342 } |
| 342 | 343 |
| 343 bool HttpServerPropertiesImpl::WasAlternateProtocolRecentlyBroken( | 344 bool HttpServerPropertiesImpl::WasAlternateProtocolRecentlyBroken( |
| 344 const HostPortPair& server) { | 345 const HostPortPair& server) { |
| 345 return ContainsKey(broken_alternate_protocol_map_, server); | 346 const AlternateProtocolInfo alternate_protocol = GetAlternateProtocol(server); |
| 347 if (alternate_protocol.protocol == UNINITIALIZED_ALTERNATE_PROTOCOL) |
| 348 return false; |
| 349 const BrokenAlternateProtocolEntry entry(server, alternate_protocol.port, |
| 350 alternate_protocol.protocol); |
| 351 return ContainsKey(broken_alternate_protocol_map_, entry); |
| 346 } | 352 } |
| 347 | 353 |
| 348 void HttpServerPropertiesImpl::ConfirmAlternateProtocol( | 354 void HttpServerPropertiesImpl::ConfirmAlternateProtocol( |
| 349 const HostPortPair& server) { | 355 const HostPortPair& server) { |
| 350 broken_alternate_protocol_map_.erase(server); | 356 const AlternateProtocolInfo alternate_protocol = GetAlternateProtocol(server); |
| 357 if (alternate_protocol.protocol == UNINITIALIZED_ALTERNATE_PROTOCOL) |
| 358 return; |
| 359 const BrokenAlternateProtocolEntry entry(server, alternate_protocol.port, |
| 360 alternate_protocol.protocol); |
| 361 broken_alternate_protocol_map_.erase(entry); |
| 351 } | 362 } |
| 352 | 363 |
| 353 void HttpServerPropertiesImpl::ClearAlternateProtocol( | 364 void HttpServerPropertiesImpl::ClearAlternateProtocol( |
| 354 const HostPortPair& server) { | 365 const HostPortPair& server) { |
| 355 AlternateProtocolMap::iterator it = alternate_protocol_map_.Peek(server); | 366 AlternateProtocolMap::iterator it = alternate_protocol_map_.Peek(server); |
| 356 if (it != alternate_protocol_map_.end()) | 367 if (it != alternate_protocol_map_.end()) |
| 357 alternate_protocol_map_.Erase(it); | 368 alternate_protocol_map_.Erase(it); |
| 358 | 369 |
| 359 RemoveCanonicalHost(server); | 370 RemoveCanonicalHost(server); |
| 360 } | 371 } |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 494 | 505 |
| 495 if (!canonical->second.Equals(server)) | 506 if (!canonical->second.Equals(server)) |
| 496 return; | 507 return; |
| 497 | 508 |
| 498 canonical_host_to_origin_map_.erase(canonical->first); | 509 canonical_host_to_origin_map_.erase(canonical->first); |
| 499 } | 510 } |
| 500 | 511 |
| 501 void HttpServerPropertiesImpl::ExpireBrokenAlternateProtocolMappings() { | 512 void HttpServerPropertiesImpl::ExpireBrokenAlternateProtocolMappings() { |
| 502 base::TimeTicks now = base::TimeTicks::Now(); | 513 base::TimeTicks now = base::TimeTicks::Now(); |
| 503 while (!broken_alternate_protocol_list_.empty()) { | 514 while (!broken_alternate_protocol_list_.empty()) { |
| 504 BrokenAlternateProtocolEntry entry = | 515 BrokenAlternateProtocolEntryWithTime entry_with_time = |
| 505 broken_alternate_protocol_list_.front(); | 516 broken_alternate_protocol_list_.front(); |
| 506 if (now < entry.when) { | 517 if (now < entry_with_time.when) { |
| 507 break; | 518 break; |
| 508 } | 519 } |
| 509 | 520 |
| 521 const BrokenAlternateProtocolEntry& entry = |
| 522 entry_with_time.broken_alternate_protocol_entry; |
| 510 ClearAlternateProtocol(entry.server); | 523 ClearAlternateProtocol(entry.server); |
| 511 broken_alternate_protocol_list_.pop_front(); | 524 broken_alternate_protocol_list_.pop_front(); |
| 512 } | 525 } |
| 513 ScheduleBrokenAlternateProtocolMappingsExpiration(); | 526 ScheduleBrokenAlternateProtocolMappingsExpiration(); |
| 514 } | 527 } |
| 515 | 528 |
| 516 void | 529 void |
| 517 HttpServerPropertiesImpl::ScheduleBrokenAlternateProtocolMappingsExpiration() { | 530 HttpServerPropertiesImpl::ScheduleBrokenAlternateProtocolMappingsExpiration() { |
| 518 if (broken_alternate_protocol_list_.empty()) { | 531 if (broken_alternate_protocol_list_.empty()) { |
| 519 return; | 532 return; |
| 520 } | 533 } |
| 521 base::TimeTicks now = base::TimeTicks::Now(); | 534 base::TimeTicks now = base::TimeTicks::Now(); |
| 522 base::TimeTicks when = broken_alternate_protocol_list_.front().when; | 535 base::TimeTicks when = broken_alternate_protocol_list_.front().when; |
| 523 base::TimeDelta delay = when > now ? when - now : base::TimeDelta(); | 536 base::TimeDelta delay = when > now ? when - now : base::TimeDelta(); |
| 524 base::MessageLoop::current()->PostDelayedTask( | 537 base::MessageLoop::current()->PostDelayedTask( |
| 525 FROM_HERE, | 538 FROM_HERE, |
| 526 base::Bind( | 539 base::Bind( |
| 527 &HttpServerPropertiesImpl::ExpireBrokenAlternateProtocolMappings, | 540 &HttpServerPropertiesImpl::ExpireBrokenAlternateProtocolMappings, |
| 528 weak_ptr_factory_.GetWeakPtr()), | 541 weak_ptr_factory_.GetWeakPtr()), |
| 529 delay); | 542 delay); |
| 530 } | 543 } |
| 531 | 544 |
| 532 } // namespace net | 545 } // namespace net |
| OLD | NEW |