| Index: net/http/http_server_properties_manager.cc
|
| diff --git a/net/http/http_server_properties_manager.cc b/net/http/http_server_properties_manager.cc
|
| index 35458ca7bfd6e575cbc5a27d65fccb605163251f..55aa0194c6ffff99fa1e789102e90a81f4f26a2f 100644
|
| --- a/net/http/http_server_properties_manager.cc
|
| +++ b/net/http/http_server_properties_manager.cc
|
| @@ -264,6 +264,29 @@ const SpdySettingsMap& HttpServerPropertiesManager::spdy_settings_map()
|
| return http_server_properties_impl_->spdy_settings_map();
|
| }
|
|
|
| +net::SupportsQuic
|
| +HttpServerPropertiesManager::GetSupportsQuic(
|
| + const net::HostPortPair& host_port_pair) const {
|
| + DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
|
| + return http_server_properties_impl_->GetSupportsQuic(host_port_pair);
|
| +}
|
| +
|
| +void HttpServerPropertiesManager::SetSupportsQuic(
|
| + const net::HostPortPair& host_port_pair,
|
| + bool used_quic,
|
| + const std::string& address) {
|
| + DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
|
| + http_server_properties_impl_->SetSupportsQuic(
|
| + host_port_pair, used_quic, address);
|
| + ScheduleUpdatePrefsOnNetworkThread();
|
| +}
|
| +
|
| +const SupportsQuicMap& HttpServerPropertiesManager::supports_quic_map()
|
| + const {
|
| + DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
|
| + return http_server_properties_impl_->supports_quic_map();
|
| +}
|
| +
|
| void HttpServerPropertiesManager::SetServerNetworkStats(
|
| const net::HostPortPair& host_port_pair,
|
| NetworkStats stats) {
|
| @@ -332,6 +355,8 @@ void HttpServerPropertiesManager::UpdateCacheFromPrefsOnPrefThread() {
|
| new net::SpdySettingsMap(kMaxSpdySettingsHostsToPersist));
|
| scoped_ptr<net::AlternateProtocolMap> alternate_protocol_map(
|
| new net::AlternateProtocolMap(kMaxAlternateProtocolHostsToPersist));
|
| + scoped_ptr<net::SupportsQuicMap> supports_quic_map(
|
| + new net::SupportsQuicMap());
|
| // TODO(rtenneti): Delete the following code after the experiment.
|
| int alternate_protocols_to_load = k200AlternateProtocolHostsToLoad;
|
| net::AlternateProtocolExperiment alternate_protocol_experiment =
|
| @@ -455,6 +480,32 @@ void HttpServerPropertiesManager::UpdateCacheFromPrefsOnPrefThread() {
|
| alternate_protocol_map->Put(server, port_alternate_protocol);
|
| ++count;
|
| } while (false);
|
| +
|
| + // Get SupportsQuic.
|
| + DCHECK(supports_quic_map->find(server) == supports_quic_map->end());
|
| + const base::DictionaryValue* supports_quic_dict = NULL;
|
| + if (!server_pref_dict->GetDictionaryWithoutPathExpansion(
|
| + "supports_quic", &supports_quic_dict)) {
|
| + continue;
|
| + }
|
| + do {
|
| + bool used_quic = 0;
|
| + if (!supports_quic_dict->GetBooleanWithoutPathExpansion(
|
| + "used_quic", &used_quic)) {
|
| + DVLOG(1) << "Malformed SupportsQuic server: " << server_str;
|
| + detected_corrupted_prefs = true;
|
| + continue;
|
| + }
|
| + std::string address;
|
| + if (!supports_quic_dict->GetStringWithoutPathExpansion(
|
| + "address", &address)) {
|
| + DVLOG(1) << "Malformed SupportsQuic server: " << server_str;
|
| + detected_corrupted_prefs = true;
|
| + continue;
|
| + }
|
| + net::SupportsQuic supports_quic(used_quic, address);
|
| + supports_quic_map->insert(std::make_pair(server, supports_quic));
|
| + } while (false);
|
| }
|
|
|
| network_task_runner_->PostTask(
|
| @@ -466,6 +517,7 @@ void HttpServerPropertiesManager::UpdateCacheFromPrefsOnPrefThread() {
|
| base::Owned(spdy_settings_map.release()),
|
| base::Owned(alternate_protocol_map.release()),
|
| alternate_protocol_experiment,
|
| + base::Owned(supports_quic_map.release()),
|
| detected_corrupted_prefs));
|
| }
|
|
|
| @@ -474,6 +526,7 @@ void HttpServerPropertiesManager::UpdateCacheFromPrefsOnNetworkThread(
|
| net::SpdySettingsMap* spdy_settings_map,
|
| net::AlternateProtocolMap* alternate_protocol_map,
|
| net::AlternateProtocolExperiment alternate_protocol_experiment,
|
| + net::SupportsQuicMap* supports_quic_map,
|
| bool detected_corrupted_prefs) {
|
| // Preferences have the master data because admins might have pushed new
|
| // preferences. Update the cached data with new data from preferences.
|
| @@ -496,6 +549,8 @@ void HttpServerPropertiesManager::UpdateCacheFromPrefsOnNetworkThread(
|
| http_server_properties_impl_->SetAlternateProtocolExperiment(
|
| alternate_protocol_experiment);
|
|
|
| + http_server_properties_impl_->InitializeSupportsQuic(supports_quic_map);
|
| +
|
| // Update the prefs with what we have read (delete all corrupted prefs).
|
| if (detected_corrupted_prefs)
|
| ScheduleUpdatePrefsOnNetworkThread();
|
| @@ -569,6 +624,14 @@ void HttpServerPropertiesManager::UpdatePrefsFromCacheOnNetworkThread(
|
| ++count;
|
| }
|
|
|
| + net::SupportsQuicMap* supports_quic_map = new net::SupportsQuicMap();
|
| + const net::SupportsQuicMap& main_supports_quic_map =
|
| + http_server_properties_impl_->supports_quic_map();
|
| + for (net::SupportsQuicMap::const_iterator it = main_supports_quic_map.begin();
|
| + it != main_supports_quic_map.end(); ++it) {
|
| + supports_quic_map->insert(std::make_pair(it->first, it->second));
|
| + }
|
| +
|
| // Update the preferences on the pref thread.
|
| pref_task_runner_->PostTask(
|
| FROM_HERE,
|
| @@ -577,30 +640,37 @@ void HttpServerPropertiesManager::UpdatePrefsFromCacheOnNetworkThread(
|
| base::Owned(spdy_server_list),
|
| base::Owned(spdy_settings_map),
|
| base::Owned(alternate_protocol_map),
|
| + base::Owned(supports_quic_map),
|
| completion));
|
| }
|
|
|
| // A local or temporary data structure to hold |supports_spdy|, SpdySettings,
|
| -// and AlternateProtocolInfo preferences for a server. This is used only in
|
| -// UpdatePrefsOnPrefThread.
|
| +// AlternateProtocolInfo and SupportsQuic preferences for a server. This is used
|
| +// only in UpdatePrefsOnPrefThread.
|
| struct ServerPref {
|
| - ServerPref()
|
| - : supports_spdy(false), settings_map(NULL), alternate_protocol(NULL) {}
|
| + ServerPref() : supports_spdy(false),
|
| + settings_map(NULL),
|
| + alternate_protocol(NULL),
|
| + supports_quic(NULL) {}
|
| ServerPref(bool supports_spdy,
|
| const net::SettingsMap* settings_map,
|
| - const net::AlternateProtocolInfo* alternate_protocol)
|
| + const net::AlternateProtocolInfo* alternate_protocol,
|
| + const net::SupportsQuic* supports_quic)
|
| : supports_spdy(supports_spdy),
|
| settings_map(settings_map),
|
| - alternate_protocol(alternate_protocol) {}
|
| + alternate_protocol(alternate_protocol),
|
| + supports_quic(supports_quic) {}
|
| bool supports_spdy;
|
| const net::SettingsMap* settings_map;
|
| const net::AlternateProtocolInfo* alternate_protocol;
|
| + const net::SupportsQuic* supports_quic;
|
| };
|
|
|
| void HttpServerPropertiesManager::UpdatePrefsOnPrefThread(
|
| base::ListValue* spdy_server_list,
|
| net::SpdySettingsMap* spdy_settings_map,
|
| net::AlternateProtocolMap* alternate_protocol_map,
|
| + net::SupportsQuicMap* supports_quic_map,
|
| const base::Closure& completion) {
|
| typedef std::map<net::HostPortPair, ServerPref> ServerPrefMap;
|
| ServerPrefMap server_pref_map;
|
| @@ -617,7 +687,7 @@ void HttpServerPropertiesManager::UpdatePrefsOnPrefThread(
|
|
|
| ServerPrefMap::iterator it = server_pref_map.find(server);
|
| if (it == server_pref_map.end()) {
|
| - ServerPref server_pref(true, NULL, NULL);
|
| + ServerPref server_pref(true, NULL, NULL, NULL);
|
| server_pref_map[server] = server_pref;
|
| } else {
|
| it->second.supports_spdy = true;
|
| @@ -633,7 +703,7 @@ void HttpServerPropertiesManager::UpdatePrefsOnPrefThread(
|
|
|
| ServerPrefMap::iterator it = server_pref_map.find(server);
|
| if (it == server_pref_map.end()) {
|
| - ServerPref server_pref(false, &map_it->second, NULL);
|
| + ServerPref server_pref(false, &map_it->second, NULL, NULL);
|
| server_pref_map[server] = server_pref;
|
| } else {
|
| it->second.settings_map = &map_it->second;
|
| @@ -654,13 +724,27 @@ void HttpServerPropertiesManager::UpdatePrefsOnPrefThread(
|
|
|
| ServerPrefMap::iterator it = server_pref_map.find(server);
|
| if (it == server_pref_map.end()) {
|
| - ServerPref server_pref(false, NULL, &map_it->second);
|
| + ServerPref server_pref(false, NULL, &map_it->second, NULL);
|
| server_pref_map[server] = server_pref;
|
| } else {
|
| it->second.alternate_protocol = &map_it->second;
|
| }
|
| }
|
|
|
| + // Add SupportsQuic servers to server_pref_map.
|
| + for (net::SupportsQuicMap::const_iterator map_it = supports_quic_map->begin();
|
| + map_it != supports_quic_map->end(); ++map_it) {
|
| + const net::HostPortPair& server = map_it->first;
|
| +
|
| + ServerPrefMap::iterator it = server_pref_map.find(server);
|
| + if (it == server_pref_map.end()) {
|
| + ServerPref server_pref(false, NULL, NULL, &map_it->second);
|
| + server_pref_map[server] = server_pref;
|
| + } else {
|
| + it->second.supports_quic = &map_it->second;
|
| + }
|
| + }
|
| +
|
| // Persist properties to the |path_|.
|
| base::DictionaryValue http_server_properties_dict;
|
| base::DictionaryValue* servers_dict = new base::DictionaryValue;
|
| @@ -708,6 +792,16 @@ void HttpServerPropertiesManager::UpdatePrefsOnPrefThread(
|
| "alternate_protocol", port_alternate_protocol_dict);
|
| }
|
|
|
| + // Save supports_quic.
|
| + if (server_pref.supports_quic) {
|
| + base::DictionaryValue* supports_quic_dict = new base::DictionaryValue;
|
| + const net::SupportsQuic* supports_quic = server_pref.supports_quic;
|
| + supports_quic_dict->SetBoolean("used_quic", supports_quic->used_quic);
|
| + supports_quic_dict->SetString("address", supports_quic->address);
|
| + server_pref_dict->SetWithoutPathExpansion(
|
| + "supports_quic", supports_quic_dict);
|
| + }
|
| +
|
| servers_dict->SetWithoutPathExpansion(server.ToString(), server_pref_dict);
|
| }
|
|
|
|
|