| 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 <memory> | 8 #include <memory> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 212 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); | 212 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
| 213 if (server.host().empty()) | 213 if (server.host().empty()) |
| 214 return false; | 214 return false; |
| 215 | 215 |
| 216 if (GetSupportsSpdy(server)) | 216 if (GetSupportsSpdy(server)) |
| 217 return true; | 217 return true; |
| 218 const AlternativeServiceInfoVector alternative_service_info_vector = | 218 const AlternativeServiceInfoVector alternative_service_info_vector = |
| 219 GetAlternativeServiceInfos(server); | 219 GetAlternativeServiceInfos(server); |
| 220 for (const AlternativeServiceInfo& alternative_service_info : | 220 for (const AlternativeServiceInfo& alternative_service_info : |
| 221 alternative_service_info_vector) { | 221 alternative_service_info_vector) { |
| 222 if (alternative_service_info.alternative_service.protocol == kProtoQUIC) { | 222 if (alternative_service_info.alternative_service().protocol == kProtoQUIC) { |
| 223 return true; | 223 return true; |
| 224 } | 224 } |
| 225 } | 225 } |
| 226 return false; | 226 return false; |
| 227 } | 227 } |
| 228 | 228 |
| 229 bool HttpServerPropertiesImpl::GetSupportsSpdy( | 229 bool HttpServerPropertiesImpl::GetSupportsSpdy( |
| 230 const url::SchemeHostPort& server) { | 230 const url::SchemeHostPort& server) { |
| 231 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); | 231 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
| 232 if (server.host().empty()) | 232 if (server.host().empty()) |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 297 const url::SchemeHostPort& origin) { | 297 const url::SchemeHostPort& origin) { |
| 298 // Copy valid alternative service infos into | 298 // Copy valid alternative service infos into |
| 299 // |valid_alternative_service_infos|. | 299 // |valid_alternative_service_infos|. |
| 300 AlternativeServiceInfoVector valid_alternative_service_infos; | 300 AlternativeServiceInfoVector valid_alternative_service_infos; |
| 301 const base::Time now = base::Time::Now(); | 301 const base::Time now = base::Time::Now(); |
| 302 AlternativeServiceMap::iterator map_it = alternative_service_map_.Get(origin); | 302 AlternativeServiceMap::iterator map_it = alternative_service_map_.Get(origin); |
| 303 if (map_it != alternative_service_map_.end()) { | 303 if (map_it != alternative_service_map_.end()) { |
| 304 HostPortPair host_port_pair(origin.host(), origin.port()); | 304 HostPortPair host_port_pair(origin.host(), origin.port()); |
| 305 for (AlternativeServiceInfoVector::iterator it = map_it->second.begin(); | 305 for (AlternativeServiceInfoVector::iterator it = map_it->second.begin(); |
| 306 it != map_it->second.end();) { | 306 it != map_it->second.end();) { |
| 307 if (it->expiration < now) { | 307 if (it->expiration() < now) { |
| 308 it = map_it->second.erase(it); | 308 it = map_it->second.erase(it); |
| 309 continue; | 309 continue; |
| 310 } | 310 } |
| 311 AlternativeService alternative_service(it->alternative_service); | 311 AlternativeService alternative_service(it->alternative_service()); |
| 312 if (alternative_service.host.empty()) { | 312 if (alternative_service.host.empty()) { |
| 313 alternative_service.host = origin.host(); | 313 alternative_service.host = origin.host(); |
| 314 } | 314 } |
| 315 // If the alternative service is equivalent to the origin (same host, same | 315 // If the alternative service is equivalent to the origin (same host, same |
| 316 // port, and both TCP), skip it. | 316 // port, and both TCP), skip it. |
| 317 if (host_port_pair.Equals(alternative_service.host_port_pair()) && | 317 if (host_port_pair.Equals(alternative_service.host_port_pair()) && |
| 318 alternative_service.protocol == kProtoHTTP2) { | 318 alternative_service.protocol == kProtoHTTP2) { |
| 319 ++it; | 319 ++it; |
| 320 continue; | 320 continue; |
| 321 } | 321 } |
| 322 valid_alternative_service_infos.push_back( | 322 valid_alternative_service_infos.push_back( |
| 323 AlternativeServiceInfo(alternative_service, it->expiration)); | 323 AlternativeServiceInfo(alternative_service, it->expiration())); |
| 324 ++it; | 324 ++it; |
| 325 } | 325 } |
| 326 if (map_it->second.empty()) { | 326 if (map_it->second.empty()) { |
| 327 alternative_service_map_.Erase(map_it); | 327 alternative_service_map_.Erase(map_it); |
| 328 } | 328 } |
| 329 return valid_alternative_service_infos; | 329 return valid_alternative_service_infos; |
| 330 } | 330 } |
| 331 | 331 |
| 332 CanonicalHostMap::const_iterator canonical = GetCanonicalHost(origin); | 332 CanonicalHostMap::const_iterator canonical = GetCanonicalHost(origin); |
| 333 if (canonical == canonical_host_to_origin_map_.end()) { | 333 if (canonical == canonical_host_to_origin_map_.end()) { |
| 334 return AlternativeServiceInfoVector(); | 334 return AlternativeServiceInfoVector(); |
| 335 } | 335 } |
| 336 map_it = alternative_service_map_.Get(canonical->second); | 336 map_it = alternative_service_map_.Get(canonical->second); |
| 337 if (map_it == alternative_service_map_.end()) { | 337 if (map_it == alternative_service_map_.end()) { |
| 338 return AlternativeServiceInfoVector(); | 338 return AlternativeServiceInfoVector(); |
| 339 } | 339 } |
| 340 for (AlternativeServiceInfoVector::iterator it = map_it->second.begin(); | 340 for (AlternativeServiceInfoVector::iterator it = map_it->second.begin(); |
| 341 it != map_it->second.end();) { | 341 it != map_it->second.end();) { |
| 342 if (it->expiration < now) { | 342 if (it->expiration() < now) { |
| 343 it = map_it->second.erase(it); | 343 it = map_it->second.erase(it); |
| 344 continue; | 344 continue; |
| 345 } | 345 } |
| 346 AlternativeService alternative_service(it->alternative_service); | 346 AlternativeService alternative_service(it->alternative_service()); |
| 347 if (alternative_service.host.empty()) { | 347 if (alternative_service.host.empty()) { |
| 348 alternative_service.host = canonical->second.host(); | 348 alternative_service.host = canonical->second.host(); |
| 349 if (IsAlternativeServiceBroken(alternative_service)) { | 349 if (IsAlternativeServiceBroken(alternative_service)) { |
| 350 ++it; | 350 ++it; |
| 351 continue; | 351 continue; |
| 352 } | 352 } |
| 353 alternative_service.host = origin.host(); | 353 alternative_service.host = origin.host(); |
| 354 } else if (IsAlternativeServiceBroken(alternative_service)) { | 354 } else if (IsAlternativeServiceBroken(alternative_service)) { |
| 355 ++it; | 355 ++it; |
| 356 continue; | 356 continue; |
| 357 } | 357 } |
| 358 valid_alternative_service_infos.push_back( | 358 valid_alternative_service_infos.push_back( |
| 359 AlternativeServiceInfo(alternative_service, it->expiration)); | 359 AlternativeServiceInfo(alternative_service, it->expiration())); |
| 360 ++it; | 360 ++it; |
| 361 } | 361 } |
| 362 if (map_it->second.empty()) { | 362 if (map_it->second.empty()) { |
| 363 alternative_service_map_.Erase(map_it); | 363 alternative_service_map_.Erase(map_it); |
| 364 } | 364 } |
| 365 return valid_alternative_service_infos; | 365 return valid_alternative_service_infos; |
| 366 } | 366 } |
| 367 | 367 |
| 368 bool HttpServerPropertiesImpl::SetAlternativeService( | 368 bool HttpServerPropertiesImpl::SetAlternativeService( |
| 369 const url::SchemeHostPort& origin, | 369 const url::SchemeHostPort& origin, |
| (...skipping 22 matching lines...) Expand all Loading... |
| 392 bool changed = true; | 392 bool changed = true; |
| 393 if (it != alternative_service_map_.end()) { | 393 if (it != alternative_service_map_.end()) { |
| 394 DCHECK(!it->second.empty()); | 394 DCHECK(!it->second.empty()); |
| 395 if (it->second.size() == alternative_service_info_vector.size()) { | 395 if (it->second.size() == alternative_service_info_vector.size()) { |
| 396 const base::Time now = base::Time::Now(); | 396 const base::Time now = base::Time::Now(); |
| 397 changed = false; | 397 changed = false; |
| 398 auto new_it = alternative_service_info_vector.begin(); | 398 auto new_it = alternative_service_info_vector.begin(); |
| 399 for (const auto& old : it->second) { | 399 for (const auto& old : it->second) { |
| 400 // Persist to disk immediately if new entry has different scheme, host, | 400 // Persist to disk immediately if new entry has different scheme, host, |
| 401 // or port. | 401 // or port. |
| 402 if (old.alternative_service != new_it->alternative_service) { | 402 if (old.alternative_service() != new_it->alternative_service()) { |
| 403 changed = true; | 403 changed = true; |
| 404 break; | 404 break; |
| 405 } | 405 } |
| 406 // Also persist to disk if new expiration it more that twice as far or | 406 // Also persist to disk if new expiration it more that twice as far or |
| 407 // less than half as far in the future. | 407 // less than half as far in the future. |
| 408 base::Time old_time = old.expiration; | 408 base::Time old_time = old.expiration(); |
| 409 base::Time new_time = new_it->expiration; | 409 base::Time new_time = new_it->expiration(); |
| 410 if (new_time - now > 2 * (old_time - now) || | 410 if (new_time - now > 2 * (old_time - now) || |
| 411 2 * (new_time - now) < (old_time - now)) { | 411 2 * (new_time - now) < (old_time - now)) { |
| 412 changed = true; | 412 changed = true; |
| 413 break; | 413 break; |
| 414 } | 414 } |
| 415 ++new_it; | 415 ++new_it; |
| 416 } | 416 } |
| 417 } | 417 } |
| 418 } | 418 } |
| 419 | 419 |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 484 std::unique_ptr<base::ListValue> dict_list(new base::ListValue); | 484 std::unique_ptr<base::ListValue> dict_list(new base::ListValue); |
| 485 for (const auto& alternative_service_map_item : alternative_service_map_) { | 485 for (const auto& alternative_service_map_item : alternative_service_map_) { |
| 486 std::unique_ptr<base::ListValue> alternative_service_list( | 486 std::unique_ptr<base::ListValue> alternative_service_list( |
| 487 new base::ListValue); | 487 new base::ListValue); |
| 488 const url::SchemeHostPort& server = alternative_service_map_item.first; | 488 const url::SchemeHostPort& server = alternative_service_map_item.first; |
| 489 for (const AlternativeServiceInfo& alternative_service_info : | 489 for (const AlternativeServiceInfo& alternative_service_info : |
| 490 alternative_service_map_item.second) { | 490 alternative_service_map_item.second) { |
| 491 std::string alternative_service_string( | 491 std::string alternative_service_string( |
| 492 alternative_service_info.ToString()); | 492 alternative_service_info.ToString()); |
| 493 AlternativeService alternative_service( | 493 AlternativeService alternative_service( |
| 494 alternative_service_info.alternative_service); | 494 alternative_service_info.alternative_service()); |
| 495 if (alternative_service.host.empty()) { | 495 if (alternative_service.host.empty()) { |
| 496 alternative_service.host = server.host(); | 496 alternative_service.host = server.host(); |
| 497 } | 497 } |
| 498 if (IsAlternativeServiceBroken(alternative_service)) { | 498 if (IsAlternativeServiceBroken(alternative_service)) { |
| 499 alternative_service_string.append(" (broken)"); | 499 alternative_service_string.append(" (broken)"); |
| 500 } | 500 } |
| 501 alternative_service_list->AppendString(alternative_service_string); | 501 alternative_service_list->AppendString(alternative_service_string); |
| 502 } | 502 } |
| 503 if (alternative_service_list->empty()) | 503 if (alternative_service_list->empty()) |
| 504 continue; | 504 continue; |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 620 } | 620 } |
| 621 | 621 |
| 622 const url::SchemeHostPort canonical_server = canonical->second; | 622 const url::SchemeHostPort canonical_server = canonical->second; |
| 623 it = alternative_service_map_.Get(canonical_server); | 623 it = alternative_service_map_.Get(canonical_server); |
| 624 if (it == alternative_service_map_.end()) { | 624 if (it == alternative_service_map_.end()) { |
| 625 return alternative_service_map_.end(); | 625 return alternative_service_map_.end(); |
| 626 } | 626 } |
| 627 | 627 |
| 628 for (const AlternativeServiceInfo& alternative_service_info : it->second) { | 628 for (const AlternativeServiceInfo& alternative_service_info : it->second) { |
| 629 AlternativeService alternative_service( | 629 AlternativeService alternative_service( |
| 630 alternative_service_info.alternative_service); | 630 alternative_service_info.alternative_service()); |
| 631 if (alternative_service.host.empty()) { | 631 if (alternative_service.host.empty()) { |
| 632 alternative_service.host = canonical_server.host(); | 632 alternative_service.host = canonical_server.host(); |
| 633 } | 633 } |
| 634 if (!IsAlternativeServiceBroken(alternative_service)) { | 634 if (!IsAlternativeServiceBroken(alternative_service)) { |
| 635 return it; | 635 return it; |
| 636 } | 636 } |
| 637 } | 637 } |
| 638 | 638 |
| 639 RemoveCanonicalHost(canonical_server); | 639 RemoveCanonicalHost(canonical_server); |
| 640 return alternative_service_map_.end(); | 640 return alternative_service_map_.end(); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 667 | 667 |
| 668 void HttpServerPropertiesImpl::OnExpireBrokenAlternativeService( | 668 void HttpServerPropertiesImpl::OnExpireBrokenAlternativeService( |
| 669 const AlternativeService& expired_alternative_service) { | 669 const AlternativeService& expired_alternative_service) { |
| 670 // Remove every occurrence of |expired_alternative_service| from | 670 // Remove every occurrence of |expired_alternative_service| from |
| 671 // |alternative_service_map_|. | 671 // |alternative_service_map_|. |
| 672 for (AlternativeServiceMap::iterator map_it = | 672 for (AlternativeServiceMap::iterator map_it = |
| 673 alternative_service_map_.begin(); | 673 alternative_service_map_.begin(); |
| 674 map_it != alternative_service_map_.end();) { | 674 map_it != alternative_service_map_.end();) { |
| 675 for (AlternativeServiceInfoVector::iterator it = map_it->second.begin(); | 675 for (AlternativeServiceInfoVector::iterator it = map_it->second.begin(); |
| 676 it != map_it->second.end();) { | 676 it != map_it->second.end();) { |
| 677 AlternativeService alternative_service(it->alternative_service); | 677 AlternativeService alternative_service(it->alternative_service()); |
| 678 // Empty hostname in map means hostname of key: substitute before | 678 // Empty hostname in map means hostname of key: substitute before |
| 679 // comparing to |expired_alternative_service|. | 679 // comparing to |expired_alternative_service|. |
| 680 if (alternative_service.host.empty()) { | 680 if (alternative_service.host.empty()) { |
| 681 alternative_service.host = map_it->first.host(); | 681 alternative_service.host = map_it->first.host(); |
| 682 } | 682 } |
| 683 if (alternative_service == expired_alternative_service) { | 683 if (alternative_service == expired_alternative_service) { |
| 684 it = map_it->second.erase(it); | 684 it = map_it->second.erase(it); |
| 685 continue; | 685 continue; |
| 686 } | 686 } |
| 687 ++it; | 687 ++it; |
| 688 } | 688 } |
| 689 // If an origin has an empty list of alternative services, then remove it | 689 // If an origin has an empty list of alternative services, then remove it |
| 690 // from both |canonical_host_to_origin_map_| and | 690 // from both |canonical_host_to_origin_map_| and |
| 691 // |alternative_service_map_|. | 691 // |alternative_service_map_|. |
| 692 if (map_it->second.empty()) { | 692 if (map_it->second.empty()) { |
| 693 RemoveCanonicalHost(map_it->first); | 693 RemoveCanonicalHost(map_it->first); |
| 694 map_it = alternative_service_map_.Erase(map_it); | 694 map_it = alternative_service_map_.Erase(map_it); |
| 695 continue; | 695 continue; |
| 696 } | 696 } |
| 697 ++map_it; | 697 ++map_it; |
| 698 } | 698 } |
| 699 } | 699 } |
| 700 | 700 |
| 701 } // namespace net | 701 } // namespace net |
| OLD | NEW |