| 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 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 171 const HostPortPair& host_port_pair) { | 171 const HostPortPair& host_port_pair) { |
| 172 DCHECK(CalledOnValidThread()); | 172 DCHECK(CalledOnValidThread()); |
| 173 if (host_port_pair.host().empty()) | 173 if (host_port_pair.host().empty()) |
| 174 return false; | 174 return false; |
| 175 | 175 |
| 176 SpdyServerHostPortMap::iterator spdy_host_port = | 176 SpdyServerHostPortMap::iterator spdy_host_port = |
| 177 spdy_servers_map_.Get(host_port_pair.ToString()); | 177 spdy_servers_map_.Get(host_port_pair.ToString()); |
| 178 if (spdy_host_port != spdy_servers_map_.end() && spdy_host_port->second) | 178 if (spdy_host_port != spdy_servers_map_.end() && spdy_host_port->second) |
| 179 return true; | 179 return true; |
| 180 | 180 |
| 181 const AlternateProtocolInfo info = GetAlternateProtocol(host_port_pair); | 181 const AlternativeService alternative_service = |
| 182 return info.protocol == QUIC; | 182 GetAlternativeService(host_port_pair); |
| 183 return alternative_service.protocol == QUIC; |
| 183 } | 184 } |
| 184 | 185 |
| 185 void HttpServerPropertiesImpl::SetSupportsSpdy( | 186 void HttpServerPropertiesImpl::SetSupportsSpdy( |
| 186 const HostPortPair& host_port_pair, | 187 const HostPortPair& host_port_pair, |
| 187 bool support_spdy) { | 188 bool support_spdy) { |
| 188 DCHECK(CalledOnValidThread()); | 189 DCHECK(CalledOnValidThread()); |
| 189 if (host_port_pair.host().empty()) | 190 if (host_port_pair.host().empty()) |
| 190 return; | 191 return; |
| 191 | 192 |
| 192 SpdyServerHostPortMap::iterator spdy_host_port = | 193 SpdyServerHostPortMap::iterator spdy_host_port = |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 230 // suffix. | 231 // suffix. |
| 231 for (size_t i = 0; i < canonical_suffixes_.size(); ++i) { | 232 for (size_t i = 0; i < canonical_suffixes_.size(); ++i) { |
| 232 std::string canonical_suffix = canonical_suffixes_[i]; | 233 std::string canonical_suffix = canonical_suffixes_[i]; |
| 233 if (EndsWith(host, canonical_suffixes_[i], false)) { | 234 if (EndsWith(host, canonical_suffixes_[i], false)) { |
| 234 return canonical_suffix; | 235 return canonical_suffix; |
| 235 } | 236 } |
| 236 } | 237 } |
| 237 return std::string(); | 238 return std::string(); |
| 238 } | 239 } |
| 239 | 240 |
| 240 AlternateProtocolInfo HttpServerPropertiesImpl::GetAlternateProtocol( | 241 AlternativeService HttpServerPropertiesImpl::GetAlternativeService( |
| 241 const HostPortPair& server) { | 242 const HostPortPair& origin) { |
| 242 AlternateProtocolMap::const_iterator it = | 243 AlternateProtocolMap::const_iterator it = |
| 243 GetAlternateProtocolIterator(server); | 244 GetAlternateProtocolIterator(origin); |
| 244 if (it != alternate_protocol_map_.end() && | 245 if (it != alternate_protocol_map_.end() && |
| 245 it->second.probability >= alternate_protocol_probability_threshold_) | 246 it->second.probability >= alternate_protocol_probability_threshold_) |
| 246 return it->second; | 247 return AlternativeService(it->second.protocol, origin.host(), |
| 248 it->second.port); |
| 247 | 249 |
| 248 if (g_forced_alternate_protocol) | 250 if (g_forced_alternate_protocol) |
| 249 return *g_forced_alternate_protocol; | 251 return AlternativeService(g_forced_alternate_protocol->protocol, |
| 252 origin.host(), g_forced_alternate_protocol->port); |
| 250 | 253 |
| 251 AlternateProtocolInfo uninitialized_alternate_protocol; | 254 AlternativeService uninitialize_alternative_service; |
| 252 return uninitialized_alternate_protocol; | 255 return uninitialize_alternative_service; |
| 253 } | 256 } |
| 254 | 257 |
| 255 void HttpServerPropertiesImpl::SetAlternateProtocol( | 258 void HttpServerPropertiesImpl::SetAlternateProtocol( |
| 256 const HostPortPair& server, | 259 const HostPortPair& server, |
| 257 uint16 alternate_port, | 260 uint16 alternate_port, |
| 258 AlternateProtocol alternate_protocol, | 261 AlternateProtocol alternate_protocol, |
| 259 double alternate_probability) { | 262 double alternate_probability) { |
| 260 const AlternativeService alternative_service(alternate_protocol, | 263 const AlternativeService alternative_service(alternate_protocol, |
| 261 server.host(), alternate_port); | 264 server.host(), alternate_port); |
| 262 if (IsAlternativeServiceBroken(alternative_service)) { | 265 if (IsAlternativeServiceBroken(alternative_service)) { |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 300 if (EndsWith(server.host(), canonical_suffixes_[i], false)) { | 303 if (EndsWith(server.host(), canonical_suffixes_[i], false)) { |
| 301 HostPortPair canonical_host(canonical_suffix, server.port()); | 304 HostPortPair canonical_host(canonical_suffix, server.port()); |
| 302 canonical_host_to_origin_map_[canonical_host] = server; | 305 canonical_host_to_origin_map_[canonical_host] = server; |
| 303 break; | 306 break; |
| 304 } | 307 } |
| 305 } | 308 } |
| 306 } | 309 } |
| 307 | 310 |
| 308 void HttpServerPropertiesImpl::SetBrokenAlternateProtocol( | 311 void HttpServerPropertiesImpl::SetBrokenAlternateProtocol( |
| 309 const HostPortPair& server) { | 312 const HostPortPair& server) { |
| 310 const AlternateProtocolInfo alternate = GetAlternateProtocol(server); | 313 const AlternativeService alternative_service = GetAlternativeService(server); |
| 311 if (alternate.protocol == UNINITIALIZED_ALTERNATE_PROTOCOL) { | 314 if (alternative_service.protocol == UNINITIALIZED_ALTERNATE_PROTOCOL) { |
| 312 LOG(DFATAL) << "Trying to mark unknown alternate protocol broken."; | 315 LOG(DFATAL) << "Trying to mark unknown alternate protocol broken."; |
| 313 return; | 316 return; |
| 314 } | 317 } |
| 315 const AlternativeService alternative_service(alternate.protocol, | |
| 316 server.host(), alternate.port); | |
| 317 int count = ++recently_broken_alternative_services_[alternative_service]; | 318 int count = ++recently_broken_alternative_services_[alternative_service]; |
| 318 base::TimeDelta delay = | 319 base::TimeDelta delay = |
| 319 base::TimeDelta::FromSeconds(kBrokenAlternateProtocolDelaySecs); | 320 base::TimeDelta::FromSeconds(kBrokenAlternateProtocolDelaySecs); |
| 320 base::TimeTicks when = base::TimeTicks::Now() + delay * (1 << (count - 1)); | 321 base::TimeTicks when = base::TimeTicks::Now() + delay * (1 << (count - 1)); |
| 321 auto result = broken_alternative_services_.insert( | 322 auto result = broken_alternative_services_.insert( |
| 322 std::make_pair(alternative_service, when)); | 323 std::make_pair(alternative_service, when)); |
| 323 // Return if alternative service is already in expiration queue. | 324 // Return if alternative service is already in expiration queue. |
| 324 if (!result.second) { | 325 if (!result.second) { |
| 325 return; | 326 return; |
| 326 } | 327 } |
| (...skipping 15 matching lines...) Expand all Loading... |
| 342 recently_broken_alternative_services_[alternative_service] = 1; | 343 recently_broken_alternative_services_[alternative_service] = 1; |
| 343 } | 344 } |
| 344 | 345 |
| 345 bool HttpServerPropertiesImpl::IsAlternativeServiceBroken( | 346 bool HttpServerPropertiesImpl::IsAlternativeServiceBroken( |
| 346 const AlternativeService& alternative_service) { | 347 const AlternativeService& alternative_service) { |
| 347 return ContainsKey(broken_alternative_services_, alternative_service); | 348 return ContainsKey(broken_alternative_services_, alternative_service); |
| 348 } | 349 } |
| 349 | 350 |
| 350 bool HttpServerPropertiesImpl::WasAlternateProtocolRecentlyBroken( | 351 bool HttpServerPropertiesImpl::WasAlternateProtocolRecentlyBroken( |
| 351 const HostPortPair& server) { | 352 const HostPortPair& server) { |
| 352 const AlternateProtocolInfo alternate_protocol = GetAlternateProtocol(server); | 353 const AlternativeService alternative_service = GetAlternativeService(server); |
| 353 if (alternate_protocol.protocol == UNINITIALIZED_ALTERNATE_PROTOCOL) | 354 if (alternative_service.protocol == UNINITIALIZED_ALTERNATE_PROTOCOL) |
| 354 return false; | 355 return false; |
| 355 const AlternativeService alternative_service( | |
| 356 alternate_protocol.protocol, server.host(), alternate_protocol.port); | |
| 357 return ContainsKey(recently_broken_alternative_services_, | 356 return ContainsKey(recently_broken_alternative_services_, |
| 358 alternative_service); | 357 alternative_service); |
| 359 } | 358 } |
| 360 | 359 |
| 361 void HttpServerPropertiesImpl::ConfirmAlternateProtocol( | 360 void HttpServerPropertiesImpl::ConfirmAlternateProtocol( |
| 362 const HostPortPair& server) { | 361 const HostPortPair& server) { |
| 363 const AlternateProtocolInfo alternate_protocol = GetAlternateProtocol(server); | 362 const AlternativeService alternative_service = GetAlternativeService(server); |
| 364 if (alternate_protocol.protocol == UNINITIALIZED_ALTERNATE_PROTOCOL) | 363 if (alternative_service.protocol == UNINITIALIZED_ALTERNATE_PROTOCOL) |
| 365 return; | 364 return; |
| 366 const AlternativeService alternative_service( | |
| 367 alternate_protocol.protocol, server.host(), alternate_protocol.port); | |
| 368 broken_alternative_services_.erase(alternative_service); | 365 broken_alternative_services_.erase(alternative_service); |
| 369 recently_broken_alternative_services_.erase(alternative_service); | 366 recently_broken_alternative_services_.erase(alternative_service); |
| 370 } | 367 } |
| 371 | 368 |
| 372 void HttpServerPropertiesImpl::ClearAlternateProtocol( | 369 void HttpServerPropertiesImpl::ClearAlternateProtocol( |
| 373 const HostPortPair& server) { | 370 const HostPortPair& server) { |
| 374 RemoveCanonicalHost(server); | 371 RemoveCanonicalHost(server); |
| 375 | 372 |
| 376 AlternateProtocolMap::iterator it = alternate_protocol_map_.Peek(server); | 373 AlternateProtocolMap::iterator it = alternate_protocol_map_.Peek(server); |
| 377 if (it == alternate_protocol_map_.end()) { | 374 if (it == alternate_protocol_map_.end()) { |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 555 base::TimeDelta delay = when > now ? when - now : base::TimeDelta(); | 552 base::TimeDelta delay = when > now ? when - now : base::TimeDelta(); |
| 556 base::MessageLoop::current()->PostDelayedTask( | 553 base::MessageLoop::current()->PostDelayedTask( |
| 557 FROM_HERE, | 554 FROM_HERE, |
| 558 base::Bind( | 555 base::Bind( |
| 559 &HttpServerPropertiesImpl::ExpireBrokenAlternateProtocolMappings, | 556 &HttpServerPropertiesImpl::ExpireBrokenAlternateProtocolMappings, |
| 560 weak_ptr_factory_.GetWeakPtr()), | 557 weak_ptr_factory_.GetWeakPtr()), |
| 561 delay); | 558 delay); |
| 562 } | 559 } |
| 563 | 560 |
| 564 } // namespace net | 561 } // namespace net |
| OLD | NEW |