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 <algorithm> | 7 #include <algorithm> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 14 matching lines...) Expand all Loading... |
25 | 25 |
26 const uint64_t kBrokenAlternativeProtocolDelaySecs = 300; | 26 const uint64_t kBrokenAlternativeProtocolDelaySecs = 300; |
27 | 27 |
28 } // namespace | 28 } // namespace |
29 | 29 |
30 HttpServerPropertiesImpl::HttpServerPropertiesImpl() | 30 HttpServerPropertiesImpl::HttpServerPropertiesImpl() |
31 : spdy_servers_map_(SpdyServerHostPortMap::NO_AUTO_EVICT), | 31 : spdy_servers_map_(SpdyServerHostPortMap::NO_AUTO_EVICT), |
32 alternative_service_map_(AlternativeServiceMap::NO_AUTO_EVICT), | 32 alternative_service_map_(AlternativeServiceMap::NO_AUTO_EVICT), |
33 spdy_settings_map_(SpdySettingsMap::NO_AUTO_EVICT), | 33 spdy_settings_map_(SpdySettingsMap::NO_AUTO_EVICT), |
34 server_network_stats_map_(ServerNetworkStatsMap::NO_AUTO_EVICT), | 34 server_network_stats_map_(ServerNetworkStatsMap::NO_AUTO_EVICT), |
| 35 alternative_service_probability_threshold_(1.0), |
35 quic_server_info_map_(QuicServerInfoMap::NO_AUTO_EVICT), | 36 quic_server_info_map_(QuicServerInfoMap::NO_AUTO_EVICT), |
36 max_server_configs_stored_in_properties_(kMaxQuicServersToPersist), | 37 max_server_configs_stored_in_properties_(kMaxQuicServersToPersist), |
37 weak_ptr_factory_(this) { | 38 weak_ptr_factory_(this) { |
38 canonical_suffixes_.push_back(".c.youtube.com"); | 39 canonical_suffixes_.push_back(".c.youtube.com"); |
39 canonical_suffixes_.push_back(".googlevideo.com"); | 40 canonical_suffixes_.push_back(".googlevideo.com"); |
40 canonical_suffixes_.push_back(".googleusercontent.com"); | 41 canonical_suffixes_.push_back(".googleusercontent.com"); |
41 } | 42 } |
42 | 43 |
43 HttpServerPropertiesImpl::~HttpServerPropertiesImpl() { | 44 HttpServerPropertiesImpl::~HttpServerPropertiesImpl() { |
44 } | 45 } |
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
315 if (base::EndsWith(host, canonical_suffixes_[i], | 316 if (base::EndsWith(host, canonical_suffixes_[i], |
316 base::CompareCase::INSENSITIVE_ASCII)) { | 317 base::CompareCase::INSENSITIVE_ASCII)) { |
317 return canonical_suffix; | 318 return canonical_suffix; |
318 } | 319 } |
319 } | 320 } |
320 return std::string(); | 321 return std::string(); |
321 } | 322 } |
322 | 323 |
323 AlternativeServiceVector HttpServerPropertiesImpl::GetAlternativeServices( | 324 AlternativeServiceVector HttpServerPropertiesImpl::GetAlternativeServices( |
324 const HostPortPair& origin) { | 325 const HostPortPair& origin) { |
325 // Copy valid alternative services into |valid_alternative_services|. | 326 // Copy alternative services with probability greater than or equal to the |
326 AlternativeServiceVector valid_alternative_services; | 327 // threshold into |alternative_services_above_threshold|. |
| 328 AlternativeServiceVector alternative_services_above_threshold; |
327 const base::Time now = base::Time::Now(); | 329 const base::Time now = base::Time::Now(); |
328 AlternativeServiceMap::iterator map_it = alternative_service_map_.Get(origin); | 330 AlternativeServiceMap::iterator map_it = alternative_service_map_.Get(origin); |
329 if (map_it != alternative_service_map_.end()) { | 331 if (map_it != alternative_service_map_.end()) { |
330 for (AlternativeServiceInfoVector::iterator it = map_it->second.begin(); | 332 for (AlternativeServiceInfoVector::iterator it = map_it->second.begin(); |
331 it != map_it->second.end();) { | 333 it != map_it->second.end();) { |
332 if (it->expiration < now) { | 334 if (it->expiration < now) { |
333 it = map_it->second.erase(it); | 335 it = map_it->second.erase(it); |
334 continue; | 336 continue; |
335 } | 337 } |
| 338 if (it->probability == 0 || |
| 339 it->probability < alternative_service_probability_threshold_) { |
| 340 ++it; |
| 341 continue; |
| 342 } |
336 AlternativeService alternative_service(it->alternative_service); | 343 AlternativeService alternative_service(it->alternative_service); |
337 if (alternative_service.host.empty()) { | 344 if (alternative_service.host.empty()) { |
338 alternative_service.host = origin.host(); | 345 alternative_service.host = origin.host(); |
339 } | 346 } |
340 // If the alternative service is equivalent to the origin (same host, same | 347 // If the alternative service is equivalent to the origin (same host, same |
341 // port, and both TCP), then there is already a Job for it, so do not | 348 // port, and both TCP), then there is already a Job for it, so do not |
342 // return it here. | 349 // return it here. |
343 if (origin.Equals(alternative_service.host_port_pair()) && | 350 if (origin.Equals(alternative_service.host_port_pair()) && |
344 NPN_SPDY_MINIMUM_VERSION <= alternative_service.protocol && | 351 NPN_SPDY_MINIMUM_VERSION <= alternative_service.protocol && |
345 alternative_service.protocol <= NPN_SPDY_MAXIMUM_VERSION) { | 352 alternative_service.protocol <= NPN_SPDY_MAXIMUM_VERSION) { |
346 ++it; | 353 ++it; |
347 continue; | 354 continue; |
348 } | 355 } |
349 valid_alternative_services.push_back(alternative_service); | 356 alternative_services_above_threshold.push_back(alternative_service); |
350 ++it; | 357 ++it; |
351 } | 358 } |
352 if (map_it->second.empty()) { | 359 if (map_it->second.empty()) { |
353 alternative_service_map_.Erase(map_it); | 360 alternative_service_map_.Erase(map_it); |
354 } | 361 } |
355 return valid_alternative_services; | 362 return alternative_services_above_threshold; |
356 } | 363 } |
357 | 364 |
358 CanonicalHostMap::const_iterator canonical = GetCanonicalHost(origin); | 365 CanonicalHostMap::const_iterator canonical = GetCanonicalHost(origin); |
359 if (canonical == canonical_host_to_origin_map_.end()) { | 366 if (canonical == canonical_host_to_origin_map_.end()) { |
360 return AlternativeServiceVector(); | 367 return AlternativeServiceVector(); |
361 } | 368 } |
362 map_it = alternative_service_map_.Get(canonical->second); | 369 map_it = alternative_service_map_.Get(canonical->second); |
363 if (map_it == alternative_service_map_.end()) { | 370 if (map_it == alternative_service_map_.end()) { |
364 return AlternativeServiceVector(); | 371 return AlternativeServiceVector(); |
365 } | 372 } |
366 for (AlternativeServiceInfoVector::iterator it = map_it->second.begin(); | 373 for (AlternativeServiceInfoVector::iterator it = map_it->second.begin(); |
367 it != map_it->second.end();) { | 374 it != map_it->second.end();) { |
368 if (it->expiration < now) { | 375 if (it->expiration < now) { |
369 it = map_it->second.erase(it); | 376 it = map_it->second.erase(it); |
370 continue; | 377 continue; |
371 } | 378 } |
| 379 if (it->probability < alternative_service_probability_threshold_) { |
| 380 ++it; |
| 381 continue; |
| 382 } |
372 AlternativeService alternative_service(it->alternative_service); | 383 AlternativeService alternative_service(it->alternative_service); |
373 if (alternative_service.host.empty()) { | 384 if (alternative_service.host.empty()) { |
374 alternative_service.host = canonical->second.host(); | 385 alternative_service.host = canonical->second.host(); |
375 if (IsAlternativeServiceBroken(alternative_service)) { | 386 if (IsAlternativeServiceBroken(alternative_service)) { |
376 ++it; | 387 ++it; |
377 continue; | 388 continue; |
378 } | 389 } |
379 alternative_service.host = origin.host(); | 390 alternative_service.host = origin.host(); |
380 } else if (IsAlternativeServiceBroken(alternative_service)) { | 391 } else if (IsAlternativeServiceBroken(alternative_service)) { |
381 ++it; | 392 ++it; |
382 continue; | 393 continue; |
383 } | 394 } |
384 valid_alternative_services.push_back(alternative_service); | 395 alternative_services_above_threshold.push_back(alternative_service); |
385 ++it; | 396 ++it; |
386 } | 397 } |
387 if (map_it->second.empty()) { | 398 if (map_it->second.empty()) { |
388 alternative_service_map_.Erase(map_it); | 399 alternative_service_map_.Erase(map_it); |
389 } | 400 } |
390 return valid_alternative_services; | 401 return alternative_services_above_threshold; |
391 } | 402 } |
392 | 403 |
393 bool HttpServerPropertiesImpl::SetAlternativeService( | 404 bool HttpServerPropertiesImpl::SetAlternativeService( |
394 const HostPortPair& origin, | 405 const HostPortPair& origin, |
395 const AlternativeService& alternative_service, | 406 const AlternativeService& alternative_service, |
| 407 double alternative_probability, |
396 base::Time expiration) { | 408 base::Time expiration) { |
397 return SetAlternativeServices( | 409 return SetAlternativeServices( |
398 origin, | 410 origin, AlternativeServiceInfoVector( |
399 AlternativeServiceInfoVector( | 411 /*size=*/1, |
400 /*size=*/1, AlternativeServiceInfo(alternative_service, expiration))); | 412 AlternativeServiceInfo(alternative_service, |
| 413 alternative_probability, expiration))); |
401 } | 414 } |
402 | 415 |
403 bool HttpServerPropertiesImpl::SetAlternativeServices( | 416 bool HttpServerPropertiesImpl::SetAlternativeServices( |
404 const HostPortPair& origin, | 417 const HostPortPair& origin, |
405 const AlternativeServiceInfoVector& alternative_service_info_vector) { | 418 const AlternativeServiceInfoVector& alternative_service_info_vector) { |
406 AlternativeServiceMap::iterator it = alternative_service_map_.Peek(origin); | 419 AlternativeServiceMap::iterator it = alternative_service_map_.Peek(origin); |
407 | 420 |
408 if (alternative_service_info_vector.empty()) { | 421 if (alternative_service_info_vector.empty()) { |
409 if (it == alternative_service_map_.end()) { | 422 if (it == alternative_service_map_.end()) { |
410 return false; | 423 return false; |
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
677 quic_server_info_map_.ShrinkToSize(max_server_configs_stored_in_properties_); | 690 quic_server_info_map_.ShrinkToSize(max_server_configs_stored_in_properties_); |
678 QuicServerInfoMap temp_map(max_server_configs_stored_in_properties_); | 691 QuicServerInfoMap temp_map(max_server_configs_stored_in_properties_); |
679 for (QuicServerInfoMap::reverse_iterator it = quic_server_info_map_.rbegin(); | 692 for (QuicServerInfoMap::reverse_iterator it = quic_server_info_map_.rbegin(); |
680 it != quic_server_info_map_.rend(); ++it) { | 693 it != quic_server_info_map_.rend(); ++it) { |
681 temp_map.Put(it->first, it->second); | 694 temp_map.Put(it->first, it->second); |
682 } | 695 } |
683 | 696 |
684 quic_server_info_map_.Swap(temp_map); | 697 quic_server_info_map_.Swap(temp_map); |
685 } | 698 } |
686 | 699 |
| 700 void HttpServerPropertiesImpl::SetAlternativeServiceProbabilityThreshold( |
| 701 double threshold) { |
| 702 alternative_service_probability_threshold_ = threshold; |
| 703 } |
| 704 |
687 AlternativeServiceMap::const_iterator | 705 AlternativeServiceMap::const_iterator |
688 HttpServerPropertiesImpl::GetAlternateProtocolIterator( | 706 HttpServerPropertiesImpl::GetAlternateProtocolIterator( |
689 const HostPortPair& server) { | 707 const HostPortPair& server) { |
690 AlternativeServiceMap::const_iterator it = | 708 AlternativeServiceMap::const_iterator it = |
691 alternative_service_map_.Get(server); | 709 alternative_service_map_.Get(server); |
692 if (it != alternative_service_map_.end()) | 710 if (it != alternative_service_map_.end()) |
693 return it; | 711 return it; |
694 | 712 |
695 CanonicalHostMap::const_iterator canonical = GetCanonicalHost(server); | 713 CanonicalHostMap::const_iterator canonical = GetCanonicalHost(server); |
696 if (canonical == canonical_host_to_origin_map_.end()) { | 714 if (canonical == canonical_host_to_origin_map_.end()) { |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
799 base::TimeDelta delay = when > now ? when - now : base::TimeDelta(); | 817 base::TimeDelta delay = when > now ? when - now : base::TimeDelta(); |
800 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( | 818 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
801 FROM_HERE, | 819 FROM_HERE, |
802 base::Bind( | 820 base::Bind( |
803 &HttpServerPropertiesImpl::ExpireBrokenAlternateProtocolMappings, | 821 &HttpServerPropertiesImpl::ExpireBrokenAlternateProtocolMappings, |
804 weak_ptr_factory_.GetWeakPtr()), | 822 weak_ptr_factory_.GetWeakPtr()), |
805 delay); | 823 delay); |
806 } | 824 } |
807 | 825 |
808 } // namespace net | 826 } // namespace net |
OLD | NEW |