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 <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
(...skipping 501 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
512 if (!AddToQuicServerInfoMap(http_server_properties_dict, | 512 if (!AddToQuicServerInfoMap(http_server_properties_dict, |
513 quic_server_info_map.get())) { | 513 quic_server_info_map.get())) { |
514 detected_corrupted_prefs = true; | 514 detected_corrupted_prefs = true; |
515 } | 515 } |
516 | 516 |
517 network_task_runner_->PostTask( | 517 network_task_runner_->PostTask( |
518 FROM_HERE, | 518 FROM_HERE, |
519 base::Bind( | 519 base::Bind( |
520 &HttpServerPropertiesManager::UpdateCacheFromPrefsOnNetworkSequence, | 520 &HttpServerPropertiesManager::UpdateCacheFromPrefsOnNetworkSequence, |
521 base::Unretained(this), base::Owned(spdy_servers.release()), | 521 base::Unretained(this), base::Owned(spdy_servers.release()), |
522 base::Owned(alternative_service_map.release()), base::Owned(addr), | 522 base::Passed(&alternative_service_map), base::Owned(addr), |
523 base::Owned(server_network_stats_map.release()), | 523 base::Passed(&server_network_stats_map), |
524 base::Owned(quic_server_info_map.release()), | 524 base::Passed(&quic_server_info_map), detected_corrupted_prefs)); |
525 detected_corrupted_prefs)); | |
526 } | 525 } |
527 | 526 |
528 bool HttpServerPropertiesManager::AddServersData( | 527 bool HttpServerPropertiesManager::AddServersData( |
529 const base::DictionaryValue& servers_dict, | 528 const base::DictionaryValue& servers_dict, |
530 ServerList* spdy_servers, | 529 ServerList* spdy_servers, |
531 AlternativeServiceMap* alternative_service_map, | 530 AlternativeServiceMap* alternative_service_map, |
532 ServerNetworkStatsMap* network_stats_map, | 531 ServerNetworkStatsMap* network_stats_map, |
533 int version) { | 532 int version) { |
534 for (base::DictionaryValue::Iterator it(servers_dict); !it.IsAtEnd(); | 533 for (base::DictionaryValue::Iterator it(servers_dict); !it.IsAtEnd(); |
535 it.Advance()) { | 534 it.Advance()) { |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
768 << quic_server_id_str; | 767 << quic_server_id_str; |
769 detected_corrupted_prefs = true; | 768 detected_corrupted_prefs = true; |
770 continue; | 769 continue; |
771 } | 770 } |
772 quic_server_info_map->Put(quic_server_id, quic_server_info); | 771 quic_server_info_map->Put(quic_server_id, quic_server_info); |
773 } | 772 } |
774 return !detected_corrupted_prefs; | 773 return !detected_corrupted_prefs; |
775 } | 774 } |
776 | 775 |
777 void HttpServerPropertiesManager::UpdateCacheFromPrefsOnNetworkSequence( | 776 void HttpServerPropertiesManager::UpdateCacheFromPrefsOnNetworkSequence( |
778 ServerList* spdy_servers, | 777 const ServerList* spdy_servers, |
779 AlternativeServiceMap* alternative_service_map, | 778 std::unique_ptr<AlternativeServiceMap> alternative_service_map, |
780 IPAddress* last_quic_address, | 779 const IPAddress* last_quic_address, |
781 ServerNetworkStatsMap* server_network_stats_map, | 780 std::unique_ptr<ServerNetworkStatsMap> server_network_stats_map, |
782 QuicServerInfoMap* quic_server_info_map, | 781 std::unique_ptr<QuicServerInfoMap> quic_server_info_map, |
783 bool detected_corrupted_prefs) { | 782 bool detected_corrupted_prefs) { |
784 // Preferences have the master data because admins might have pushed new | 783 // Preferences have the master data because admins might have pushed new |
785 // preferences. Update the cached data with new data from preferences. | 784 // preferences. Update the cached data with new data from preferences. |
786 DCHECK(network_task_runner_->RunsTasksInCurrentSequence()); | 785 DCHECK(network_task_runner_->RunsTasksInCurrentSequence()); |
787 | 786 |
788 UMA_HISTOGRAM_COUNTS("Net.CountOfSpdyServers", spdy_servers->size()); | 787 UMA_HISTOGRAM_COUNTS("Net.CountOfSpdyServers", spdy_servers->size()); |
789 http_server_properties_impl_->SetSpdyServers(spdy_servers, true); | 788 http_server_properties_impl_->SetSpdyServers(spdy_servers, true); |
790 | 789 |
791 // Update the cached data and use the new alternative service list from | 790 // Update the cached data and use the new alternative service list from |
792 // preferences. | 791 // preferences. |
793 UMA_HISTOGRAM_COUNTS("Net.CountOfAlternateProtocolServers", | 792 UMA_HISTOGRAM_COUNTS("Net.CountOfAlternateProtocolServers", |
794 alternative_service_map->size()); | 793 alternative_service_map->size()); |
795 http_server_properties_impl_->SetAlternativeServiceServers( | 794 http_server_properties_impl_->SetAlternativeServiceServers( |
796 alternative_service_map); | 795 std::move(alternative_service_map)); |
797 | 796 |
798 http_server_properties_impl_->SetSupportsQuic(last_quic_address); | 797 http_server_properties_impl_->SetSupportsQuic(last_quic_address); |
799 | 798 |
800 http_server_properties_impl_->SetServerNetworkStats(server_network_stats_map); | 799 http_server_properties_impl_->SetServerNetworkStats( |
800 std::move(server_network_stats_map)); | |
801 | 801 |
802 UMA_HISTOGRAM_COUNTS_1000("Net.CountOfQuicServerInfos", | 802 UMA_HISTOGRAM_COUNTS_1000("Net.CountOfQuicServerInfos", |
803 quic_server_info_map->size()); | 803 quic_server_info_map->size()); |
804 | 804 |
805 http_server_properties_impl_->SetQuicServerInfoMap(quic_server_info_map); | 805 http_server_properties_impl_->SetQuicServerInfoMap( |
806 std::move(quic_server_info_map)); | |
806 | 807 |
807 // Update the prefs with what we have read (delete all corrupted prefs). | 808 // Update the prefs with what we have read (delete all corrupted prefs). |
808 if (detected_corrupted_prefs) | 809 if (detected_corrupted_prefs) |
809 ScheduleUpdatePrefsOnNetworkSequence(DETECTED_CORRUPTED_PREFS); | 810 ScheduleUpdatePrefsOnNetworkSequence(DETECTED_CORRUPTED_PREFS); |
810 } | 811 } |
811 | 812 |
812 // | 813 // |
813 // Update Preferences with data from the cached data. | 814 // Update Preferences with data from the cached data. |
814 // | 815 // |
815 void HttpServerPropertiesManager::ScheduleUpdatePrefsOnNetworkSequence( | 816 void HttpServerPropertiesManager::ScheduleUpdatePrefsOnNetworkSequence( |
(...skipping 15 matching lines...) Expand all Loading... | |
831 // This is required so we can set this as the callback for a timer. | 832 // This is required so we can set this as the callback for a timer. |
832 void HttpServerPropertiesManager::UpdatePrefsFromCacheOnNetworkSequence() { | 833 void HttpServerPropertiesManager::UpdatePrefsFromCacheOnNetworkSequence() { |
833 UpdatePrefsFromCacheOnNetworkSequence(base::Closure()); | 834 UpdatePrefsFromCacheOnNetworkSequence(base::Closure()); |
834 } | 835 } |
835 | 836 |
836 void HttpServerPropertiesManager::UpdatePrefsFromCacheOnNetworkSequence( | 837 void HttpServerPropertiesManager::UpdatePrefsFromCacheOnNetworkSequence( |
837 const base::Closure& completion) { | 838 const base::Closure& completion) { |
838 DCHECK(network_task_runner_->RunsTasksInCurrentSequence()); | 839 DCHECK(network_task_runner_->RunsTasksInCurrentSequence()); |
839 | 840 |
840 // It is in MRU order. | 841 // It is in MRU order. |
841 base::ListValue* spdy_server_list = new base::ListValue; | 842 std::unique_ptr<ServerList> spdy_servers = base::MakeUnique<ServerList>(); |
842 http_server_properties_impl_->GetSpdyServerList( | 843 http_server_properties_impl_->GetSpdyServers( |
843 spdy_server_list, kMaxSupportsSpdyServerHostsToPersist); | 844 spdy_servers.get(), kMaxSupportsSpdyServerHostsToPersist); |
Ryan Hamilton
2017/06/20 18:25:56
it's a bit odd that GetSpdyServers takes a vector<
wangyix1
2017/06/21 18:45:33
Done.
| |
844 | 845 |
845 AlternativeServiceMap* alternative_service_map = | 846 AlternativeServiceMap* alternative_service_map = |
846 new AlternativeServiceMap(kMaxAlternateProtocolHostsToPersist); | 847 new AlternativeServiceMap(kMaxAlternateProtocolHostsToPersist); |
847 const AlternativeServiceMap& map = | 848 const AlternativeServiceMap& map = |
848 http_server_properties_impl_->alternative_service_map(); | 849 http_server_properties_impl_->alternative_service_map(); |
849 UMA_HISTOGRAM_COUNTS("Net.CountOfAlternateProtocolServers.Memory", | 850 UMA_HISTOGRAM_COUNTS("Net.CountOfAlternateProtocolServers.Memory", |
850 map.size()); | 851 map.size()); |
851 int count = 0; | 852 int count = 0; |
852 typedef std::map<std::string, bool> CanonicalHostPersistedMap; | 853 typedef std::map<std::string, bool> CanonicalHostPersistedMap; |
853 CanonicalHostPersistedMap persisted_map; | 854 CanonicalHostPersistedMap persisted_map; |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
915 } | 916 } |
916 } | 917 } |
917 | 918 |
918 IPAddress* last_quic_addr = new IPAddress; | 919 IPAddress* last_quic_addr = new IPAddress; |
919 http_server_properties_impl_->GetSupportsQuic(last_quic_addr); | 920 http_server_properties_impl_->GetSupportsQuic(last_quic_addr); |
920 // Update the preferences on the pref thread. | 921 // Update the preferences on the pref thread. |
921 pref_task_runner_->PostTask( | 922 pref_task_runner_->PostTask( |
922 FROM_HERE, | 923 FROM_HERE, |
923 base::Bind( | 924 base::Bind( |
924 &HttpServerPropertiesManager::UpdatePrefsOnPrefThread, pref_weak_ptr_, | 925 &HttpServerPropertiesManager::UpdatePrefsOnPrefThread, pref_weak_ptr_, |
925 base::Owned(spdy_server_list), base::Owned(alternative_service_map), | 926 base::Passed(&spdy_servers), base::Owned(alternative_service_map), |
926 base::Owned(last_quic_addr), base::Owned(server_network_stats_map), | 927 base::Owned(last_quic_addr), base::Owned(server_network_stats_map), |
927 base::Owned(quic_server_info_map), completion)); | 928 base::Owned(quic_server_info_map), completion)); |
928 } | 929 } |
929 | 930 |
930 // A local or temporary data structure to hold |supports_spdy|, SpdySettings, | 931 // A local or temporary data structure to hold |supports_spdy|, SpdySettings, |
931 // AlternativeServiceInfoVector, and SupportsQuic preferences for a server. This | 932 // AlternativeServiceInfoVector, and SupportsQuic preferences for a server. This |
932 // is used only in UpdatePrefsOnPrefThread. | 933 // is used only in UpdatePrefsOnPrefThread. |
933 struct ServerPref { | 934 struct ServerPref { |
934 ServerPref() | 935 ServerPref() |
935 : supports_spdy(false), | 936 : supports_spdy(false), |
(...skipping 14 matching lines...) Expand all Loading... | |
950 server_network_stats(server_network_stats) {} | 951 server_network_stats(server_network_stats) {} |
951 bool supports_spdy; | 952 bool supports_spdy; |
952 const SettingsMap* settings_map; | 953 const SettingsMap* settings_map; |
953 const AlternativeServiceInfoVector* alternative_service_info_vector; | 954 const AlternativeServiceInfoVector* alternative_service_info_vector; |
954 const SupportsQuic* supports_quic; | 955 const SupportsQuic* supports_quic; |
955 const ServerNetworkStats* server_network_stats; | 956 const ServerNetworkStats* server_network_stats; |
956 }; | 957 }; |
957 | 958 |
958 // All maps and lists are in MRU order. | 959 // All maps and lists are in MRU order. |
959 void HttpServerPropertiesManager::UpdatePrefsOnPrefThread( | 960 void HttpServerPropertiesManager::UpdatePrefsOnPrefThread( |
960 base::ListValue* spdy_server_list, | 961 std::unique_ptr<ServerList> spdy_servers, |
961 AlternativeServiceMap* alternative_service_map, | 962 AlternativeServiceMap* alternative_service_map, |
962 IPAddress* last_quic_address, | 963 IPAddress* last_quic_address, |
963 ServerNetworkStatsMap* server_network_stats_map, | 964 ServerNetworkStatsMap* server_network_stats_map, |
964 QuicServerInfoMap* quic_server_info_map, | 965 QuicServerInfoMap* quic_server_info_map, |
965 const base::Closure& completion) { | 966 const base::Closure& completion) { |
966 typedef base::MRUCache<url::SchemeHostPort, ServerPref> ServerPrefMap; | 967 typedef base::MRUCache<url::SchemeHostPort, ServerPref> ServerPrefMap; |
967 ServerPrefMap server_pref_map(ServerPrefMap::NO_AUTO_EVICT); | 968 ServerPrefMap server_pref_map(ServerPrefMap::NO_AUTO_EVICT); |
968 | 969 |
969 DCHECK(pref_task_runner_->RunsTasksInCurrentSequence()); | 970 DCHECK(pref_task_runner_->RunsTasksInCurrentSequence()); |
970 | 971 |
971 // Add servers that support spdy to server_pref_map in the MRU order. | 972 // Add servers that support spdy to server_pref_map in the MRU order. |
972 for (size_t index = spdy_server_list->GetSize(); index > 0; --index) { | 973 for (size_t i = spdy_servers->size(); i > 0; --i) { |
973 std::string server_str; | 974 url::SchemeHostPort server((GURL(spdy_servers->at(i - 1)))); |
974 if (spdy_server_list->GetString(index - 1, &server_str)) { | 975 ServerPrefMap::iterator it = server_pref_map.Get(server); |
975 url::SchemeHostPort server((GURL(server_str))); | 976 if (it == server_pref_map.end()) { |
976 ServerPrefMap::iterator it = server_pref_map.Get(server); | 977 ServerPref server_pref; |
977 if (it == server_pref_map.end()) { | 978 server_pref.supports_spdy = true; |
978 ServerPref server_pref; | 979 server_pref_map.Put(server, server_pref); |
979 server_pref.supports_spdy = true; | 980 } else { |
980 server_pref_map.Put(server, server_pref); | 981 it->second.supports_spdy = true; |
981 } else { | |
982 it->second.supports_spdy = true; | |
983 } | |
984 } | 982 } |
985 } | 983 } |
986 | 984 |
987 // Add alternative services to server_pref_map in the MRU order. | 985 // Add alternative services to server_pref_map in the MRU order. |
988 for (AlternativeServiceMap::const_reverse_iterator map_it = | 986 for (AlternativeServiceMap::const_reverse_iterator map_it = |
989 alternative_service_map->rbegin(); | 987 alternative_service_map->rbegin(); |
990 map_it != alternative_service_map->rend(); ++map_it) { | 988 map_it != alternative_service_map->rend(); ++map_it) { |
991 const url::SchemeHostPort server = map_it->first; | 989 const url::SchemeHostPort server = map_it->first; |
992 ServerPrefMap::iterator it = server_pref_map.Get(server); | 990 ServerPrefMap::iterator it = server_pref_map.Get(server); |
993 if (it == server_pref_map.end()) { | 991 if (it == server_pref_map.end()) { |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1149 if (!setting_prefs_) | 1147 if (!setting_prefs_) |
1150 ScheduleUpdateCacheOnPrefThread(); | 1148 ScheduleUpdateCacheOnPrefThread(); |
1151 } | 1149 } |
1152 | 1150 |
1153 void HttpServerPropertiesManager::SetInitialized() { | 1151 void HttpServerPropertiesManager::SetInitialized() { |
1154 DCHECK(network_task_runner_->RunsTasksInCurrentSequence()); | 1152 DCHECK(network_task_runner_->RunsTasksInCurrentSequence()); |
1155 is_initialized_ = true; | 1153 is_initialized_ = true; |
1156 } | 1154 } |
1157 | 1155 |
1158 } // namespace net | 1156 } // namespace net |
OLD | NEW |