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 c02518d502df161ded57dda172be64f376d9f5fc..d6bfb38cce1ecbf584ea098a4c1a40fe1f8f5ec7 100644 |
--- a/net/http/http_server_properties_manager.cc |
+++ b/net/http/http_server_properties_manager.cc |
@@ -50,6 +50,20 @@ const int kMaxSupportsSpdyServerHostsToPersist = 300; |
// Persist 200 ServerNetworkStats. |
const int kMaxServerNetworkStatsHostsToPersist = 200; |
+const char kVersionKey[] = "version"; |
+const char kServersKey[] = "servers"; |
+const char kSupportsSpdyKey[] = "supports_spdy"; |
+const char kSettingsKey[] = "settings"; |
+const char kSupportsQuicKey[] = "supports_quic"; |
+const char kUsedQuicKey[] = "used_quic"; |
+const char kAddressKey[] = "address"; |
+const char kAlternateProtocolKey[] = "alternate_protocol"; |
+const char kPortKey[] = "port"; |
+const char kProtocolKey[] = "protocol_str"; |
+const char kProbabilityKey[] = "probability"; |
+const char kNetworkStatsKey[] = "network_stats"; |
+const char kSrttKey[] = "srtt"; |
+ |
} // namespace |
//////////////////////////////////////////////////////////////////////////////// |
@@ -113,7 +127,7 @@ void HttpServerPropertiesManager::SetVersion( |
version_number = kVersionNumber; |
DCHECK_LE(version_number, kVersionNumber); |
if (version_number <= kVersionNumber) |
- http_server_properties_dict->SetInteger("version", version_number); |
+ http_server_properties_dict->SetInteger(kVersionKey, version_number); |
} |
// This is required for conformance with the HttpServerProperties interface. |
@@ -166,12 +180,6 @@ void HttpServerPropertiesManager::MaybeForceHTTP11(const HostPortPair& server, |
http_server_properties_impl_->MaybeForceHTTP11(server, ssl_config); |
} |
-bool HttpServerPropertiesManager::HasAlternateProtocol( |
- const HostPortPair& server) { |
- DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); |
- return http_server_properties_impl_->HasAlternateProtocol(server); |
-} |
- |
AlternateProtocolInfo HttpServerPropertiesManager::GetAlternateProtocol( |
const HostPortPair& server) { |
DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); |
@@ -268,28 +276,20 @@ const SpdySettingsMap& HttpServerPropertiesManager::spdy_settings_map() |
return http_server_properties_impl_->spdy_settings_map(); |
} |
-SupportsQuic HttpServerPropertiesManager::GetSupportsQuic( |
- const HostPortPair& host_port_pair) const { |
+bool HttpServerPropertiesManager::GetSupportsQuic( |
+ IPAddressNumber* last_address) const { |
DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); |
- return http_server_properties_impl_->GetSupportsQuic(host_port_pair); |
+ return http_server_properties_impl_->GetSupportsQuic(last_address); |
} |
void HttpServerPropertiesManager::SetSupportsQuic( |
- const HostPortPair& host_port_pair, |
bool used_quic, |
- const std::string& address) { |
+ const IPAddressNumber& address) { |
DCHECK(network_task_runner_->RunsTasksOnCurrentThread()); |
- http_server_properties_impl_->SetSupportsQuic( |
- host_port_pair, used_quic, address); |
+ http_server_properties_impl_->SetSupportsQuic(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 HostPortPair& host_port_pair, |
ServerNetworkStats stats) { |
@@ -343,7 +343,7 @@ void HttpServerPropertiesManager::UpdateCacheFromPrefsOnPrefThread() { |
*pref_service_->GetDictionary(path_); |
int version = kMissingVersion; |
- if (!http_server_properties_dict.GetIntegerWithoutPathExpansion("version", |
+ if (!http_server_properties_dict.GetIntegerWithoutPathExpansion(kVersionKey, |
&version)) { |
DVLOG(1) << "Missing version. Clearing all properties."; |
return; |
@@ -353,18 +353,20 @@ void HttpServerPropertiesManager::UpdateCacheFromPrefsOnPrefThread() { |
// http_server_properties_dict["servers"][server]. |
const base::DictionaryValue* servers_dict = NULL; |
if (!http_server_properties_dict.GetDictionaryWithoutPathExpansion( |
- "servers", &servers_dict)) { |
+ kServersKey, &servers_dict)) { |
DVLOG(1) << "Malformed http_server_properties for servers."; |
return; |
} |
+ IPAddressNumber* addr = new IPAddressNumber; |
+ ReadSupportsQuic(http_server_properties_dict, addr); |
+ |
// String is host/port pair of spdy server. |
scoped_ptr<StringVector> spdy_servers(new StringVector); |
scoped_ptr<SpdySettingsMap> spdy_settings_map( |
new SpdySettingsMap(kMaxSpdySettingsHostsToPersist)); |
scoped_ptr<AlternateProtocolMap> alternate_protocol_map( |
new AlternateProtocolMap(kMaxAlternateProtocolHostsToPersist)); |
- scoped_ptr<SupportsQuicMap> supports_quic_map(new SupportsQuicMap()); |
scoped_ptr<ServerNetworkStatsMap> server_network_stats_map( |
new ServerNetworkStatsMap(kMaxServerNetworkStatsHostsToPersist)); |
@@ -388,123 +390,17 @@ void HttpServerPropertiesManager::UpdateCacheFromPrefsOnPrefThread() { |
// Get if server supports Spdy. |
bool supports_spdy = false; |
- if ((server_pref_dict->GetBoolean("supports_spdy", &supports_spdy)) && |
+ if ((server_pref_dict->GetBoolean(kSupportsSpdyKey, &supports_spdy)) && |
supports_spdy) { |
spdy_servers->push_back(server_str); |
} |
- // Get SpdySettings. |
- DCHECK(spdy_settings_map->Peek(server) == spdy_settings_map->end()); |
- const base::DictionaryValue* spdy_settings_dict = NULL; |
- if (server_pref_dict->GetDictionaryWithoutPathExpansion( |
- "settings", &spdy_settings_dict)) { |
- SettingsMap settings_map; |
- for (base::DictionaryValue::Iterator dict_it(*spdy_settings_dict); |
- !dict_it.IsAtEnd(); |
- dict_it.Advance()) { |
- const std::string& id_str = dict_it.key(); |
- int id = 0; |
- if (!base::StringToInt(id_str, &id)) { |
- DVLOG(1) << "Malformed id in SpdySettings for server: " << server_str; |
- NOTREACHED(); |
- continue; |
- } |
- int value = 0; |
- if (!dict_it.value().GetAsInteger(&value)) { |
- DVLOG(1) << "Malformed value in SpdySettings for server: " |
- << server_str; |
- NOTREACHED(); |
- continue; |
- } |
- SettingsFlagsAndValue flags_and_value(SETTINGS_FLAG_PERSISTED, value); |
- settings_map[static_cast<SpdySettingsIds>(id)] = flags_and_value; |
- } |
- spdy_settings_map->Put(server, settings_map); |
- } |
- |
- // Get alternate_protocol server. |
- DCHECK(alternate_protocol_map->Peek(server) == |
- alternate_protocol_map->end()); |
- const base::DictionaryValue* port_alternate_protocol_dict = NULL; |
- if (server_pref_dict->GetDictionaryWithoutPathExpansion( |
- "alternate_protocol", &port_alternate_protocol_dict)) { |
- int port = 0; |
- if (!port_alternate_protocol_dict->GetIntegerWithoutPathExpansion( |
- "port", &port) || |
- !IsPortValid(port)) { |
- DVLOG(1) << "Malformed Alternate-Protocol server: " << server_str; |
- detected_corrupted_prefs = true; |
- continue; |
- } |
- std::string protocol_str; |
- if (!port_alternate_protocol_dict->GetStringWithoutPathExpansion( |
- "protocol_str", &protocol_str)) { |
- DVLOG(1) << "Malformed Alternate-Protocol server: " << server_str; |
- detected_corrupted_prefs = true; |
- continue; |
- } |
- AlternateProtocol protocol = AlternateProtocolFromString(protocol_str); |
- if (!IsAlternateProtocolValid(protocol)) { |
- DVLOG(1) << "Malformed Alternate-Protocol server: " << server_str; |
- detected_corrupted_prefs = true; |
- continue; |
- } |
- |
- double probability = 1; |
- if (port_alternate_protocol_dict->HasKey("probability") && |
- !port_alternate_protocol_dict->GetDoubleWithoutPathExpansion( |
- "probability", &probability)) { |
- DVLOG(1) << "Malformed Alternate-Protocol server: " << server_str; |
- detected_corrupted_prefs = true; |
- continue; |
- } |
- |
- AlternateProtocolInfo port_alternate_protocol(static_cast<uint16>(port), |
- protocol, probability); |
- alternate_protocol_map->Put(server, port_alternate_protocol); |
- } |
- |
- // 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)) { |
- 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; |
- } |
- SupportsQuic supports_quic(used_quic, address); |
- supports_quic_map->insert(std::make_pair(server, supports_quic)); |
- } |
- |
- // Get ServerNetworkStats. |
- DCHECK(server_network_stats_map->Peek(server) == |
- server_network_stats_map->end()); |
- const base::DictionaryValue* server_network_stats_dict = NULL; |
- if (server_pref_dict->GetDictionaryWithoutPathExpansion( |
- "network_stats", &server_network_stats_dict)) { |
- int srtt; |
- if (!server_network_stats_dict->GetIntegerWithoutPathExpansion("srtt", |
- &srtt)) { |
- DVLOG(1) << "Malformed ServerNetworkStats for server: " << server_str; |
- detected_corrupted_prefs = true; |
- continue; |
- } |
- ServerNetworkStats server_network_stats; |
- server_network_stats.srtt = base::TimeDelta::FromInternalValue(srtt); |
- // TODO(rtenneti): When QUIC starts using bandwidth_estimate, then persist |
- // bandwidth_estimate. |
- server_network_stats_map->Put(server, server_network_stats); |
+ AddToSpdySettingsMap(server, *server_pref_dict, spdy_settings_map.get()); |
+ if (!AddToAlternateProtocolMap(server, *server_pref_dict, |
+ alternate_protocol_map.get()) || |
+ !AddToNetworkStatsMap(server, *server_pref_dict, |
+ server_network_stats_map.get())) { |
+ detected_corrupted_prefs = true; |
} |
} |
@@ -514,17 +410,159 @@ void HttpServerPropertiesManager::UpdateCacheFromPrefsOnPrefThread() { |
&HttpServerPropertiesManager::UpdateCacheFromPrefsOnNetworkThread, |
base::Unretained(this), base::Owned(spdy_servers.release()), |
base::Owned(spdy_settings_map.release()), |
- base::Owned(alternate_protocol_map.release()), |
- base::Owned(supports_quic_map.release()), |
+ base::Owned(alternate_protocol_map.release()), base::Owned(addr), |
base::Owned(server_network_stats_map.release()), |
detected_corrupted_prefs)); |
} |
+void HttpServerPropertiesManager::AddToSpdySettingsMap( |
+ const HostPortPair& server, |
+ const base::DictionaryValue& server_pref_dict, |
+ SpdySettingsMap* spdy_settings_map) { |
+ // Get SpdySettings. |
+ DCHECK(spdy_settings_map->Peek(server) == spdy_settings_map->end()); |
+ const base::DictionaryValue* spdy_settings_dict = NULL; |
+ if (!server_pref_dict.GetDictionaryWithoutPathExpansion( |
+ kSettingsKey, &spdy_settings_dict)) { |
+ return; |
+ } |
+ SettingsMap settings_map; |
+ for (base::DictionaryValue::Iterator dict_it(*spdy_settings_dict); |
+ !dict_it.IsAtEnd(); dict_it.Advance()) { |
+ const std::string& id_str = dict_it.key(); |
+ int id = 0; |
+ if (!base::StringToInt(id_str, &id)) { |
+ DVLOG(1) << "Malformed id in SpdySettings for server: " |
+ << server.ToString(); |
+ NOTREACHED(); |
+ continue; |
+ } |
+ int value = 0; |
+ if (!dict_it.value().GetAsInteger(&value)) { |
+ DVLOG(1) << "Malformed value in SpdySettings for server: " |
+ << server.ToString(); |
+ NOTREACHED(); |
+ continue; |
+ } |
+ SettingsFlagsAndValue flags_and_value(SETTINGS_FLAG_PERSISTED, value); |
+ settings_map[static_cast<SpdySettingsIds>(id)] = flags_and_value; |
+ } |
+ spdy_settings_map->Put(server, settings_map); |
+} |
+ |
+AlternateProtocolInfo HttpServerPropertiesManager::ParseAlternateProtocolDict( |
+ const base::DictionaryValue& alternate_protocol_dict, |
+ const std::string& server_str) { |
+ AlternateProtocolInfo alternate_protocol; |
+ int port = 0; |
+ if (!alternate_protocol_dict.GetInteger(kPortKey, &port) || |
+ !IsPortValid(port)) { |
+ DVLOG(1) << "Malformed AltSvc port for server: " << server_str; |
+ return alternate_protocol; |
+ } |
+ alternate_protocol.port = static_cast<uint16>(port); |
+ |
+ double probability = 1.0; |
+ if (alternate_protocol_dict.HasKey(kProbabilityKey) && |
+ !alternate_protocol_dict.GetDoubleWithoutPathExpansion(kProbabilityKey, |
+ &probability)) { |
+ DVLOG(1) << "Malformed AltSvc probability for server: " << server_str; |
+ return alternate_protocol; |
+ } |
+ alternate_protocol.probability = probability; |
+ |
+ std::string protocol_str; |
+ if (!alternate_protocol_dict.GetStringWithoutPathExpansion(kProtocolKey, |
+ &protocol_str)) { |
+ DVLOG(1) << "Malformed AltSvc protocol string for server: " << server_str; |
+ return alternate_protocol; |
+ } |
+ AlternateProtocol protocol = AlternateProtocolFromString(protocol_str); |
+ if (!IsAlternateProtocolValid(protocol)) { |
+ DVLOG(1) << "Invalid AltSvc protocol string for server: " << server_str; |
+ return alternate_protocol; |
+ } |
+ alternate_protocol.protocol = protocol; |
+ |
+ return alternate_protocol; |
+} |
+ |
+bool HttpServerPropertiesManager::AddToAlternateProtocolMap( |
+ const HostPortPair& server, |
+ const base::DictionaryValue& server_pref_dict, |
+ AlternateProtocolMap* alternate_protocol_map) { |
+ // Get alternate_protocol server. |
+ DCHECK(alternate_protocol_map->Peek(server) == alternate_protocol_map->end()); |
+ const base::DictionaryValue* alternate_protocol_dict = NULL; |
+ if (!server_pref_dict.GetDictionaryWithoutPathExpansion( |
+ kAlternateProtocolKey, &alternate_protocol_dict)) { |
+ return true; |
+ } |
+ AlternateProtocolInfo alternate_protocol = |
+ ParseAlternateProtocolDict(*alternate_protocol_dict, server.ToString()); |
+ if (alternate_protocol.protocol == UNINITIALIZED_ALTERNATE_PROTOCOL) |
+ return false; |
+ alternate_protocol_map->Put(server, alternate_protocol); |
+ return true; |
+} |
+ |
+bool HttpServerPropertiesManager::ReadSupportsQuic( |
+ const base::DictionaryValue& http_server_properties_dict, |
+ IPAddressNumber* last_quic_address) { |
+ const base::DictionaryValue* supports_quic_dict = NULL; |
+ if (!http_server_properties_dict.GetDictionaryWithoutPathExpansion( |
+ kSupportsQuicKey, &supports_quic_dict)) { |
+ return true; |
+ } |
+ bool used_quic = false; |
+ if (!supports_quic_dict->GetBooleanWithoutPathExpansion(kUsedQuicKey, |
+ &used_quic)) { |
+ DVLOG(1) << "Malformed SupportsQuic"; |
+ return false; |
+ } |
+ if (!used_quic) |
+ return false; |
+ |
+ std::string address; |
+ if (!supports_quic_dict->GetStringWithoutPathExpansion(kAddressKey, |
+ &address) || |
+ !ParseIPLiteralToNumber(address, last_quic_address)) { |
+ DVLOG(1) << "Malformed SupportsQuic"; |
+ return false; |
+ } |
+ return true; |
+} |
+ |
+bool HttpServerPropertiesManager::AddToNetworkStatsMap( |
+ const HostPortPair& server, |
+ const base::DictionaryValue& server_pref_dict, |
+ ServerNetworkStatsMap* network_stats_map) { |
+ DCHECK(network_stats_map->Peek(server) == network_stats_map->end()); |
+ const base::DictionaryValue* server_network_stats_dict = NULL; |
+ if (!server_pref_dict.GetDictionaryWithoutPathExpansion( |
+ kNetworkStatsKey, &server_network_stats_dict)) { |
+ return true; |
+ } |
+ int srtt; |
+ if (!server_network_stats_dict->GetIntegerWithoutPathExpansion(kSrttKey, |
+ &srtt)) { |
+ DVLOG(1) << "Malformed ServerNetworkStats for server: " |
+ << server.ToString(); |
+ return false; |
+ } |
+ ServerNetworkStats server_network_stats; |
+ server_network_stats.srtt = base::TimeDelta::FromInternalValue(srtt); |
+ // TODO(rtenneti): When QUIC starts using bandwidth_estimate, then persist |
+ // bandwidth_estimate. |
+ network_stats_map->Put(server, server_network_stats); |
+ return true; |
+} |
+ |
void HttpServerPropertiesManager::UpdateCacheFromPrefsOnNetworkThread( |
StringVector* spdy_servers, |
SpdySettingsMap* spdy_settings_map, |
AlternateProtocolMap* alternate_protocol_map, |
- SupportsQuicMap* supports_quic_map, |
+ IPAddressNumber* last_quic_address, |
ServerNetworkStatsMap* server_network_stats_map, |
bool detected_corrupted_prefs) { |
// Preferences have the master data because admins might have pushed new |
@@ -546,7 +584,7 @@ void HttpServerPropertiesManager::UpdateCacheFromPrefsOnNetworkThread( |
http_server_properties_impl_->InitializeAlternateProtocolServers( |
alternate_protocol_map); |
- http_server_properties_impl_->InitializeSupportsQuic(supports_quic_map); |
+ http_server_properties_impl_->InitializeSupportsQuic(last_quic_address); |
http_server_properties_impl_->InitializeServerNetworkStats( |
server_network_stats_map); |
@@ -623,14 +661,6 @@ void HttpServerPropertiesManager::UpdatePrefsFromCacheOnNetworkThread( |
++count; |
} |
- SupportsQuicMap* supports_quic_map = new SupportsQuicMap(); |
- const SupportsQuicMap& main_supports_quic_map = |
- http_server_properties_impl_->supports_quic_map(); |
- for (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)); |
- } |
- |
ServerNetworkStatsMap* server_network_stats_map = |
new ServerNetworkStatsMap(kMaxServerNetworkStatsHostsToPersist); |
const ServerNetworkStatsMap& main_server_network_stats_map = |
@@ -641,13 +671,15 @@ void HttpServerPropertiesManager::UpdatePrefsFromCacheOnNetworkThread( |
server_network_stats_map->Put(it->first, it->second); |
} |
+ IPAddressNumber* last_quic_addr = new IPAddressNumber; |
+ http_server_properties_impl_->GetSupportsQuic(last_quic_addr); |
// Update the preferences on the pref thread. |
pref_task_runner_->PostTask( |
FROM_HERE, |
base::Bind( |
&HttpServerPropertiesManager::UpdatePrefsOnPrefThread, pref_weak_ptr_, |
base::Owned(spdy_server_list), base::Owned(spdy_settings_map), |
- base::Owned(alternate_protocol_map), base::Owned(supports_quic_map), |
+ base::Owned(alternate_protocol_map), base::Owned(last_quic_addr), |
base::Owned(server_network_stats_map), completion)); |
} |
@@ -682,7 +714,7 @@ void HttpServerPropertiesManager::UpdatePrefsOnPrefThread( |
base::ListValue* spdy_server_list, |
SpdySettingsMap* spdy_settings_map, |
AlternateProtocolMap* alternate_protocol_map, |
- SupportsQuicMap* supports_quic_map, |
+ IPAddressNumber* last_quic_address, |
ServerNetworkStatsMap* server_network_stats_map, |
const base::Closure& completion) { |
typedef std::map<HostPortPair, ServerPref> ServerPrefMap; |
@@ -697,14 +729,7 @@ void HttpServerPropertiesManager::UpdatePrefsOnPrefThread( |
++list_it) { |
if ((*list_it)->GetAsString(&s)) { |
HostPortPair server = HostPortPair::FromString(s); |
- |
- ServerPrefMap::iterator it = server_pref_map.find(server); |
- if (it == server_pref_map.end()) { |
- ServerPref server_pref(true, NULL, NULL, NULL, NULL); |
- server_pref_map[server] = server_pref; |
- } else { |
- it->second.supports_spdy = true; |
- } |
+ server_pref_map[server].supports_spdy = true; |
} |
} |
@@ -712,14 +737,7 @@ void HttpServerPropertiesManager::UpdatePrefsOnPrefThread( |
for (SpdySettingsMap::iterator map_it = spdy_settings_map->begin(); |
map_it != spdy_settings_map->end(); ++map_it) { |
const HostPortPair& server = map_it->first; |
- |
- ServerPrefMap::iterator it = server_pref_map.find(server); |
- if (it == server_pref_map.end()) { |
- ServerPref server_pref(false, &map_it->second, NULL, NULL, NULL); |
- server_pref_map[server] = server_pref; |
- } else { |
- it->second.settings_map = &map_it->second; |
- } |
+ server_pref_map[server].settings_map = &map_it->second; |
} |
// Add AlternateProtocol servers to server_pref_map. |
@@ -731,28 +749,7 @@ void HttpServerPropertiesManager::UpdatePrefsOnPrefThread( |
if (!IsAlternateProtocolValid(port_alternate_protocol.protocol)) { |
continue; |
} |
- |
- ServerPrefMap::iterator it = server_pref_map.find(server); |
- if (it == server_pref_map.end()) { |
- ServerPref server_pref(false, NULL, &map_it->second, NULL, NULL); |
- server_pref_map[server] = server_pref; |
- } else { |
- it->second.alternate_protocol = &map_it->second; |
- } |
- } |
- |
- // Add SupportsQuic servers to server_pref_map. |
- for (SupportsQuicMap::const_iterator map_it = supports_quic_map->begin(); |
- map_it != supports_quic_map->end(); ++map_it) { |
- const 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, NULL); |
- server_pref_map[server] = server_pref; |
- } else { |
- it->second.supports_quic = &map_it->second; |
- } |
+ server_pref_map[server].alternate_protocol = &map_it->second; |
} |
// Add ServerNetworkStats servers to server_pref_map. |
@@ -760,14 +757,7 @@ void HttpServerPropertiesManager::UpdatePrefsOnPrefThread( |
server_network_stats_map->begin(); |
map_it != server_network_stats_map->end(); ++map_it) { |
const 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, NULL, &map_it->second); |
- server_pref_map[server] = server_pref; |
- } else { |
- it->second.server_network_stats = &map_it->second; |
- } |
+ server_pref_map[server].server_network_stats = &map_it->second; |
} |
// Persist properties to the |path_|. |
@@ -783,69 +773,22 @@ void HttpServerPropertiesManager::UpdatePrefsOnPrefThread( |
// Save supports_spdy. |
if (server_pref.supports_spdy) |
- server_pref_dict->SetBoolean("supports_spdy", server_pref.supports_spdy); |
- |
- // Save SPDY settings. |
- if (server_pref.settings_map) { |
- base::DictionaryValue* spdy_settings_dict = new base::DictionaryValue; |
- for (SettingsMap::const_iterator it = server_pref.settings_map->begin(); |
- it != server_pref.settings_map->end(); ++it) { |
- SpdySettingsIds id = it->first; |
- uint32 value = it->second.second; |
- std::string key = base::StringPrintf("%u", id); |
- spdy_settings_dict->SetInteger(key, value); |
- } |
- server_pref_dict->SetWithoutPathExpansion("settings", spdy_settings_dict); |
- } |
- |
- // Save alternate_protocol. |
- const AlternateProtocolInfo* port_alternate_protocol = |
- server_pref.alternate_protocol; |
- if (port_alternate_protocol && !port_alternate_protocol->is_broken) { |
- base::DictionaryValue* port_alternate_protocol_dict = |
- new base::DictionaryValue; |
- port_alternate_protocol_dict->SetInteger("port", |
- port_alternate_protocol->port); |
- const char* protocol_str = |
- AlternateProtocolToString(port_alternate_protocol->protocol); |
- port_alternate_protocol_dict->SetString("protocol_str", protocol_str); |
- port_alternate_protocol_dict->SetDouble( |
- "probability", port_alternate_protocol->probability); |
- server_pref_dict->SetWithoutPathExpansion( |
- "alternate_protocol", port_alternate_protocol_dict); |
- } |
- |
- // Save supports_quic. |
- if (server_pref.supports_quic) { |
- base::DictionaryValue* supports_quic_dict = new base::DictionaryValue; |
- const 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); |
- } |
- |
- // Save ServerNetworkStats. |
- if (server_pref.server_network_stats) { |
- base::DictionaryValue* server_network_stats_dict = |
- new base::DictionaryValue; |
- const ServerNetworkStats* server_network_stats = |
- server_pref.server_network_stats; |
- // Becasue JSON doesn't support int64, persist int64 as a string. |
- server_network_stats_dict->SetInteger( |
- "srtt", |
- static_cast<int>(server_network_stats->srtt.ToInternalValue())); |
- // TODO(rtenneti): When QUIC starts using bandwidth_estimate, then persist |
- // bandwidth_estimate. |
- server_pref_dict->SetWithoutPathExpansion("network_stats", |
- server_network_stats_dict); |
- } |
+ server_pref_dict->SetBoolean(kSupportsSpdyKey, server_pref.supports_spdy); |
+ SaveSpdySettingsToServerPrefs(server_pref.settings_map, server_pref_dict); |
+ SaveAlternateProtocolToServerPrefs(server_pref.alternate_protocol, |
+ server_pref_dict); |
+ SaveNetworkStatsToServerPrefs(server_pref.server_network_stats, |
+ server_pref_dict); |
servers_dict->SetWithoutPathExpansion(server.ToString(), server_pref_dict); |
} |
- http_server_properties_dict.SetWithoutPathExpansion("servers", servers_dict); |
+ http_server_properties_dict.SetWithoutPathExpansion(kServersKey, |
+ servers_dict); |
SetVersion(&http_server_properties_dict, kVersionNumber); |
+ |
+ SaveSupportsQuicToPrefs(last_quic_address, &http_server_properties_dict); |
+ |
setting_prefs_ = true; |
pref_service_->Set(path_, http_server_properties_dict); |
setting_prefs_ = false; |
@@ -858,6 +801,72 @@ void HttpServerPropertiesManager::UpdatePrefsOnPrefThread( |
completion.Run(); |
} |
+void HttpServerPropertiesManager::SaveSpdySettingsToServerPrefs( |
+ const SettingsMap* settings_map, |
+ base::DictionaryValue* server_pref_dict) { |
+ if (!settings_map) { |
+ return; |
+ } |
+ base::DictionaryValue* spdy_settings_dict = new base::DictionaryValue; |
+ for (SettingsMap::const_iterator it = settings_map->begin(); |
+ it != settings_map->end(); ++it) { |
+ SpdySettingsIds id = it->first; |
+ uint32 value = it->second.second; |
+ std::string key = base::StringPrintf("%u", id); |
+ spdy_settings_dict->SetInteger(key, value); |
+ } |
+ server_pref_dict->SetWithoutPathExpansion(kSettingsKey, spdy_settings_dict); |
+} |
+ |
+void HttpServerPropertiesManager::SaveAlternateProtocolToServerPrefs( |
+ const AlternateProtocolInfo* port_alternate_protocol, |
+ base::DictionaryValue* server_pref_dict) { |
+ if (!port_alternate_protocol || port_alternate_protocol->is_broken) |
+ return; |
+ |
+ base::DictionaryValue* port_alternate_protocol_dict = |
+ new base::DictionaryValue; |
+ port_alternate_protocol_dict->SetInteger(kPortKey, |
+ port_alternate_protocol->port); |
+ const char* protocol_str = |
+ AlternateProtocolToString(port_alternate_protocol->protocol); |
+ port_alternate_protocol_dict->SetString(kProtocolKey, protocol_str); |
+ port_alternate_protocol_dict->SetDouble(kProbabilityKey, |
+ port_alternate_protocol->probability); |
+ server_pref_dict->SetWithoutPathExpansion(kAlternateProtocolKey, |
+ port_alternate_protocol_dict); |
+} |
+ |
+void HttpServerPropertiesManager::SaveSupportsQuicToPrefs( |
+ const IPAddressNumber* last_quic_address, |
+ base::DictionaryValue* http_server_properties_dict) { |
+ if (!last_quic_address || last_quic_address->empty()) |
+ return; |
+ |
+ base::DictionaryValue* supports_quic_dict = new base::DictionaryValue; |
+ supports_quic_dict->SetBoolean(kUsedQuicKey, true); |
+ supports_quic_dict->SetString(kAddressKey, |
+ IPAddressToString(*last_quic_address)); |
+ http_server_properties_dict->SetWithoutPathExpansion(kSupportsQuicKey, |
+ supports_quic_dict); |
+} |
+ |
+void HttpServerPropertiesManager::SaveNetworkStatsToServerPrefs( |
+ const ServerNetworkStats* server_network_stats, |
+ base::DictionaryValue* server_pref_dict) { |
+ if (!server_network_stats) |
+ return; |
+ |
+ base::DictionaryValue* server_network_stats_dict = new base::DictionaryValue; |
+ // Becasue JSON doesn't support int64, persist int64 as a string. |
+ server_network_stats_dict->SetInteger( |
+ kSrttKey, static_cast<int>(server_network_stats->srtt.ToInternalValue())); |
+ // TODO(rtenneti): When QUIC starts using bandwidth_estimate, then persist |
+ // bandwidth_estimate. |
+ server_pref_dict->SetWithoutPathExpansion(kNetworkStatsKey, |
+ server_network_stats_dict); |
+} |
+ |
void HttpServerPropertiesManager::OnHttpServerPropertiesChanged() { |
DCHECK(pref_task_runner_->RunsTasksOnCurrentThread()); |
if (!setting_prefs_) |