| 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" |
| 11 #include "base/metrics/histogram.h" | 11 #include "base/metrics/histogram.h" |
| 12 #include "base/stl_util.h" | 12 #include "base/stl_util.h" |
| 13 #include "base/strings/string_util.h" | 13 #include "base/strings/string_util.h" |
| 14 #include "base/strings/stringprintf.h" | 14 #include "base/strings/stringprintf.h" |
| 15 #include "base/values.h" | 15 #include "base/values.h" |
| 16 | 16 |
| 17 namespace net { | 17 namespace net { |
| 18 | 18 |
| 19 namespace { | 19 namespace { |
| 20 | 20 |
| 21 const uint64 kBrokenAlternativeProtocolDelaySecs = 300; | 21 const uint64 kBrokenAlternativeProtocolDelaySecs = 300; |
| 22 | 22 |
| 23 } // namespace | 23 } // namespace |
| 24 | 24 |
| 25 HttpServerPropertiesImpl::HttpServerPropertiesImpl() | 25 HttpServerPropertiesImpl::HttpServerPropertiesImpl() |
| 26 : spdy_servers_map_(SpdyServerHostPortMap::NO_AUTO_EVICT), | 26 : spdy_servers_map_(SpdyServerHostPortMap::NO_AUTO_EVICT), |
| 27 alternative_service_map_(AlternativeServiceMap::NO_AUTO_EVICT), | 27 alternative_service_map_(AlternativeServiceMap::NO_AUTO_EVICT), |
| 28 spdy_settings_map_(SpdySettingsMap::NO_AUTO_EVICT), | 28 spdy_settings_map_(SpdySettingsMap::NO_AUTO_EVICT), |
| 29 server_network_stats_map_(ServerNetworkStatsMap::NO_AUTO_EVICT), | 29 server_network_stats_map_(ServerNetworkStatsMap::NO_AUTO_EVICT), |
| 30 alternate_protocol_probability_threshold_(1), | 30 alternative_service_probability_threshold_(1.0), |
| 31 weak_ptr_factory_(this) { | 31 weak_ptr_factory_(this) { |
| 32 canonical_suffixes_.push_back(".c.youtube.com"); | 32 canonical_suffixes_.push_back(".c.youtube.com"); |
| 33 canonical_suffixes_.push_back(".googlevideo.com"); | 33 canonical_suffixes_.push_back(".googlevideo.com"); |
| 34 canonical_suffixes_.push_back(".googleusercontent.com"); | 34 canonical_suffixes_.push_back(".googleusercontent.com"); |
| 35 } | 35 } |
| 36 | 36 |
| 37 HttpServerPropertiesImpl::~HttpServerPropertiesImpl() { | 37 HttpServerPropertiesImpl::~HttpServerPropertiesImpl() { |
| 38 } | 38 } |
| 39 | 39 |
| 40 void HttpServerPropertiesImpl::InitializeSpdyServers( | 40 void HttpServerPropertiesImpl::InitializeSpdyServers( |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 220 } | 220 } |
| 221 } | 221 } |
| 222 return std::string(); | 222 return std::string(); |
| 223 } | 223 } |
| 224 | 224 |
| 225 AlternativeService HttpServerPropertiesImpl::GetAlternativeService( | 225 AlternativeService HttpServerPropertiesImpl::GetAlternativeService( |
| 226 const HostPortPair& origin) { | 226 const HostPortPair& origin) { |
| 227 AlternativeServiceMap::const_iterator it = | 227 AlternativeServiceMap::const_iterator it = |
| 228 alternative_service_map_.Get(origin); | 228 alternative_service_map_.Get(origin); |
| 229 if (it != alternative_service_map_.end()) { | 229 if (it != alternative_service_map_.end()) { |
| 230 if (it->second.probability < alternate_protocol_probability_threshold_) { | 230 if (it->second.probability < alternative_service_probability_threshold_) { |
| 231 return AlternativeService(); | 231 return AlternativeService(); |
| 232 } | 232 } |
| 233 AlternativeService alternative_service(it->second.alternative_service); | 233 AlternativeService alternative_service(it->second.alternative_service); |
| 234 if (alternative_service.host.empty()) { | 234 if (alternative_service.host.empty()) { |
| 235 alternative_service.host = origin.host(); | 235 alternative_service.host = origin.host(); |
| 236 } | 236 } |
| 237 return alternative_service; | 237 return alternative_service; |
| 238 } | 238 } |
| 239 | 239 |
| 240 CanonicalHostMap::const_iterator canonical = GetCanonicalHost(origin); | 240 CanonicalHostMap::const_iterator canonical = GetCanonicalHost(origin); |
| 241 if (canonical == canonical_host_to_origin_map_.end()) { | 241 if (canonical == canonical_host_to_origin_map_.end()) { |
| 242 return AlternativeService(); | 242 return AlternativeService(); |
| 243 } | 243 } |
| 244 it = alternative_service_map_.Get(canonical->second); | 244 it = alternative_service_map_.Get(canonical->second); |
| 245 if (it == alternative_service_map_.end()) { | 245 if (it == alternative_service_map_.end()) { |
| 246 return AlternativeService(); | 246 return AlternativeService(); |
| 247 } | 247 } |
| 248 if (it->second.probability < alternate_protocol_probability_threshold_) { | 248 if (it->second.probability < alternative_service_probability_threshold_) { |
| 249 return AlternativeService(); | 249 return AlternativeService(); |
| 250 } | 250 } |
| 251 AlternativeService alternative_service(it->second.alternative_service); | 251 AlternativeService alternative_service(it->second.alternative_service); |
| 252 if (alternative_service.host.empty()) { | 252 if (alternative_service.host.empty()) { |
| 253 alternative_service.host = canonical->second.host(); | 253 alternative_service.host = canonical->second.host(); |
| 254 } | 254 } |
| 255 if (IsAlternativeServiceBroken(alternative_service)) { | 255 if (IsAlternativeServiceBroken(alternative_service)) { |
| 256 RemoveCanonicalHost(canonical->second); | 256 RemoveCanonicalHost(canonical->second); |
| 257 return AlternativeService(); | 257 return AlternativeService(); |
| 258 } | 258 } |
| (...skipping 24 matching lines...) Expand all Loading... |
| 283 GetAlternateProtocolIterator(origin); | 283 GetAlternateProtocolIterator(origin); |
| 284 if (it != alternative_service_map_.end()) { | 284 if (it != alternative_service_map_.end()) { |
| 285 const AlternativeServiceInfo existing_alternative_service_info = it->second; | 285 const AlternativeServiceInfo existing_alternative_service_info = it->second; |
| 286 if (existing_alternative_service_info != alternative_service_info) { | 286 if (existing_alternative_service_info != alternative_service_info) { |
| 287 LOG(WARNING) << "Changing the alternative service for: " | 287 LOG(WARNING) << "Changing the alternative service for: " |
| 288 << origin.ToString() << " from " | 288 << origin.ToString() << " from " |
| 289 << existing_alternative_service_info.ToString() << " to " | 289 << existing_alternative_service_info.ToString() << " to " |
| 290 << alternative_service_info.ToString() << "."; | 290 << alternative_service_info.ToString() << "."; |
| 291 } | 291 } |
| 292 } else { | 292 } else { |
| 293 if (alternative_probability >= alternate_protocol_probability_threshold_) { | 293 if (alternative_probability >= alternative_service_probability_threshold_) { |
| 294 // TODO(rch): Consider the case where multiple requests are started | 294 // TODO(rch): Consider the case where multiple requests are started |
| 295 // before the first completes. In this case, only one of the jobs | 295 // before the first completes. In this case, only one of the jobs |
| 296 // would reach this code, whereas all of them should should have. | 296 // would reach this code, whereas all of them should should have. |
| 297 HistogramAlternateProtocolUsage(ALTERNATE_PROTOCOL_USAGE_MAPPING_MISSING); | 297 HistogramAlternateProtocolUsage(ALTERNATE_PROTOCOL_USAGE_MAPPING_MISSING); |
| 298 } | 298 } |
| 299 } | 299 } |
| 300 | 300 |
| 301 alternative_service_map_.Put(origin, alternative_service_info); | 301 alternative_service_map_.Put(origin, alternative_service_info); |
| 302 | 302 |
| 303 // If this host ends with a canonical suffix, then set it as the | 303 // If this host ends with a canonical suffix, then set it as the |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 499 return NULL; | 499 return NULL; |
| 500 } | 500 } |
| 501 return &it->second; | 501 return &it->second; |
| 502 } | 502 } |
| 503 | 503 |
| 504 const ServerNetworkStatsMap& | 504 const ServerNetworkStatsMap& |
| 505 HttpServerPropertiesImpl::server_network_stats_map() const { | 505 HttpServerPropertiesImpl::server_network_stats_map() const { |
| 506 return server_network_stats_map_; | 506 return server_network_stats_map_; |
| 507 } | 507 } |
| 508 | 508 |
| 509 void HttpServerPropertiesImpl::SetAlternateProtocolProbabilityThreshold( | 509 void HttpServerPropertiesImpl::SetAlternativeServiceProbabilityThreshold( |
| 510 double threshold) { | 510 double threshold) { |
| 511 alternate_protocol_probability_threshold_ = threshold; | 511 alternative_service_probability_threshold_ = threshold; |
| 512 } | 512 } |
| 513 | 513 |
| 514 AlternativeServiceMap::const_iterator | 514 AlternativeServiceMap::const_iterator |
| 515 HttpServerPropertiesImpl::GetAlternateProtocolIterator( | 515 HttpServerPropertiesImpl::GetAlternateProtocolIterator( |
| 516 const HostPortPair& server) { | 516 const HostPortPair& server) { |
| 517 AlternativeServiceMap::const_iterator it = | 517 AlternativeServiceMap::const_iterator it = |
| 518 alternative_service_map_.Get(server); | 518 alternative_service_map_.Get(server); |
| 519 if (it != alternative_service_map_.end()) | 519 if (it != alternative_service_map_.end()) |
| 520 return it; | 520 return it; |
| 521 | 521 |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 594 base::TimeDelta delay = when > now ? when - now : base::TimeDelta(); | 594 base::TimeDelta delay = when > now ? when - now : base::TimeDelta(); |
| 595 base::MessageLoop::current()->PostDelayedTask( | 595 base::MessageLoop::current()->PostDelayedTask( |
| 596 FROM_HERE, | 596 FROM_HERE, |
| 597 base::Bind( | 597 base::Bind( |
| 598 &HttpServerPropertiesImpl::ExpireBrokenAlternateProtocolMappings, | 598 &HttpServerPropertiesImpl::ExpireBrokenAlternateProtocolMappings, |
| 599 weak_ptr_factory_.GetWeakPtr()), | 599 weak_ptr_factory_.GetWeakPtr()), |
| 600 delay); | 600 delay); |
| 601 } | 601 } |
| 602 | 602 |
| 603 } // namespace net | 603 } // namespace net |
| OLD | NEW |