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 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
183 http_server_properties_impl_->SetHTTP11Required(server); | 183 http_server_properties_impl_->SetHTTP11Required(server); |
184 ScheduleUpdatePrefsOnNetworkThread(HTTP_11_REQUIRED); | 184 ScheduleUpdatePrefsOnNetworkThread(HTTP_11_REQUIRED); |
185 } | 185 } |
186 | 186 |
187 void HttpServerPropertiesManager::MaybeForceHTTP11(const HostPortPair& server, | 187 void HttpServerPropertiesManager::MaybeForceHTTP11(const HostPortPair& server, |
188 SSLConfig* ssl_config) { | 188 SSLConfig* ssl_config) { |
189 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); | 189 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); |
190 http_server_properties_impl_->MaybeForceHTTP11(server, ssl_config); | 190 http_server_properties_impl_->MaybeForceHTTP11(server, ssl_config); |
191 } | 191 } |
192 | 192 |
193 AlternativeService HttpServerPropertiesManager::GetAlternativeService( | 193 AlternativeServiceVector HttpServerPropertiesManager::GetAlternativeServices( |
194 const HostPortPair& origin) { | 194 const HostPortPair& origin) { |
195 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); | 195 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); |
196 return http_server_properties_impl_->GetAlternativeService(origin); | 196 return http_server_properties_impl_->GetAlternativeServices(origin); |
197 } | 197 } |
198 | 198 |
199 void HttpServerPropertiesManager::SetAlternativeService( | 199 void HttpServerPropertiesManager::AddAlternativeService( |
200 const HostPortPair& origin, | 200 const HostPortPair& origin, |
201 const AlternativeService& alternative_service, | 201 const AlternativeService& alternative_service, |
202 double alternative_probability) { | 202 double alternative_probability) { |
203 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); | 203 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); |
204 AlternativeService old_alternative_service = GetAlternativeService(origin); | 204 http_server_properties_impl_->AddAlternativeService( |
205 http_server_properties_impl_->SetAlternativeService( | |
206 origin, alternative_service, alternative_probability); | 205 origin, alternative_service, alternative_probability); |
207 AlternativeService new_alternative_service = GetAlternativeService(origin); | 206 ScheduleUpdatePrefsOnNetworkThread(SET_ALTERNATIVE_SERVICE); |
208 // If |alternative_probability| was above the threashold now it is below or | |
209 // vice versa, then a different alternative_service will be returned from the | |
210 // old and if so, then persist. | |
211 if (old_alternative_service != new_alternative_service) | |
212 ScheduleUpdatePrefsOnNetworkThread(SET_ALTERNATIVE_SERVICE); | |
Ryan Hamilton
2015/06/29 21:15:52
You seem to have removed the conditional here of n
Bence
2015/06/30 19:16:14
I think SetAlternativeServices is a good idea. It
Ryan Hamilton
2015/07/06 17:48:09
I'm not sure that I understand. If the output of G
Bence
2015/07/07 09:55:55
There might be situations when the output of GetAl
| |
213 } | 207 } |
214 | 208 |
215 void HttpServerPropertiesManager::MarkAlternativeServiceBroken( | 209 void HttpServerPropertiesManager::MarkAlternativeServiceBroken( |
216 const AlternativeService& alternative_service) { | 210 const AlternativeService& alternative_service) { |
217 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); | 211 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); |
218 http_server_properties_impl_->MarkAlternativeServiceBroken( | 212 http_server_properties_impl_->MarkAlternativeServiceBroken( |
219 alternative_service); | 213 alternative_service); |
220 ScheduleUpdatePrefsOnNetworkThread(MARK_ALTERNATIVE_SERVICE_BROKEN); | 214 ScheduleUpdatePrefsOnNetworkThread(MARK_ALTERNATIVE_SERVICE_BROKEN); |
221 } | 215 } |
222 | 216 |
(...skipping 26 matching lines...) Expand all Loading... | |
249 alternative_service); | 243 alternative_service); |
250 http_server_properties_impl_->ConfirmAlternativeService(alternative_service); | 244 http_server_properties_impl_->ConfirmAlternativeService(alternative_service); |
251 bool new_value = http_server_properties_impl_->IsAlternativeServiceBroken( | 245 bool new_value = http_server_properties_impl_->IsAlternativeServiceBroken( |
252 alternative_service); | 246 alternative_service); |
253 // For persisting, we only care about the value returned by | 247 // For persisting, we only care about the value returned by |
254 // IsAlternativeServiceBroken. If that value changes, then call persist. | 248 // IsAlternativeServiceBroken. If that value changes, then call persist. |
255 if (old_value != new_value) | 249 if (old_value != new_value) |
256 ScheduleUpdatePrefsOnNetworkThread(CONFIRM_ALTERNATIVE_SERVICE); | 250 ScheduleUpdatePrefsOnNetworkThread(CONFIRM_ALTERNATIVE_SERVICE); |
257 } | 251 } |
258 | 252 |
259 void HttpServerPropertiesManager::ClearAlternativeService( | 253 void HttpServerPropertiesManager::ClearAlternativeServices( |
260 const HostPortPair& origin) { | 254 const HostPortPair& origin) { |
261 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); | 255 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); |
262 const AlternativeServiceMap& map = | 256 const AlternativeServiceMap& map = |
263 http_server_properties_impl_->alternative_service_map(); | 257 http_server_properties_impl_->alternative_service_map(); |
264 size_t old_size = map.size(); | 258 size_t old_size = map.size(); |
265 http_server_properties_impl_->ClearAlternativeService(origin); | 259 http_server_properties_impl_->ClearAlternativeServices(origin); |
266 size_t new_size = map.size(); | 260 size_t new_size = map.size(); |
267 // Persist only if we have deleted an entry. | 261 // Persist only if we have deleted an entry. |
268 if (old_size != new_size) | 262 if (old_size != new_size) |
269 ScheduleUpdatePrefsOnNetworkThread(CLEAR_ALTERNATIVE_SERVICE); | 263 ScheduleUpdatePrefsOnNetworkThread(CLEAR_ALTERNATIVE_SERVICE); |
270 } | 264 } |
271 | 265 |
272 const AlternativeServiceMap& | 266 const AlternativeServiceMap& |
273 HttpServerPropertiesManager::alternative_service_map() const { | 267 HttpServerPropertiesManager::alternative_service_map() const { |
274 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); | 268 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); |
275 return http_server_properties_impl_->alternative_service_map(); | 269 return http_server_properties_impl_->alternative_service_map(); |
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
566 | 560 |
567 bool HttpServerPropertiesManager::AddToAlternativeServiceMap( | 561 bool HttpServerPropertiesManager::AddToAlternativeServiceMap( |
568 const HostPortPair& server, | 562 const HostPortPair& server, |
569 const base::DictionaryValue& server_pref_dict, | 563 const base::DictionaryValue& server_pref_dict, |
570 AlternativeServiceMap* alternative_service_map) { | 564 AlternativeServiceMap* alternative_service_map) { |
571 DCHECK(alternative_service_map->Peek(server) == | 565 DCHECK(alternative_service_map->Peek(server) == |
572 alternative_service_map->end()); | 566 alternative_service_map->end()); |
573 // Get alternative_services... | 567 // Get alternative_services... |
574 const base::ListValue* alternative_service_list; | 568 const base::ListValue* alternative_service_list; |
575 const base::DictionaryValue* alternative_service_dict; | 569 const base::DictionaryValue* alternative_service_dict; |
576 AlternativeServiceInfo alternative_service_info; | 570 AlternativeServiceInfoVector alternative_service_info_vector; |
577 if (server_pref_dict.GetListWithoutPathExpansion(kAlternativeServiceKey, | 571 if (server_pref_dict.GetListWithoutPathExpansion(kAlternativeServiceKey, |
578 &alternative_service_list)) { | 572 &alternative_service_list)) { |
579 if (alternative_service_list->empty()) { | 573 for (const base::Value* alternative_service_list_item : |
580 return false; | 574 *alternative_service_list) { |
575 if (!alternative_service_list_item->GetAsDictionary( | |
576 &alternative_service_dict)) | |
577 return false; | |
578 AlternativeServiceInfo alternative_service_info = | |
579 ParseAlternativeServiceDict(*alternative_service_dict, | |
580 server.ToString()); | |
581 if (alternative_service_info.alternative_service.protocol == | |
582 UNINITIALIZED_ALTERNATE_PROTOCOL) { | |
583 return false; | |
584 } | |
585 alternative_service_info_vector.push_back(alternative_service_info); | |
581 } | 586 } |
582 // Get first element of the list. | |
583 // TODO(bnc): Once we store multiple AlternativeServiceInfo per server, read | |
584 // all of them. | |
585 if (!alternative_service_list->GetDictionary(0, | |
586 &alternative_service_dict)) { | |
587 return false; | |
588 } | |
589 alternative_service_info = ParseAlternativeServiceDict( | |
590 *alternative_service_dict, server.ToString()); | |
591 } else { | 587 } else { |
592 // ...or alternate_protocol. | 588 // ...or alternate_protocol. |
593 // TODO(bnc): Remove this in M46, we do not need preference migration for | 589 // TODO(bnc): Remove this in M46, we do not need preference migration for |
594 // long. | 590 // long. |
595 if (!server_pref_dict.GetDictionaryWithoutPathExpansion( | 591 if (!server_pref_dict.GetDictionaryWithoutPathExpansion( |
596 kAlternateProtocolKey, &alternative_service_dict)) { | 592 kAlternateProtocolKey, &alternative_service_dict)) { |
597 return true; | 593 return true; |
598 } | 594 } |
599 alternative_service_info = ParseAlternativeServiceDict( | 595 AlternativeServiceInfo alternative_service_info = |
600 *alternative_service_dict, server.ToString()); | 596 ParseAlternativeServiceDict(*alternative_service_dict, |
597 server.ToString()); | |
598 if (alternative_service_info.alternative_service.protocol == | |
599 UNINITIALIZED_ALTERNATE_PROTOCOL) { | |
600 return false; | |
601 } | |
602 alternative_service_info_vector.push_back(alternative_service_info); | |
601 } | 603 } |
602 | 604 |
603 if (alternative_service_info.alternative_service.protocol == | 605 if (alternative_service_info_vector.empty()) { |
604 UNINITIALIZED_ALTERNATE_PROTOCOL) { | |
605 return false; | 606 return false; |
606 } | 607 } |
607 alternative_service_map->Put(server, alternative_service_info); | 608 |
609 alternative_service_map->Put(server, alternative_service_info_vector); | |
608 return true; | 610 return true; |
609 } | 611 } |
610 | 612 |
611 bool HttpServerPropertiesManager::ReadSupportsQuic( | 613 bool HttpServerPropertiesManager::ReadSupportsQuic( |
612 const base::DictionaryValue& http_server_properties_dict, | 614 const base::DictionaryValue& http_server_properties_dict, |
613 IPAddressNumber* last_quic_address) { | 615 IPAddressNumber* last_quic_address) { |
614 const base::DictionaryValue* supports_quic_dict = NULL; | 616 const base::DictionaryValue* supports_quic_dict = NULL; |
615 if (!http_server_properties_dict.GetDictionaryWithoutPathExpansion( | 617 if (!http_server_properties_dict.GetDictionaryWithoutPathExpansion( |
616 kSupportsQuicKey, &supports_quic_dict)) { | 618 kSupportsQuicKey, &supports_quic_dict)) { |
617 return true; | 619 return true; |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
672 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); | 674 DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); |
673 | 675 |
674 UMA_HISTOGRAM_COUNTS("Net.CountOfSpdyServers", spdy_servers->size()); | 676 UMA_HISTOGRAM_COUNTS("Net.CountOfSpdyServers", spdy_servers->size()); |
675 http_server_properties_impl_->InitializeSpdyServers(spdy_servers, true); | 677 http_server_properties_impl_->InitializeSpdyServers(spdy_servers, true); |
676 | 678 |
677 // Update the cached data and use the new spdy_settings from preferences. | 679 // Update the cached data and use the new spdy_settings from preferences. |
678 UMA_HISTOGRAM_COUNTS("Net.CountOfSpdySettings", spdy_settings_map->size()); | 680 UMA_HISTOGRAM_COUNTS("Net.CountOfSpdySettings", spdy_settings_map->size()); |
679 http_server_properties_impl_->InitializeSpdySettingsServers( | 681 http_server_properties_impl_->InitializeSpdySettingsServers( |
680 spdy_settings_map); | 682 spdy_settings_map); |
681 | 683 |
682 // Update the cached data and use the new Alternate-Protocol server list from | 684 // Update the cached data and use the new alternative service list from |
683 // preferences. | 685 // preferences. |
684 UMA_HISTOGRAM_COUNTS("Net.CountOfAlternateProtocolServers", | 686 UMA_HISTOGRAM_COUNTS("Net.CountOfAlternateProtocolServers", |
685 alternative_service_map->size()); | 687 alternative_service_map->size()); |
686 http_server_properties_impl_->InitializeAlternativeServiceServers( | 688 http_server_properties_impl_->InitializeAlternativeServiceServers( |
687 alternative_service_map); | 689 alternative_service_map); |
688 | 690 |
689 http_server_properties_impl_->InitializeSupportsQuic(last_quic_address); | 691 http_server_properties_impl_->InitializeSupportsQuic(last_quic_address); |
690 | 692 |
691 http_server_properties_impl_->InitializeServerNetworkStats( | 693 http_server_properties_impl_->InitializeServerNetworkStats( |
692 server_network_stats_map); | 694 server_network_stats_map); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
748 | 750 |
749 AlternativeServiceMap* alternative_service_map = | 751 AlternativeServiceMap* alternative_service_map = |
750 new AlternativeServiceMap(kMaxAlternateProtocolHostsToPersist); | 752 new AlternativeServiceMap(kMaxAlternateProtocolHostsToPersist); |
751 const AlternativeServiceMap& map = | 753 const AlternativeServiceMap& map = |
752 http_server_properties_impl_->alternative_service_map(); | 754 http_server_properties_impl_->alternative_service_map(); |
753 count = 0; | 755 count = 0; |
754 typedef std::map<std::string, bool> CanonicalHostPersistedMap; | 756 typedef std::map<std::string, bool> CanonicalHostPersistedMap; |
755 CanonicalHostPersistedMap persisted_map; | 757 CanonicalHostPersistedMap persisted_map; |
756 for (AlternativeServiceMap::const_iterator it = map.begin(); | 758 for (AlternativeServiceMap::const_iterator it = map.begin(); |
757 it != map.end() && count < kMaxAlternateProtocolHostsToPersist; ++it) { | 759 it != map.end() && count < kMaxAlternateProtocolHostsToPersist; ++it) { |
758 const AlternativeServiceInfo& alternative_service_info = it->second; | 760 const HostPortPair& server = it->first; |
759 if (!IsAlternateProtocolValid( | 761 AlternativeServiceInfoVector notbroken_alternative_service_info_vector; |
760 alternative_service_info.alternative_service.protocol)) { | 762 for (const AlternativeServiceInfo& alternative_service_info : it->second) { |
763 if (!IsAlternateProtocolValid( | |
764 alternative_service_info.alternative_service.protocol)) { | |
765 continue; | |
766 } | |
767 AlternativeService alternative_service( | |
768 alternative_service_info.alternative_service); | |
769 if (alternative_service.host.empty()) { | |
770 alternative_service.host = server.host(); | |
771 } | |
772 if (IsAlternativeServiceBroken(alternative_service)) { | |
773 continue; | |
774 } | |
775 notbroken_alternative_service_info_vector.push_back( | |
776 alternative_service_info); | |
777 } | |
778 if (notbroken_alternative_service_info_vector.empty()) { | |
761 continue; | 779 continue; |
762 } | 780 } |
763 const HostPortPair& server = it->first; | 781 alternative_service_map->Put(server, |
764 AlternativeService alternative_service( | 782 notbroken_alternative_service_info_vector); |
765 alternative_service_info.alternative_service); | |
766 if (alternative_service.host.empty()) { | |
767 alternative_service.host = server.host(); | |
768 } | |
769 if (IsAlternativeServiceBroken(alternative_service)) { | |
770 continue; | |
771 } | |
772 std::string canonical_suffix = | 783 std::string canonical_suffix = |
773 http_server_properties_impl_->GetCanonicalSuffix(server.host()); | 784 http_server_properties_impl_->GetCanonicalSuffix(server.host()); |
774 if (!canonical_suffix.empty()) { | 785 if (!canonical_suffix.empty()) { |
775 if (persisted_map.find(canonical_suffix) != persisted_map.end()) | 786 if (persisted_map.find(canonical_suffix) != persisted_map.end()) |
776 continue; | 787 continue; |
777 persisted_map[canonical_suffix] = true; | 788 persisted_map[canonical_suffix] = true; |
778 } | 789 } |
779 alternative_service_map->Put(server, alternative_service_info); | |
780 ++count; | 790 ++count; |
781 } | 791 } |
782 | 792 |
783 ServerNetworkStatsMap* server_network_stats_map = | 793 ServerNetworkStatsMap* server_network_stats_map = |
784 new ServerNetworkStatsMap(kMaxServerNetworkStatsHostsToPersist); | 794 new ServerNetworkStatsMap(kMaxServerNetworkStatsHostsToPersist); |
785 const ServerNetworkStatsMap& main_server_network_stats_map = | 795 const ServerNetworkStatsMap& main_server_network_stats_map = |
786 http_server_properties_impl_->server_network_stats_map(); | 796 http_server_properties_impl_->server_network_stats_map(); |
787 for (ServerNetworkStatsMap::const_iterator it = | 797 for (ServerNetworkStatsMap::const_iterator it = |
788 main_server_network_stats_map.begin(); | 798 main_server_network_stats_map.begin(); |
789 it != main_server_network_stats_map.end(); ++it) { | 799 it != main_server_network_stats_map.end(); ++it) { |
790 server_network_stats_map->Put(it->first, it->second); | 800 server_network_stats_map->Put(it->first, it->second); |
791 } | 801 } |
792 | 802 |
793 IPAddressNumber* last_quic_addr = new IPAddressNumber; | 803 IPAddressNumber* last_quic_addr = new IPAddressNumber; |
794 http_server_properties_impl_->GetSupportsQuic(last_quic_addr); | 804 http_server_properties_impl_->GetSupportsQuic(last_quic_addr); |
795 // Update the preferences on the pref thread. | 805 // Update the preferences on the pref thread. |
796 pref_task_runner_->PostTask( | 806 pref_task_runner_->PostTask( |
797 FROM_HERE, | 807 FROM_HERE, |
798 base::Bind( | 808 base::Bind( |
799 &HttpServerPropertiesManager::UpdatePrefsOnPrefThread, pref_weak_ptr_, | 809 &HttpServerPropertiesManager::UpdatePrefsOnPrefThread, pref_weak_ptr_, |
800 base::Owned(spdy_server_list), base::Owned(spdy_settings_map), | 810 base::Owned(spdy_server_list), base::Owned(spdy_settings_map), |
801 base::Owned(alternative_service_map), base::Owned(last_quic_addr), | 811 base::Owned(alternative_service_map), base::Owned(last_quic_addr), |
802 base::Owned(server_network_stats_map), completion)); | 812 base::Owned(server_network_stats_map), completion)); |
803 } | 813 } |
804 | 814 |
805 // A local or temporary data structure to hold |supports_spdy|, SpdySettings, | 815 // A local or temporary data structure to hold |supports_spdy|, SpdySettings, |
806 // AlternativeServiceInfo and SupportsQuic preferences for a server. This is | 816 // AlternativeServiceInfoVector, and SupportsQuic preferences for a server. This |
807 // used only in UpdatePrefsOnPrefThread. | 817 // is used only in UpdatePrefsOnPrefThread. |
808 struct ServerPref { | 818 struct ServerPref { |
809 ServerPref() | 819 ServerPref() |
810 : supports_spdy(false), | 820 : supports_spdy(false), |
811 settings_map(NULL), | 821 settings_map(NULL), |
812 alternative_service(NULL), | 822 alternative_service_info_vector(NULL), |
813 supports_quic(NULL), | 823 supports_quic(NULL), |
814 server_network_stats(NULL) {} | 824 server_network_stats(NULL) {} |
815 ServerPref(bool supports_spdy, | 825 ServerPref( |
816 const SettingsMap* settings_map, | 826 bool supports_spdy, |
817 const AlternativeServiceInfo* alternative_service, | 827 const SettingsMap* settings_map, |
818 const SupportsQuic* supports_quic, | 828 const AlternativeServiceInfoVector* alternative_service_info_vector, |
819 const ServerNetworkStats* server_network_stats) | 829 const SupportsQuic* supports_quic, |
830 const ServerNetworkStats* server_network_stats) | |
820 : supports_spdy(supports_spdy), | 831 : supports_spdy(supports_spdy), |
821 settings_map(settings_map), | 832 settings_map(settings_map), |
822 alternative_service(alternative_service), | 833 alternative_service_info_vector(alternative_service_info_vector), |
823 supports_quic(supports_quic), | 834 supports_quic(supports_quic), |
824 server_network_stats(server_network_stats) {} | 835 server_network_stats(server_network_stats) {} |
825 bool supports_spdy; | 836 bool supports_spdy; |
826 const SettingsMap* settings_map; | 837 const SettingsMap* settings_map; |
827 const AlternativeServiceInfo* alternative_service; | 838 const AlternativeServiceInfoVector* alternative_service_info_vector; |
828 const SupportsQuic* supports_quic; | 839 const SupportsQuic* supports_quic; |
829 const ServerNetworkStats* server_network_stats; | 840 const ServerNetworkStats* server_network_stats; |
830 }; | 841 }; |
831 | 842 |
832 void HttpServerPropertiesManager::UpdatePrefsOnPrefThread( | 843 void HttpServerPropertiesManager::UpdatePrefsOnPrefThread( |
833 base::ListValue* spdy_server_list, | 844 base::ListValue* spdy_server_list, |
834 SpdySettingsMap* spdy_settings_map, | 845 SpdySettingsMap* spdy_settings_map, |
835 AlternativeServiceMap* alternative_service_map, | 846 AlternativeServiceMap* alternative_service_map, |
836 IPAddressNumber* last_quic_address, | 847 IPAddressNumber* last_quic_address, |
837 ServerNetworkStatsMap* server_network_stats_map, | 848 ServerNetworkStatsMap* server_network_stats_map, |
(...skipping 14 matching lines...) Expand all Loading... | |
852 } | 863 } |
853 } | 864 } |
854 | 865 |
855 // Add servers that have SpdySettings to server_pref_map. | 866 // Add servers that have SpdySettings to server_pref_map. |
856 for (SpdySettingsMap::iterator map_it = spdy_settings_map->begin(); | 867 for (SpdySettingsMap::iterator map_it = spdy_settings_map->begin(); |
857 map_it != spdy_settings_map->end(); ++map_it) { | 868 map_it != spdy_settings_map->end(); ++map_it) { |
858 const HostPortPair& server = map_it->first; | 869 const HostPortPair& server = map_it->first; |
859 server_pref_map[server].settings_map = &map_it->second; | 870 server_pref_map[server].settings_map = &map_it->second; |
860 } | 871 } |
861 | 872 |
862 // Add AlternateProtocol servers to server_pref_map. | 873 // Add alternative services to server_pref_map. |
863 for (AlternativeServiceMap::const_iterator map_it = | 874 for (AlternativeServiceMap::const_iterator map_it = |
864 alternative_service_map->begin(); | 875 alternative_service_map->begin(); |
865 map_it != alternative_service_map->end(); ++map_it) { | 876 map_it != alternative_service_map->end(); ++map_it) { |
866 server_pref_map[map_it->first].alternative_service = &map_it->second; | 877 server_pref_map[map_it->first].alternative_service_info_vector = |
878 &map_it->second; | |
867 } | 879 } |
868 | 880 |
869 // Add ServerNetworkStats servers to server_pref_map. | 881 // Add ServerNetworkStats servers to server_pref_map. |
870 for (ServerNetworkStatsMap::const_iterator map_it = | 882 for (ServerNetworkStatsMap::const_iterator map_it = |
871 server_network_stats_map->begin(); | 883 server_network_stats_map->begin(); |
872 map_it != server_network_stats_map->end(); ++map_it) { | 884 map_it != server_network_stats_map->end(); ++map_it) { |
873 const HostPortPair& server = map_it->first; | 885 const HostPortPair& server = map_it->first; |
874 server_pref_map[server].server_network_stats = &map_it->second; | 886 server_pref_map[server].server_network_stats = &map_it->second; |
875 } | 887 } |
876 | 888 |
877 // Persist properties to the |path_|. | 889 // Persist properties to the |path_|. |
878 base::DictionaryValue http_server_properties_dict; | 890 base::DictionaryValue http_server_properties_dict; |
879 base::DictionaryValue* servers_dict = new base::DictionaryValue; | 891 base::DictionaryValue* servers_dict = new base::DictionaryValue; |
880 for (ServerPrefMap::const_iterator map_it = server_pref_map.begin(); | 892 for (ServerPrefMap::const_iterator map_it = server_pref_map.begin(); |
881 map_it != server_pref_map.end(); | 893 map_it != server_pref_map.end(); |
882 ++map_it) { | 894 ++map_it) { |
883 const HostPortPair& server = map_it->first; | 895 const HostPortPair& server = map_it->first; |
884 const ServerPref& server_pref = map_it->second; | 896 const ServerPref& server_pref = map_it->second; |
885 | 897 |
886 base::DictionaryValue* server_pref_dict = new base::DictionaryValue; | 898 base::DictionaryValue* server_pref_dict = new base::DictionaryValue; |
887 | 899 |
888 // Save supports_spdy. | 900 // Save supports_spdy. |
889 if (server_pref.supports_spdy) | 901 if (server_pref.supports_spdy) |
890 server_pref_dict->SetBoolean(kSupportsSpdyKey, server_pref.supports_spdy); | 902 server_pref_dict->SetBoolean(kSupportsSpdyKey, server_pref.supports_spdy); |
891 SaveSpdySettingsToServerPrefs(server_pref.settings_map, server_pref_dict); | 903 SaveSpdySettingsToServerPrefs(server_pref.settings_map, server_pref_dict); |
892 SaveAlternativeServiceToServerPrefs(server_pref.alternative_service, | 904 SaveAlternativeServiceToServerPrefs( |
893 server_pref_dict); | 905 server_pref.alternative_service_info_vector, server_pref_dict); |
894 SaveNetworkStatsToServerPrefs(server_pref.server_network_stats, | 906 SaveNetworkStatsToServerPrefs(server_pref.server_network_stats, |
895 server_pref_dict); | 907 server_pref_dict); |
896 | 908 |
897 servers_dict->SetWithoutPathExpansion(server.ToString(), server_pref_dict); | 909 servers_dict->SetWithoutPathExpansion(server.ToString(), server_pref_dict); |
898 } | 910 } |
899 | 911 |
900 http_server_properties_dict.SetWithoutPathExpansion(kServersKey, | 912 http_server_properties_dict.SetWithoutPathExpansion(kServersKey, |
901 servers_dict); | 913 servers_dict); |
902 SetVersion(&http_server_properties_dict, kVersionNumber); | 914 SetVersion(&http_server_properties_dict, kVersionNumber); |
903 | 915 |
(...skipping 22 matching lines...) Expand all Loading... | |
926 it != settings_map->end(); ++it) { | 938 it != settings_map->end(); ++it) { |
927 SpdySettingsIds id = it->first; | 939 SpdySettingsIds id = it->first; |
928 uint32 value = it->second.second; | 940 uint32 value = it->second.second; |
929 std::string key = base::StringPrintf("%u", id); | 941 std::string key = base::StringPrintf("%u", id); |
930 spdy_settings_dict->SetInteger(key, value); | 942 spdy_settings_dict->SetInteger(key, value); |
931 } | 943 } |
932 server_pref_dict->SetWithoutPathExpansion(kSettingsKey, spdy_settings_dict); | 944 server_pref_dict->SetWithoutPathExpansion(kSettingsKey, spdy_settings_dict); |
933 } | 945 } |
934 | 946 |
935 void HttpServerPropertiesManager::SaveAlternativeServiceToServerPrefs( | 947 void HttpServerPropertiesManager::SaveAlternativeServiceToServerPrefs( |
936 const AlternativeServiceInfo* alternative_service_info, | 948 const AlternativeServiceInfoVector* alternative_service_info_vector, |
937 base::DictionaryValue* server_pref_dict) { | 949 base::DictionaryValue* server_pref_dict) { |
938 if (!alternative_service_info) | 950 if (!alternative_service_info_vector || |
951 alternative_service_info_vector->empty()) { | |
939 return; | 952 return; |
940 | |
941 const AlternativeService& alternative_service = | |
942 alternative_service_info->alternative_service; | |
943 base::DictionaryValue* alternative_service_info_dict = | |
944 new base::DictionaryValue; | |
945 alternative_service_info_dict->SetString( | |
946 kProtocolKey, AlternateProtocolToString(alternative_service.protocol)); | |
947 if (!alternative_service.host.empty()) { | |
948 alternative_service_info_dict->SetString(kHostKey, | |
949 alternative_service.host); | |
950 } | 953 } |
951 alternative_service_info_dict->SetInteger(kPortKey, alternative_service.port); | 954 scoped_ptr<base::ListValue> alternative_service_list(new base::ListValue); |
952 alternative_service_info_dict->SetDouble( | 955 for (const AlternativeServiceInfo& alternative_service_info : |
953 kProbabilityKey, alternative_service_info->probability); | 956 *alternative_service_info_vector) { |
954 | 957 const AlternativeService alternative_service = |
955 // Create a single element list here. | 958 alternative_service_info.alternative_service; |
956 // TODO(bnc): Once we store multiple AlternativeServiceInfo per server, save | 959 DCHECK(IsAlternateProtocolValid(alternative_service.protocol)); |
957 // all of them. | 960 base::DictionaryValue* alternative_service_dict = new base::DictionaryValue; |
958 base::ListValue* alternative_service_list = new base::ListValue(); | 961 alternative_service_dict->SetInteger(kPortKey, alternative_service.port); |
959 alternative_service_list->Append(alternative_service_info_dict); | 962 if (!alternative_service.host.empty()) { |
963 alternative_service_dict->SetString(kHostKey, alternative_service.host); | |
964 } | |
965 alternative_service_dict->SetString( | |
966 kProtocolKey, AlternateProtocolToString(alternative_service.protocol)); | |
967 alternative_service_dict->SetDouble(kProbabilityKey, | |
968 alternative_service_info.probability); | |
969 alternative_service_list->Append(alternative_service_dict); | |
970 } | |
971 if (alternative_service_list->GetSize() == 0) | |
972 return; | |
960 server_pref_dict->SetWithoutPathExpansion(kAlternativeServiceKey, | 973 server_pref_dict->SetWithoutPathExpansion(kAlternativeServiceKey, |
961 alternative_service_list); | 974 alternative_service_list.release()); |
962 } | 975 } |
963 | 976 |
964 void HttpServerPropertiesManager::SaveSupportsQuicToPrefs( | 977 void HttpServerPropertiesManager::SaveSupportsQuicToPrefs( |
965 const IPAddressNumber* last_quic_address, | 978 const IPAddressNumber* last_quic_address, |
966 base::DictionaryValue* http_server_properties_dict) { | 979 base::DictionaryValue* http_server_properties_dict) { |
967 if (!last_quic_address || last_quic_address->empty()) | 980 if (!last_quic_address || last_quic_address->empty()) |
968 return; | 981 return; |
969 | 982 |
970 base::DictionaryValue* supports_quic_dict = new base::DictionaryValue; | 983 base::DictionaryValue* supports_quic_dict = new base::DictionaryValue; |
971 supports_quic_dict->SetBoolean(kUsedQuicKey, true); | 984 supports_quic_dict->SetBoolean(kUsedQuicKey, true); |
(...skipping 19 matching lines...) Expand all Loading... | |
991 server_network_stats_dict); | 1004 server_network_stats_dict); |
992 } | 1005 } |
993 | 1006 |
994 void HttpServerPropertiesManager::OnHttpServerPropertiesChanged() { | 1007 void HttpServerPropertiesManager::OnHttpServerPropertiesChanged() { |
995 DCHECK(pref_task_runner_->RunsTasksOnCurrentThread()); | 1008 DCHECK(pref_task_runner_->RunsTasksOnCurrentThread()); |
996 if (!setting_prefs_) | 1009 if (!setting_prefs_) |
997 ScheduleUpdateCacheOnPrefThread(); | 1010 ScheduleUpdateCacheOnPrefThread(); |
998 } | 1011 } |
999 | 1012 |
1000 } // namespace net | 1013 } // namespace net |
OLD | NEW |