OLD | NEW |
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_macros.h" | 8 #include "base/metrics/histogram_macros.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 19 matching lines...) Expand all Loading... |
30 // period will reset the timer. | 30 // period will reset the timer. |
31 const int64_t kUpdatePrefsDelayMs = 60000; | 31 const int64_t kUpdatePrefsDelayMs = 60000; |
32 | 32 |
33 // "version" 0 indicates, http_server_properties doesn't have "version" | 33 // "version" 0 indicates, http_server_properties doesn't have "version" |
34 // property. | 34 // property. |
35 const int kMissingVersion = 0; | 35 const int kMissingVersion = 0; |
36 | 36 |
37 // The version number of persisted http_server_properties. | 37 // The version number of persisted http_server_properties. |
38 const int kVersionNumber = 3; | 38 const int kVersionNumber = 3; |
39 | 39 |
40 typedef std::vector<std::string> StringVector; | |
41 | |
42 // Persist 200 MRU AlternateProtocolHostPortPairs. | 40 // Persist 200 MRU AlternateProtocolHostPortPairs. |
43 const int kMaxAlternateProtocolHostsToPersist = 200; | 41 const int kMaxAlternateProtocolHostsToPersist = 200; |
44 | 42 |
45 // Persist 200 MRU SpdySettingsHostPortPairs. | 43 // Persist 200 MRU SpdySettingsHostPortPairs. |
46 const int kMaxSpdySettingsHostsToPersist = 200; | 44 const int kMaxSpdySettingsHostsToPersist = 200; |
47 | 45 |
48 // Persist 300 MRU SupportsSpdyServerHostPortPairs. | 46 // Persist 300 MRU SupportsSpdyServerHostPortPairs. |
49 const int kMaxSupportsSpdyServerHostsToPersist = 300; | 47 const int kMaxSupportsSpdyServerHostsToPersist = 300; |
50 | 48 |
51 // Persist 200 ServerNetworkStats. | 49 // Persist 200 ServerNetworkStats. |
(...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
442 | 440 |
443 int version = kMissingVersion; | 441 int version = kMissingVersion; |
444 if (!http_server_properties_dict.GetIntegerWithoutPathExpansion(kVersionKey, | 442 if (!http_server_properties_dict.GetIntegerWithoutPathExpansion(kVersionKey, |
445 &version)) { | 443 &version)) { |
446 DVLOG(1) << "Missing version. Clearing all properties."; | 444 DVLOG(1) << "Missing version. Clearing all properties."; |
447 return; | 445 return; |
448 } | 446 } |
449 | 447 |
450 // The properties for a given server is in | 448 // The properties for a given server is in |
451 // http_server_properties_dict["servers"][server]. | 449 // http_server_properties_dict["servers"][server]. |
| 450 // Server data was stored in the following format in alphabetical order. |
| 451 // |
| 452 // "http_server_properties": { |
| 453 // "servers": { |
| 454 // "accounts.google.com:443": {...}, |
| 455 // "accounts.youtube.com:443": {...}, |
| 456 // "android.clients.google.com:443": {...}, |
| 457 // ... |
| 458 // }, ... |
| 459 // }, |
452 const base::DictionaryValue* servers_dict = NULL; | 460 const base::DictionaryValue* servers_dict = NULL; |
453 if (!http_server_properties_dict.GetDictionaryWithoutPathExpansion( | 461 if (!http_server_properties_dict.GetDictionaryWithoutPathExpansion( |
454 kServersKey, &servers_dict)) { | 462 kServersKey, &servers_dict)) { |
455 DVLOG(1) << "Malformed http_server_properties for servers."; | 463 DVLOG(1) << "Malformed http_server_properties for servers."; |
456 return; | 464 return; |
457 } | 465 } |
458 | 466 |
459 IPAddressNumber* addr = new IPAddressNumber; | 467 IPAddressNumber* addr = new IPAddressNumber; |
460 ReadSupportsQuic(http_server_properties_dict, addr); | 468 ReadSupportsQuic(http_server_properties_dict, addr); |
461 | 469 |
462 // String is host/port pair of spdy server. | 470 // String is host/port pair of spdy server. |
463 scoped_ptr<StringVector> spdy_servers(new StringVector); | 471 scoped_ptr<ServerList> spdy_servers(new ServerList); |
464 scoped_ptr<SpdySettingsMap> spdy_settings_map( | 472 scoped_ptr<SpdySettingsMap> spdy_settings_map( |
465 new SpdySettingsMap(kMaxSpdySettingsHostsToPersist)); | 473 new SpdySettingsMap(kMaxSpdySettingsHostsToPersist)); |
466 scoped_ptr<AlternativeServiceMap> alternative_service_map( | 474 scoped_ptr<AlternativeServiceMap> alternative_service_map( |
467 new AlternativeServiceMap(kMaxAlternateProtocolHostsToPersist)); | 475 new AlternativeServiceMap(kMaxAlternateProtocolHostsToPersist)); |
468 scoped_ptr<ServerNetworkStatsMap> server_network_stats_map( | 476 scoped_ptr<ServerNetworkStatsMap> server_network_stats_map( |
469 new ServerNetworkStatsMap(kMaxServerNetworkStatsHostsToPersist)); | 477 new ServerNetworkStatsMap(kMaxServerNetworkStatsHostsToPersist)); |
470 scoped_ptr<QuicServerInfoMap> quic_server_info_map( | 478 scoped_ptr<QuicServerInfoMap> quic_server_info_map( |
471 new QuicServerInfoMap(kMaxQuicServersToPersist)); | 479 new QuicServerInfoMap(kMaxQuicServersToPersist)); |
472 | 480 |
473 for (base::DictionaryValue::Iterator it(*servers_dict); !it.IsAtEnd(); | 481 if (!AddServersData(*servers_dict, spdy_servers.get(), |
| 482 spdy_settings_map.get(), alternative_service_map.get(), |
| 483 server_network_stats_map.get())) { |
| 484 detected_corrupted_prefs = true; |
| 485 } |
| 486 |
| 487 if (!AddToQuicServerInfoMap(http_server_properties_dict, |
| 488 quic_server_info_map.get())) { |
| 489 detected_corrupted_prefs = true; |
| 490 } |
| 491 |
| 492 network_task_runner_->PostTask( |
| 493 FROM_HERE, |
| 494 base::Bind( |
| 495 &HttpServerPropertiesManager::UpdateCacheFromPrefsOnNetworkThread, |
| 496 base::Unretained(this), base::Owned(spdy_servers.release()), |
| 497 base::Owned(spdy_settings_map.release()), |
| 498 base::Owned(alternative_service_map.release()), base::Owned(addr), |
| 499 base::Owned(server_network_stats_map.release()), |
| 500 base::Owned(quic_server_info_map.release()), |
| 501 detected_corrupted_prefs)); |
| 502 } |
| 503 |
| 504 bool HttpServerPropertiesManager::AddServersData( |
| 505 const base::DictionaryValue& servers_dict, |
| 506 ServerList* spdy_servers, |
| 507 SpdySettingsMap* spdy_settings_map, |
| 508 AlternativeServiceMap* alternative_service_map, |
| 509 ServerNetworkStatsMap* network_stats_map) { |
| 510 for (base::DictionaryValue::Iterator it(servers_dict); !it.IsAtEnd(); |
474 it.Advance()) { | 511 it.Advance()) { |
475 // Get server's host/pair. | 512 // Get server's host/pair. |
476 const std::string& server_str = it.key(); | 513 const std::string& server_str = it.key(); |
477 HostPortPair server = HostPortPair::FromString(server_str); | 514 HostPortPair server = HostPortPair::FromString(server_str); |
478 if (server.host().empty()) { | 515 if (server.host().empty()) { |
479 DVLOG(1) << "Malformed http_server_properties for server: " << server_str; | 516 DVLOG(1) << "Malformed http_server_properties for server: " << server_str; |
480 detected_corrupted_prefs = true; | 517 return false; |
481 continue; | |
482 } | 518 } |
483 | 519 |
484 const base::DictionaryValue* server_pref_dict = NULL; | 520 const base::DictionaryValue* server_pref_dict = NULL; |
485 if (!it.value().GetAsDictionary(&server_pref_dict)) { | 521 if (!it.value().GetAsDictionary(&server_pref_dict)) { |
486 DVLOG(1) << "Malformed http_server_properties server: " << server_str; | 522 DVLOG(1) << "Malformed http_server_properties server: " << server_str; |
487 detected_corrupted_prefs = true; | 523 return false; |
488 continue; | |
489 } | 524 } |
490 | 525 |
491 // Get if server supports Spdy. | 526 // Get if server supports Spdy. |
492 bool supports_spdy = false; | 527 bool supports_spdy = false; |
493 if ((server_pref_dict->GetBoolean(kSupportsSpdyKey, &supports_spdy)) && | 528 if ((server_pref_dict->GetBoolean(kSupportsSpdyKey, &supports_spdy)) && |
494 supports_spdy) { | 529 supports_spdy) { |
495 spdy_servers->push_back(server_str); | 530 spdy_servers->push_back(server_str); |
496 } | 531 } |
497 | 532 |
498 AddToSpdySettingsMap(server, *server_pref_dict, spdy_settings_map.get()); | 533 AddToSpdySettingsMap(server, *server_pref_dict, spdy_settings_map); |
499 if (!AddToAlternativeServiceMap(server, *server_pref_dict, | 534 if (!AddToAlternativeServiceMap(server, *server_pref_dict, |
500 alternative_service_map.get()) || | 535 alternative_service_map) || |
501 !AddToNetworkStatsMap(server, *server_pref_dict, | 536 !AddToNetworkStatsMap(server, *server_pref_dict, network_stats_map)) { |
502 server_network_stats_map.get())) { | 537 return false; |
503 detected_corrupted_prefs = true; | |
504 } | 538 } |
505 } | 539 } |
506 | 540 return true; |
507 if (!AddToQuicServerInfoMap(http_server_properties_dict, | |
508 quic_server_info_map.get())) { | |
509 detected_corrupted_prefs = true; | |
510 } | |
511 | |
512 network_task_runner_->PostTask( | |
513 FROM_HERE, | |
514 base::Bind( | |
515 &HttpServerPropertiesManager::UpdateCacheFromPrefsOnNetworkThread, | |
516 base::Unretained(this), base::Owned(spdy_servers.release()), | |
517 base::Owned(spdy_settings_map.release()), | |
518 base::Owned(alternative_service_map.release()), base::Owned(addr), | |
519 base::Owned(server_network_stats_map.release()), | |
520 base::Owned(quic_server_info_map.release()), | |
521 detected_corrupted_prefs)); | |
522 } | 541 } |
523 | 542 |
524 void HttpServerPropertiesManager::AddToSpdySettingsMap( | 543 void HttpServerPropertiesManager::AddToSpdySettingsMap( |
525 const HostPortPair& server, | 544 const HostPortPair& server, |
526 const base::DictionaryValue& server_pref_dict, | 545 const base::DictionaryValue& server_pref_dict, |
527 SpdySettingsMap* spdy_settings_map) { | 546 SpdySettingsMap* spdy_settings_map) { |
528 // Get SpdySettings. | 547 // Get SpdySettings. |
529 DCHECK(spdy_settings_map->Peek(server) == spdy_settings_map->end()); | 548 DCHECK(spdy_settings_map->Peek(server) == spdy_settings_map->end()); |
530 const base::DictionaryValue* spdy_settings_dict = NULL; | 549 const base::DictionaryValue* spdy_settings_dict = NULL; |
531 if (!server_pref_dict.GetDictionaryWithoutPathExpansion( | 550 if (!server_pref_dict.GetDictionaryWithoutPathExpansion( |
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
761 << quic_server_id_str; | 780 << quic_server_id_str; |
762 detected_corrupted_prefs = true; | 781 detected_corrupted_prefs = true; |
763 continue; | 782 continue; |
764 } | 783 } |
765 quic_server_info_map->Put(quic_server_id, quic_server_info); | 784 quic_server_info_map->Put(quic_server_id, quic_server_info); |
766 } | 785 } |
767 return !detected_corrupted_prefs; | 786 return !detected_corrupted_prefs; |
768 } | 787 } |
769 | 788 |
770 void HttpServerPropertiesManager::UpdateCacheFromPrefsOnNetworkThread( | 789 void HttpServerPropertiesManager::UpdateCacheFromPrefsOnNetworkThread( |
771 StringVector* spdy_servers, | 790 ServerList* spdy_servers, |
772 SpdySettingsMap* spdy_settings_map, | 791 SpdySettingsMap* spdy_settings_map, |
773 AlternativeServiceMap* alternative_service_map, | 792 AlternativeServiceMap* alternative_service_map, |
774 IPAddressNumber* last_quic_address, | 793 IPAddressNumber* last_quic_address, |
775 ServerNetworkStatsMap* server_network_stats_map, | 794 ServerNetworkStatsMap* server_network_stats_map, |
776 QuicServerInfoMap* quic_server_info_map, | 795 QuicServerInfoMap* quic_server_info_map, |
777 bool detected_corrupted_prefs) { | 796 bool detected_corrupted_prefs) { |
778 // Preferences have the master data because admins might have pushed new | 797 // Preferences have the master data because admins might have pushed new |
779 // preferences. Update the cached data with new data from preferences. | 798 // preferences. Update the cached data with new data from preferences. |
780 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); | 799 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); |
781 | 800 |
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1161 quic_servers_dict); | 1180 quic_servers_dict); |
1162 } | 1181 } |
1163 | 1182 |
1164 void HttpServerPropertiesManager::OnHttpServerPropertiesChanged() { | 1183 void HttpServerPropertiesManager::OnHttpServerPropertiesChanged() { |
1165 DCHECK(pref_task_runner_->RunsTasksOnCurrentThread()); | 1184 DCHECK(pref_task_runner_->RunsTasksOnCurrentThread()); |
1166 if (!setting_prefs_) | 1185 if (!setting_prefs_) |
1167 ScheduleUpdateCacheOnPrefThread(); | 1186 ScheduleUpdateCacheOnPrefThread(); |
1168 } | 1187 } |
1169 | 1188 |
1170 } // namespace net | 1189 } // namespace net |
OLD | NEW |