Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(103)

Side by Side Diff: net/http/http_server_properties_manager.cc

Issue 1043973002: Introduce AlternativeServiceInfo. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Early return. Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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_manager.h" 5 #include "net/http/http_server_properties_manager.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/metrics/histogram.h" 8 #include "base/metrics/histogram.h"
9 #include "base/prefs/pref_service.h" 9 #include "base/prefs/pref_service.h"
10 #include "base/single_thread_task_runner.h" 10 #include "base/single_thread_task_runner.h"
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 const int kMaxServerNetworkStatsHostsToPersist = 200; 51 const int kMaxServerNetworkStatsHostsToPersist = 200;
52 52
53 const char kVersionKey[] = "version"; 53 const char kVersionKey[] = "version";
54 const char kServersKey[] = "servers"; 54 const char kServersKey[] = "servers";
55 const char kSupportsSpdyKey[] = "supports_spdy"; 55 const char kSupportsSpdyKey[] = "supports_spdy";
56 const char kSettingsKey[] = "settings"; 56 const char kSettingsKey[] = "settings";
57 const char kSupportsQuicKey[] = "supports_quic"; 57 const char kSupportsQuicKey[] = "supports_quic";
58 const char kUsedQuicKey[] = "used_quic"; 58 const char kUsedQuicKey[] = "used_quic";
59 const char kAddressKey[] = "address"; 59 const char kAddressKey[] = "address";
60 const char kAlternateProtocolKey[] = "alternate_protocol"; 60 const char kAlternateProtocolKey[] = "alternate_protocol";
61 const char kAlternativeServiceKey[] = "alternative_service";
62 const char kProtocolKey[] = "protocol_str";
63 const char kHostKey[] = "host";
61 const char kPortKey[] = "port"; 64 const char kPortKey[] = "port";
62 const char kProtocolKey[] = "protocol_str";
63 const char kProbabilityKey[] = "probability"; 65 const char kProbabilityKey[] = "probability";
64 const char kNetworkStatsKey[] = "network_stats"; 66 const char kNetworkStatsKey[] = "network_stats";
65 const char kSrttKey[] = "srtt"; 67 const char kSrttKey[] = "srtt";
66 68
67 } // namespace 69 } // namespace
68 70
69 //////////////////////////////////////////////////////////////////////////////// 71 ////////////////////////////////////////////////////////////////////////////////
70 // HttpServerPropertiesManager 72 // HttpServerPropertiesManager
71 73
72 HttpServerPropertiesManager::HttpServerPropertiesManager( 74 HttpServerPropertiesManager::HttpServerPropertiesManager(
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
233 ScheduleUpdatePrefsOnNetworkThread(); 235 ScheduleUpdatePrefsOnNetworkThread();
234 } 236 }
235 237
236 void HttpServerPropertiesManager::ClearAlternativeService( 238 void HttpServerPropertiesManager::ClearAlternativeService(
237 const HostPortPair& origin) { 239 const HostPortPair& origin) {
238 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); 240 DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
239 http_server_properties_impl_->ClearAlternativeService(origin); 241 http_server_properties_impl_->ClearAlternativeService(origin);
240 ScheduleUpdatePrefsOnNetworkThread(); 242 ScheduleUpdatePrefsOnNetworkThread();
241 } 243 }
242 244
243 const AlternateProtocolMap& 245 const AlternativeServiceMap&
244 HttpServerPropertiesManager::alternate_protocol_map() const { 246 HttpServerPropertiesManager::alternative_service_map() const {
245 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); 247 DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
246 return http_server_properties_impl_->alternate_protocol_map(); 248 return http_server_properties_impl_->alternative_service_map();
247 } 249 }
248 250
249 void HttpServerPropertiesManager::SetAlternateProtocolProbabilityThreshold( 251 void HttpServerPropertiesManager::SetAlternateProtocolProbabilityThreshold(
250 double threshold) { 252 double threshold) {
251 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); 253 DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
252 http_server_properties_impl_->SetAlternateProtocolProbabilityThreshold( 254 http_server_properties_impl_->SetAlternateProtocolProbabilityThreshold(
253 threshold); 255 threshold);
254 } 256 }
255 257
256 const SettingsMap& HttpServerPropertiesManager::GetSpdySettings( 258 const SettingsMap& HttpServerPropertiesManager::GetSpdySettings(
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
373 return; 375 return;
374 } 376 }
375 377
376 IPAddressNumber* addr = new IPAddressNumber; 378 IPAddressNumber* addr = new IPAddressNumber;
377 ReadSupportsQuic(http_server_properties_dict, addr); 379 ReadSupportsQuic(http_server_properties_dict, addr);
378 380
379 // String is host/port pair of spdy server. 381 // String is host/port pair of spdy server.
380 scoped_ptr<StringVector> spdy_servers(new StringVector); 382 scoped_ptr<StringVector> spdy_servers(new StringVector);
381 scoped_ptr<SpdySettingsMap> spdy_settings_map( 383 scoped_ptr<SpdySettingsMap> spdy_settings_map(
382 new SpdySettingsMap(kMaxSpdySettingsHostsToPersist)); 384 new SpdySettingsMap(kMaxSpdySettingsHostsToPersist));
383 scoped_ptr<AlternateProtocolMap> alternate_protocol_map( 385 scoped_ptr<AlternativeServiceMap> alternative_service_map(
384 new AlternateProtocolMap(kMaxAlternateProtocolHostsToPersist)); 386 new AlternativeServiceMap(kMaxAlternateProtocolHostsToPersist));
385 scoped_ptr<ServerNetworkStatsMap> server_network_stats_map( 387 scoped_ptr<ServerNetworkStatsMap> server_network_stats_map(
386 new ServerNetworkStatsMap(kMaxServerNetworkStatsHostsToPersist)); 388 new ServerNetworkStatsMap(kMaxServerNetworkStatsHostsToPersist));
387 389
388 for (base::DictionaryValue::Iterator it(*servers_dict); !it.IsAtEnd(); 390 for (base::DictionaryValue::Iterator it(*servers_dict); !it.IsAtEnd();
389 it.Advance()) { 391 it.Advance()) {
390 // Get server's host/pair. 392 // Get server's host/pair.
391 const std::string& server_str = it.key(); 393 const std::string& server_str = it.key();
392 HostPortPair server = HostPortPair::FromString(server_str); 394 HostPortPair server = HostPortPair::FromString(server_str);
393 if (server.host().empty()) { 395 if (server.host().empty()) {
394 DVLOG(1) << "Malformed http_server_properties for server: " << server_str; 396 DVLOG(1) << "Malformed http_server_properties for server: " << server_str;
395 detected_corrupted_prefs = true; 397 detected_corrupted_prefs = true;
396 continue; 398 continue;
397 } 399 }
398 400
399 const base::DictionaryValue* server_pref_dict = NULL; 401 const base::DictionaryValue* server_pref_dict = NULL;
400 if (!it.value().GetAsDictionary(&server_pref_dict)) { 402 if (!it.value().GetAsDictionary(&server_pref_dict)) {
401 DVLOG(1) << "Malformed http_server_properties server: " << server_str; 403 DVLOG(1) << "Malformed http_server_properties server: " << server_str;
402 detected_corrupted_prefs = true; 404 detected_corrupted_prefs = true;
403 continue; 405 continue;
404 } 406 }
405 407
406 // Get if server supports Spdy. 408 // Get if server supports Spdy.
407 bool supports_spdy = false; 409 bool supports_spdy = false;
408 if ((server_pref_dict->GetBoolean(kSupportsSpdyKey, &supports_spdy)) && 410 if ((server_pref_dict->GetBoolean(kSupportsSpdyKey, &supports_spdy)) &&
409 supports_spdy) { 411 supports_spdy) {
410 spdy_servers->push_back(server_str); 412 spdy_servers->push_back(server_str);
411 } 413 }
412 414
413 AddToSpdySettingsMap(server, *server_pref_dict, spdy_settings_map.get()); 415 AddToSpdySettingsMap(server, *server_pref_dict, spdy_settings_map.get());
414 if (!AddToAlternateProtocolMap(server, *server_pref_dict, 416 if (!AddToAlternativeServiceMap(server, *server_pref_dict,
415 alternate_protocol_map.get()) || 417 alternative_service_map.get()) ||
416 !AddToNetworkStatsMap(server, *server_pref_dict, 418 !AddToNetworkStatsMap(server, *server_pref_dict,
417 server_network_stats_map.get())) { 419 server_network_stats_map.get())) {
418 detected_corrupted_prefs = true; 420 detected_corrupted_prefs = true;
419 } 421 }
420 } 422 }
421 423
422 network_task_runner_->PostTask( 424 network_task_runner_->PostTask(
423 FROM_HERE, 425 FROM_HERE,
424 base::Bind( 426 base::Bind(
425 &HttpServerPropertiesManager::UpdateCacheFromPrefsOnNetworkThread, 427 &HttpServerPropertiesManager::UpdateCacheFromPrefsOnNetworkThread,
426 base::Unretained(this), base::Owned(spdy_servers.release()), 428 base::Unretained(this), base::Owned(spdy_servers.release()),
427 base::Owned(spdy_settings_map.release()), 429 base::Owned(spdy_settings_map.release()),
428 base::Owned(alternate_protocol_map.release()), base::Owned(addr), 430 base::Owned(alternative_service_map.release()), base::Owned(addr),
429 base::Owned(server_network_stats_map.release()), 431 base::Owned(server_network_stats_map.release()),
430 detected_corrupted_prefs)); 432 detected_corrupted_prefs));
431 } 433 }
432 434
433 void HttpServerPropertiesManager::AddToSpdySettingsMap( 435 void HttpServerPropertiesManager::AddToSpdySettingsMap(
434 const HostPortPair& server, 436 const HostPortPair& server,
435 const base::DictionaryValue& server_pref_dict, 437 const base::DictionaryValue& server_pref_dict,
436 SpdySettingsMap* spdy_settings_map) { 438 SpdySettingsMap* spdy_settings_map) {
437 // Get SpdySettings. 439 // Get SpdySettings.
438 DCHECK(spdy_settings_map->Peek(server) == spdy_settings_map->end()); 440 DCHECK(spdy_settings_map->Peek(server) == spdy_settings_map->end());
(...skipping 19 matching lines...) Expand all
458 << server.ToString(); 460 << server.ToString();
459 NOTREACHED(); 461 NOTREACHED();
460 continue; 462 continue;
461 } 463 }
462 SettingsFlagsAndValue flags_and_value(SETTINGS_FLAG_PERSISTED, value); 464 SettingsFlagsAndValue flags_and_value(SETTINGS_FLAG_PERSISTED, value);
463 settings_map[static_cast<SpdySettingsIds>(id)] = flags_and_value; 465 settings_map[static_cast<SpdySettingsIds>(id)] = flags_and_value;
464 } 466 }
465 spdy_settings_map->Put(server, settings_map); 467 spdy_settings_map->Put(server, settings_map);
466 } 468 }
467 469
468 AlternateProtocolInfo HttpServerPropertiesManager::ParseAlternateProtocolDict( 470 AlternativeServiceInfo HttpServerPropertiesManager::ParseAlternativeServiceDict(
469 const base::DictionaryValue& alternate_protocol_dict, 471 const base::DictionaryValue& alternative_service_dict,
470 const std::string& server_str) { 472 const std::string& server_str) {
471 AlternateProtocolInfo alternate_protocol; 473 // Protocol is mandatory.
472 int port = 0;
473 if (!alternate_protocol_dict.GetInteger(kPortKey, &port) ||
474 !IsPortValid(port)) {
475 DVLOG(1) << "Malformed alternative service port for server: " << server_str;
476 return alternate_protocol;
477 }
478 alternate_protocol.port = static_cast<uint16>(port);
479
480 double probability = 1.0;
481 if (alternate_protocol_dict.HasKey(kProbabilityKey) &&
482 !alternate_protocol_dict.GetDoubleWithoutPathExpansion(kProbabilityKey,
483 &probability)) {
484 DVLOG(1) << "Malformed alternative service probability for server: "
485 << server_str;
486 return alternate_protocol;
487 }
488 alternate_protocol.probability = probability;
489
490 std::string protocol_str; 474 std::string protocol_str;
491 if (!alternate_protocol_dict.GetStringWithoutPathExpansion(kProtocolKey, 475 if (!alternative_service_dict.GetStringWithoutPathExpansion(kProtocolKey,
492 &protocol_str)) { 476 &protocol_str)) {
493 DVLOG(1) << "Malformed alternative service protocol string for server: " 477 DVLOG(1) << "Malformed alternative service protocol string for server: "
494 << server_str; 478 << server_str;
495 return alternate_protocol; 479 return AlternativeServiceInfo();
496 } 480 }
497 AlternateProtocol protocol = AlternateProtocolFromString(protocol_str); 481 AlternateProtocol protocol = AlternateProtocolFromString(protocol_str);
498 if (!IsAlternateProtocolValid(protocol)) { 482 if (!IsAlternateProtocolValid(protocol)) {
499 DVLOG(1) << "Invalid alternative service protocol string for server: " 483 DVLOG(1) << "Invalid alternative service protocol string for server: "
500 << server_str; 484 << server_str;
501 return alternate_protocol; 485 return AlternativeServiceInfo();
502 } 486 }
503 alternate_protocol.protocol = protocol;
504 487
505 return alternate_protocol; 488 // Host is optional, defaults to "".
489 std::string host;
490 if (alternative_service_dict.HasKey(kHostKey) &&
491 !alternative_service_dict.GetStringWithoutPathExpansion(kHostKey,
492 &host)) {
493 DVLOG(1) << "Malformed alternative service host string for server: "
494 << server_str;
495 return AlternativeServiceInfo();
496 }
497
498 // Port is mandatory.
499 int port = 0;
500 if (!alternative_service_dict.GetInteger(kPortKey, &port) ||
501 !IsPortValid(port)) {
502 DVLOG(1) << "Malformed alternative service port for server: " << server_str;
503 return AlternativeServiceInfo();
504 }
505
506 // Probability is optional, defaults to 1.0.
507 double probability = 1.0;
508 if (alternative_service_dict.HasKey(kProbabilityKey) &&
509 !alternative_service_dict.GetDoubleWithoutPathExpansion(kProbabilityKey,
510 &probability)) {
511 DVLOG(1) << "Malformed alternative service probability for server: "
512 << server_str;
513 return AlternativeServiceInfo();
514 }
515
516 return AlternativeServiceInfo(protocol, host, static_cast<uint16>(port),
517 probability);
506 } 518 }
507 519
508 bool HttpServerPropertiesManager::AddToAlternateProtocolMap( 520 bool HttpServerPropertiesManager::AddToAlternativeServiceMap(
509 const HostPortPair& server, 521 const HostPortPair& server,
510 const base::DictionaryValue& server_pref_dict, 522 const base::DictionaryValue& server_pref_dict,
511 AlternateProtocolMap* alternate_protocol_map) { 523 AlternativeServiceMap* alternative_service_map) {
512 // Get alternate_protocol server. 524 DCHECK(alternative_service_map->Peek(server) ==
513 DCHECK(alternate_protocol_map->Peek(server) == alternate_protocol_map->end()); 525 alternative_service_map->end());
514 const base::DictionaryValue* alternate_protocol_dict = NULL; 526 // Get alternative_services...
515 if (!server_pref_dict.GetDictionaryWithoutPathExpansion( 527 const base::ListValue* alternative_service_list;
516 kAlternateProtocolKey, &alternate_protocol_dict)) { 528 const base::DictionaryValue* alternative_service_dict;
517 return true; 529 AlternativeServiceInfo alternative_service_info;
530 if (server_pref_dict.GetListWithoutPathExpansion(kAlternativeServiceKey,
531 &alternative_service_list)) {
532 if (alternative_service_list->empty()) {
533 return false;
534 }
535 // Get first element of the list.
536 // TODO(bnc): Once we store multiple AlternativeServiceInfo per server, read
537 // all of them.
538 if (!alternative_service_list->GetDictionary(0,
539 &alternative_service_dict)) {
540 return false;
541 }
542 alternative_service_info = ParseAlternativeServiceDict(
543 *alternative_service_dict, server.ToString());
544 } else {
545 // ...or alternate_protocol.
546 // TODO(bnc): Remove this in M46, we do not need preference migration for
547 // long.
548 if (!server_pref_dict.GetDictionaryWithoutPathExpansion(
549 kAlternateProtocolKey, &alternative_service_dict)) {
550 return true;
551 }
552 alternative_service_info = ParseAlternativeServiceDict(
553 *alternative_service_dict, server.ToString());
518 } 554 }
519 AlternateProtocolInfo alternate_protocol = 555
520 ParseAlternateProtocolDict(*alternate_protocol_dict, server.ToString()); 556 if (alternative_service_info.alternative_service.protocol ==
521 if (alternate_protocol.protocol == UNINITIALIZED_ALTERNATE_PROTOCOL) 557 UNINITIALIZED_ALTERNATE_PROTOCOL) {
522 return false; 558 return false;
523 alternate_protocol_map->Put(server, alternate_protocol); 559 }
560 alternative_service_map->Put(server, alternative_service_info);
524 return true; 561 return true;
525 } 562 }
526 563
527 bool HttpServerPropertiesManager::ReadSupportsQuic( 564 bool HttpServerPropertiesManager::ReadSupportsQuic(
528 const base::DictionaryValue& http_server_properties_dict, 565 const base::DictionaryValue& http_server_properties_dict,
529 IPAddressNumber* last_quic_address) { 566 IPAddressNumber* last_quic_address) {
530 const base::DictionaryValue* supports_quic_dict = NULL; 567 const base::DictionaryValue* supports_quic_dict = NULL;
531 if (!http_server_properties_dict.GetDictionaryWithoutPathExpansion( 568 if (!http_server_properties_dict.GetDictionaryWithoutPathExpansion(
532 kSupportsQuicKey, &supports_quic_dict)) { 569 kSupportsQuicKey, &supports_quic_dict)) {
533 return true; 570 return true;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
572 server_network_stats.srtt = base::TimeDelta::FromInternalValue(srtt); 609 server_network_stats.srtt = base::TimeDelta::FromInternalValue(srtt);
573 // TODO(rtenneti): When QUIC starts using bandwidth_estimate, then persist 610 // TODO(rtenneti): When QUIC starts using bandwidth_estimate, then persist
574 // bandwidth_estimate. 611 // bandwidth_estimate.
575 network_stats_map->Put(server, server_network_stats); 612 network_stats_map->Put(server, server_network_stats);
576 return true; 613 return true;
577 } 614 }
578 615
579 void HttpServerPropertiesManager::UpdateCacheFromPrefsOnNetworkThread( 616 void HttpServerPropertiesManager::UpdateCacheFromPrefsOnNetworkThread(
580 StringVector* spdy_servers, 617 StringVector* spdy_servers,
581 SpdySettingsMap* spdy_settings_map, 618 SpdySettingsMap* spdy_settings_map,
582 AlternateProtocolMap* alternate_protocol_map, 619 AlternativeServiceMap* alternative_service_map,
583 IPAddressNumber* last_quic_address, 620 IPAddressNumber* last_quic_address,
584 ServerNetworkStatsMap* server_network_stats_map, 621 ServerNetworkStatsMap* server_network_stats_map,
585 bool detected_corrupted_prefs) { 622 bool detected_corrupted_prefs) {
586 // Preferences have the master data because admins might have pushed new 623 // Preferences have the master data because admins might have pushed new
587 // preferences. Update the cached data with new data from preferences. 624 // preferences. Update the cached data with new data from preferences.
588 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); 625 DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
589 626
590 UMA_HISTOGRAM_COUNTS("Net.CountOfSpdyServers", spdy_servers->size()); 627 UMA_HISTOGRAM_COUNTS("Net.CountOfSpdyServers", spdy_servers->size());
591 http_server_properties_impl_->InitializeSpdyServers(spdy_servers, true); 628 http_server_properties_impl_->InitializeSpdyServers(spdy_servers, true);
592 629
593 // Update the cached data and use the new spdy_settings from preferences. 630 // Update the cached data and use the new spdy_settings from preferences.
594 UMA_HISTOGRAM_COUNTS("Net.CountOfSpdySettings", spdy_settings_map->size()); 631 UMA_HISTOGRAM_COUNTS("Net.CountOfSpdySettings", spdy_settings_map->size());
595 http_server_properties_impl_->InitializeSpdySettingsServers( 632 http_server_properties_impl_->InitializeSpdySettingsServers(
596 spdy_settings_map); 633 spdy_settings_map);
597 634
598 // Update the cached data and use the new Alternate-Protocol server list from 635 // Update the cached data and use the new Alternate-Protocol server list from
599 // preferences. 636 // preferences.
600 UMA_HISTOGRAM_COUNTS("Net.CountOfAlternateProtocolServers", 637 UMA_HISTOGRAM_COUNTS("Net.CountOfAlternateProtocolServers",
601 alternate_protocol_map->size()); 638 alternative_service_map->size());
602 http_server_properties_impl_->InitializeAlternateProtocolServers( 639 http_server_properties_impl_->InitializeAlternativeServiceServers(
603 alternate_protocol_map); 640 alternative_service_map);
604 641
605 http_server_properties_impl_->InitializeSupportsQuic(last_quic_address); 642 http_server_properties_impl_->InitializeSupportsQuic(last_quic_address);
606 643
607 http_server_properties_impl_->InitializeServerNetworkStats( 644 http_server_properties_impl_->InitializeServerNetworkStats(
608 server_network_stats_map); 645 server_network_stats_map);
609 646
610 // Update the prefs with what we have read (delete all corrupted prefs). 647 // Update the prefs with what we have read (delete all corrupted prefs).
611 if (detected_corrupted_prefs) 648 if (detected_corrupted_prefs)
612 ScheduleUpdatePrefsOnNetworkThread(); 649 ScheduleUpdatePrefsOnNetworkThread();
613 } 650 }
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
651 new SpdySettingsMap(kMaxSpdySettingsHostsToPersist); 688 new SpdySettingsMap(kMaxSpdySettingsHostsToPersist);
652 const SpdySettingsMap& main_map = 689 const SpdySettingsMap& main_map =
653 http_server_properties_impl_->spdy_settings_map(); 690 http_server_properties_impl_->spdy_settings_map();
654 int count = 0; 691 int count = 0;
655 for (SpdySettingsMap::const_iterator it = main_map.begin(); 692 for (SpdySettingsMap::const_iterator it = main_map.begin();
656 it != main_map.end() && count < kMaxSpdySettingsHostsToPersist; 693 it != main_map.end() && count < kMaxSpdySettingsHostsToPersist;
657 ++it, ++count) { 694 ++it, ++count) {
658 spdy_settings_map->Put(it->first, it->second); 695 spdy_settings_map->Put(it->first, it->second);
659 } 696 }
660 697
661 AlternateProtocolMap* alternate_protocol_map = 698 AlternativeServiceMap* alternative_service_map =
662 new AlternateProtocolMap(kMaxAlternateProtocolHostsToPersist); 699 new AlternativeServiceMap(kMaxAlternateProtocolHostsToPersist);
663 const AlternateProtocolMap& map = 700 const AlternativeServiceMap& map =
664 http_server_properties_impl_->alternate_protocol_map(); 701 http_server_properties_impl_->alternative_service_map();
665 count = 0; 702 count = 0;
666 typedef std::map<std::string, bool> CanonicalHostPersistedMap; 703 typedef std::map<std::string, bool> CanonicalHostPersistedMap;
667 CanonicalHostPersistedMap persisted_map; 704 CanonicalHostPersistedMap persisted_map;
668 for (AlternateProtocolMap::const_iterator it = map.begin(); 705 for (AlternativeServiceMap::const_iterator it = map.begin();
669 it != map.end() && count < kMaxAlternateProtocolHostsToPersist; ++it) { 706 it != map.end() && count < kMaxAlternateProtocolHostsToPersist; ++it) {
670 const AlternateProtocolInfo& alternate_protocol = it->second; 707 const AlternativeServiceInfo& alternative_service_info = it->second;
671 if (!IsAlternateProtocolValid(alternate_protocol.protocol)) { 708 if (!IsAlternateProtocolValid(
709 alternative_service_info.alternative_service.protocol)) {
672 continue; 710 continue;
673 } 711 }
674 const HostPortPair& server = it->first; 712 const HostPortPair& server = it->first;
675 if (IsAlternativeServiceBroken( 713 AlternativeService alternative_service(
676 AlternativeService(alternate_protocol.protocol, server.host(), 714 alternative_service_info.alternative_service);
677 alternate_protocol.port))) { 715 if (alternative_service.host.empty()) {
716 alternative_service.host = server.host();
717 }
718 if (IsAlternativeServiceBroken(alternative_service)) {
678 continue; 719 continue;
679 } 720 }
680 std::string canonical_suffix = 721 std::string canonical_suffix =
681 http_server_properties_impl_->GetCanonicalSuffix(server.host()); 722 http_server_properties_impl_->GetCanonicalSuffix(server.host());
682 if (!canonical_suffix.empty()) { 723 if (!canonical_suffix.empty()) {
683 if (persisted_map.find(canonical_suffix) != persisted_map.end()) 724 if (persisted_map.find(canonical_suffix) != persisted_map.end())
684 continue; 725 continue;
685 persisted_map[canonical_suffix] = true; 726 persisted_map[canonical_suffix] = true;
686 } 727 }
687 alternate_protocol_map->Put(server, alternate_protocol); 728 alternative_service_map->Put(server, alternative_service_info);
688 ++count; 729 ++count;
689 } 730 }
690 731
691 ServerNetworkStatsMap* server_network_stats_map = 732 ServerNetworkStatsMap* server_network_stats_map =
692 new ServerNetworkStatsMap(kMaxServerNetworkStatsHostsToPersist); 733 new ServerNetworkStatsMap(kMaxServerNetworkStatsHostsToPersist);
693 const ServerNetworkStatsMap& main_server_network_stats_map = 734 const ServerNetworkStatsMap& main_server_network_stats_map =
694 http_server_properties_impl_->server_network_stats_map(); 735 http_server_properties_impl_->server_network_stats_map();
695 for (ServerNetworkStatsMap::const_iterator it = 736 for (ServerNetworkStatsMap::const_iterator it =
696 main_server_network_stats_map.begin(); 737 main_server_network_stats_map.begin();
697 it != main_server_network_stats_map.end(); ++it) { 738 it != main_server_network_stats_map.end(); ++it) {
698 server_network_stats_map->Put(it->first, it->second); 739 server_network_stats_map->Put(it->first, it->second);
699 } 740 }
700 741
701 IPAddressNumber* last_quic_addr = new IPAddressNumber; 742 IPAddressNumber* last_quic_addr = new IPAddressNumber;
702 http_server_properties_impl_->GetSupportsQuic(last_quic_addr); 743 http_server_properties_impl_->GetSupportsQuic(last_quic_addr);
703 // Update the preferences on the pref thread. 744 // Update the preferences on the pref thread.
704 pref_task_runner_->PostTask( 745 pref_task_runner_->PostTask(
705 FROM_HERE, 746 FROM_HERE,
706 base::Bind( 747 base::Bind(
707 &HttpServerPropertiesManager::UpdatePrefsOnPrefThread, pref_weak_ptr_, 748 &HttpServerPropertiesManager::UpdatePrefsOnPrefThread, pref_weak_ptr_,
708 base::Owned(spdy_server_list), base::Owned(spdy_settings_map), 749 base::Owned(spdy_server_list), base::Owned(spdy_settings_map),
709 base::Owned(alternate_protocol_map), base::Owned(last_quic_addr), 750 base::Owned(alternative_service_map), base::Owned(last_quic_addr),
710 base::Owned(server_network_stats_map), completion)); 751 base::Owned(server_network_stats_map), completion));
711 } 752 }
712 753
713 // A local or temporary data structure to hold |supports_spdy|, SpdySettings, 754 // A local or temporary data structure to hold |supports_spdy|, SpdySettings,
714 // AlternateProtocolInfo and SupportsQuic preferences for a server. This is used 755 // AlternativeServiceInfo and SupportsQuic preferences for a server. This is
715 // only in UpdatePrefsOnPrefThread. 756 // used only in UpdatePrefsOnPrefThread.
716 struct ServerPref { 757 struct ServerPref {
717 ServerPref() 758 ServerPref()
718 : supports_spdy(false), 759 : supports_spdy(false),
719 settings_map(NULL), 760 settings_map(NULL),
720 alternate_protocol(NULL), 761 alternative_service(NULL),
721 supports_quic(NULL), 762 supports_quic(NULL),
722 server_network_stats(NULL) {} 763 server_network_stats(NULL) {}
723 ServerPref(bool supports_spdy, 764 ServerPref(bool supports_spdy,
724 const SettingsMap* settings_map, 765 const SettingsMap* settings_map,
725 const AlternateProtocolInfo* alternate_protocol, 766 const AlternativeServiceInfo* alternative_service,
726 const SupportsQuic* supports_quic, 767 const SupportsQuic* supports_quic,
727 const ServerNetworkStats* server_network_stats) 768 const ServerNetworkStats* server_network_stats)
728 : supports_spdy(supports_spdy), 769 : supports_spdy(supports_spdy),
729 settings_map(settings_map), 770 settings_map(settings_map),
730 alternate_protocol(alternate_protocol), 771 alternative_service(alternative_service),
731 supports_quic(supports_quic), 772 supports_quic(supports_quic),
732 server_network_stats(server_network_stats) {} 773 server_network_stats(server_network_stats) {}
733 bool supports_spdy; 774 bool supports_spdy;
734 const SettingsMap* settings_map; 775 const SettingsMap* settings_map;
735 const AlternateProtocolInfo* alternate_protocol; 776 const AlternativeServiceInfo* alternative_service;
736 const SupportsQuic* supports_quic; 777 const SupportsQuic* supports_quic;
737 const ServerNetworkStats* server_network_stats; 778 const ServerNetworkStats* server_network_stats;
738 }; 779 };
739 780
740 void HttpServerPropertiesManager::UpdatePrefsOnPrefThread( 781 void HttpServerPropertiesManager::UpdatePrefsOnPrefThread(
741 base::ListValue* spdy_server_list, 782 base::ListValue* spdy_server_list,
742 SpdySettingsMap* spdy_settings_map, 783 SpdySettingsMap* spdy_settings_map,
743 AlternateProtocolMap* alternate_protocol_map, 784 AlternativeServiceMap* alternative_service_map,
744 IPAddressNumber* last_quic_address, 785 IPAddressNumber* last_quic_address,
745 ServerNetworkStatsMap* server_network_stats_map, 786 ServerNetworkStatsMap* server_network_stats_map,
746 const base::Closure& completion) { 787 const base::Closure& completion) {
747 typedef std::map<HostPortPair, ServerPref> ServerPrefMap; 788 typedef std::map<HostPortPair, ServerPref> ServerPrefMap;
748 ServerPrefMap server_pref_map; 789 ServerPrefMap server_pref_map;
749 790
750 DCHECK(pref_task_runner_->RunsTasksOnCurrentThread()); 791 DCHECK(pref_task_runner_->RunsTasksOnCurrentThread());
751 792
752 // Add servers that support spdy to server_pref_map. 793 // Add servers that support spdy to server_pref_map.
753 std::string s; 794 std::string s;
754 for (base::ListValue::const_iterator list_it = spdy_server_list->begin(); 795 for (base::ListValue::const_iterator list_it = spdy_server_list->begin();
755 list_it != spdy_server_list->end(); 796 list_it != spdy_server_list->end();
756 ++list_it) { 797 ++list_it) {
757 if ((*list_it)->GetAsString(&s)) { 798 if ((*list_it)->GetAsString(&s)) {
758 HostPortPair server = HostPortPair::FromString(s); 799 HostPortPair server = HostPortPair::FromString(s);
759 server_pref_map[server].supports_spdy = true; 800 server_pref_map[server].supports_spdy = true;
760 } 801 }
761 } 802 }
762 803
763 // Add servers that have SpdySettings to server_pref_map. 804 // Add servers that have SpdySettings to server_pref_map.
764 for (SpdySettingsMap::iterator map_it = spdy_settings_map->begin(); 805 for (SpdySettingsMap::iterator map_it = spdy_settings_map->begin();
765 map_it != spdy_settings_map->end(); ++map_it) { 806 map_it != spdy_settings_map->end(); ++map_it) {
766 const HostPortPair& server = map_it->first; 807 const HostPortPair& server = map_it->first;
767 server_pref_map[server].settings_map = &map_it->second; 808 server_pref_map[server].settings_map = &map_it->second;
768 } 809 }
769 810
770 // Add AlternateProtocol servers to server_pref_map. 811 // Add AlternateProtocol servers to server_pref_map.
771 for (AlternateProtocolMap::const_iterator map_it = 812 for (AlternativeServiceMap::const_iterator map_it =
772 alternate_protocol_map->begin(); 813 alternative_service_map->begin();
773 map_it != alternate_protocol_map->end(); ++map_it) { 814 map_it != alternative_service_map->end(); ++map_it) {
774 server_pref_map[map_it->first].alternate_protocol = &map_it->second; 815 server_pref_map[map_it->first].alternative_service = &map_it->second;
775 } 816 }
776 817
777 // Add ServerNetworkStats servers to server_pref_map. 818 // Add ServerNetworkStats servers to server_pref_map.
778 for (ServerNetworkStatsMap::const_iterator map_it = 819 for (ServerNetworkStatsMap::const_iterator map_it =
779 server_network_stats_map->begin(); 820 server_network_stats_map->begin();
780 map_it != server_network_stats_map->end(); ++map_it) { 821 map_it != server_network_stats_map->end(); ++map_it) {
781 const HostPortPair& server = map_it->first; 822 const HostPortPair& server = map_it->first;
782 server_pref_map[server].server_network_stats = &map_it->second; 823 server_pref_map[server].server_network_stats = &map_it->second;
783 } 824 }
784 825
785 // Persist properties to the |path_|. 826 // Persist properties to the |path_|.
786 base::DictionaryValue http_server_properties_dict; 827 base::DictionaryValue http_server_properties_dict;
787 base::DictionaryValue* servers_dict = new base::DictionaryValue; 828 base::DictionaryValue* servers_dict = new base::DictionaryValue;
788 for (ServerPrefMap::const_iterator map_it = server_pref_map.begin(); 829 for (ServerPrefMap::const_iterator map_it = server_pref_map.begin();
789 map_it != server_pref_map.end(); 830 map_it != server_pref_map.end();
790 ++map_it) { 831 ++map_it) {
791 const HostPortPair& server = map_it->first; 832 const HostPortPair& server = map_it->first;
792 const ServerPref& server_pref = map_it->second; 833 const ServerPref& server_pref = map_it->second;
793 834
794 base::DictionaryValue* server_pref_dict = new base::DictionaryValue; 835 base::DictionaryValue* server_pref_dict = new base::DictionaryValue;
795 836
796 // Save supports_spdy. 837 // Save supports_spdy.
797 if (server_pref.supports_spdy) 838 if (server_pref.supports_spdy)
798 server_pref_dict->SetBoolean(kSupportsSpdyKey, server_pref.supports_spdy); 839 server_pref_dict->SetBoolean(kSupportsSpdyKey, server_pref.supports_spdy);
799 SaveSpdySettingsToServerPrefs(server_pref.settings_map, server_pref_dict); 840 SaveSpdySettingsToServerPrefs(server_pref.settings_map, server_pref_dict);
800 SaveAlternateProtocolToServerPrefs(server_pref.alternate_protocol, 841 SaveAlternativeServiceToServerPrefs(server_pref.alternative_service,
801 server_pref_dict); 842 server_pref_dict);
802 SaveNetworkStatsToServerPrefs(server_pref.server_network_stats, 843 SaveNetworkStatsToServerPrefs(server_pref.server_network_stats,
803 server_pref_dict); 844 server_pref_dict);
804 845
805 servers_dict->SetWithoutPathExpansion(server.ToString(), server_pref_dict); 846 servers_dict->SetWithoutPathExpansion(server.ToString(), server_pref_dict);
806 } 847 }
807 848
808 http_server_properties_dict.SetWithoutPathExpansion(kServersKey, 849 http_server_properties_dict.SetWithoutPathExpansion(kServersKey,
809 servers_dict); 850 servers_dict);
810 SetVersion(&http_server_properties_dict, kVersionNumber); 851 SetVersion(&http_server_properties_dict, kVersionNumber);
811 852
(...skipping 21 matching lines...) Expand all
833 for (SettingsMap::const_iterator it = settings_map->begin(); 874 for (SettingsMap::const_iterator it = settings_map->begin();
834 it != settings_map->end(); ++it) { 875 it != settings_map->end(); ++it) {
835 SpdySettingsIds id = it->first; 876 SpdySettingsIds id = it->first;
836 uint32 value = it->second.second; 877 uint32 value = it->second.second;
837 std::string key = base::StringPrintf("%u", id); 878 std::string key = base::StringPrintf("%u", id);
838 spdy_settings_dict->SetInteger(key, value); 879 spdy_settings_dict->SetInteger(key, value);
839 } 880 }
840 server_pref_dict->SetWithoutPathExpansion(kSettingsKey, spdy_settings_dict); 881 server_pref_dict->SetWithoutPathExpansion(kSettingsKey, spdy_settings_dict);
841 } 882 }
842 883
843 void HttpServerPropertiesManager::SaveAlternateProtocolToServerPrefs( 884 void HttpServerPropertiesManager::SaveAlternativeServiceToServerPrefs(
844 const AlternateProtocolInfo* port_alternate_protocol, 885 const AlternativeServiceInfo* alternative_service_info,
845 base::DictionaryValue* server_pref_dict) { 886 base::DictionaryValue* server_pref_dict) {
846 if (!port_alternate_protocol) 887 if (!alternative_service_info)
847 return; 888 return;
848 889
849 base::DictionaryValue* port_alternate_protocol_dict = 890 const AlternativeService& alternative_service =
891 alternative_service_info->alternative_service;
892 base::DictionaryValue* alternative_service_info_dict =
850 new base::DictionaryValue; 893 new base::DictionaryValue;
851 port_alternate_protocol_dict->SetInteger(kPortKey, 894 alternative_service_info_dict->SetString(
852 port_alternate_protocol->port); 895 kProtocolKey, AlternateProtocolToString(alternative_service.protocol));
853 const char* protocol_str = 896 if (!alternative_service.host.empty()) {
854 AlternateProtocolToString(port_alternate_protocol->protocol); 897 alternative_service_info_dict->SetString(kHostKey,
855 port_alternate_protocol_dict->SetString(kProtocolKey, protocol_str); 898 alternative_service.host);
856 port_alternate_protocol_dict->SetDouble(kProbabilityKey, 899 }
857 port_alternate_protocol->probability); 900 alternative_service_info_dict->SetInteger(kPortKey, alternative_service.port);
858 server_pref_dict->SetWithoutPathExpansion(kAlternateProtocolKey, 901 alternative_service_info_dict->SetDouble(
859 port_alternate_protocol_dict); 902 kProbabilityKey, alternative_service_info->probability);
903
904 // Create a single element list here.
905 // TODO(bnc): Once we store multiple AlternativeServiceInfo per server, save
906 // all of them.
907 base::ListValue* alternative_service_list = new base::ListValue();
908 alternative_service_list->Append(alternative_service_info_dict);
909 server_pref_dict->SetWithoutPathExpansion(kAlternativeServiceKey,
910 alternative_service_list);
860 } 911 }
861 912
862 void HttpServerPropertiesManager::SaveSupportsQuicToPrefs( 913 void HttpServerPropertiesManager::SaveSupportsQuicToPrefs(
863 const IPAddressNumber* last_quic_address, 914 const IPAddressNumber* last_quic_address,
864 base::DictionaryValue* http_server_properties_dict) { 915 base::DictionaryValue* http_server_properties_dict) {
865 if (!last_quic_address || last_quic_address->empty()) 916 if (!last_quic_address || last_quic_address->empty())
866 return; 917 return;
867 918
868 base::DictionaryValue* supports_quic_dict = new base::DictionaryValue; 919 base::DictionaryValue* supports_quic_dict = new base::DictionaryValue;
869 supports_quic_dict->SetBoolean(kUsedQuicKey, true); 920 supports_quic_dict->SetBoolean(kUsedQuicKey, true);
(...skipping 19 matching lines...) Expand all
889 server_network_stats_dict); 940 server_network_stats_dict);
890 } 941 }
891 942
892 void HttpServerPropertiesManager::OnHttpServerPropertiesChanged() { 943 void HttpServerPropertiesManager::OnHttpServerPropertiesChanged() {
893 DCHECK(pref_task_runner_->RunsTasksOnCurrentThread()); 944 DCHECK(pref_task_runner_->RunsTasksOnCurrentThread());
894 if (!setting_prefs_) 945 if (!setting_prefs_)
895 ScheduleUpdateCacheOnPrefThread(); 946 ScheduleUpdateCacheOnPrefThread();
896 } 947 }
897 948
898 } // namespace net 949 } // namespace net
OLDNEW
« no previous file with comments | « net/http/http_server_properties_manager.h ('k') | net/http/http_server_properties_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698