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 96b18f3a36459be2a8acaa3d929bf88e4efd6597..d348d199a43fc746ec5a1f5f2c745078f03ce6a5 100644 |
--- a/net/http/http_server_properties_manager.cc |
+++ b/net/http/http_server_properties_manager.cc |
@@ -489,11 +489,12 @@ void HttpServerPropertiesManager::UpdateCacheFromPrefsOnPrefSequence() { |
} |
} |
- IPAddress* addr = new IPAddress; |
- ReadSupportsQuic(http_server_properties_dict, addr); |
+ std::unique_ptr<IPAddress> addr = base::MakeUnique<IPAddress>(); |
+ ReadSupportsQuic(http_server_properties_dict, addr.get()); |
// String is "scheme://host:port" tuple of spdy server. |
- std::unique_ptr<ServerList> spdy_servers(new ServerList); |
+ std::unique_ptr<SpdyServersMap> spdy_servers_map( |
+ new SpdyServersMap(SpdyServersMap::NO_AUTO_EVICT)); |
std::unique_ptr<AlternativeServiceMap> alternative_service_map( |
new AlternativeServiceMap(kMaxAlternateProtocolHostsToPersist)); |
std::unique_ptr<ServerNetworkStatsMap> server_network_stats_map( |
@@ -502,20 +503,24 @@ void HttpServerPropertiesManager::UpdateCacheFromPrefsOnPrefSequence() { |
new QuicServerInfoMap(QuicServerInfoMap::NO_AUTO_EVICT)); |
if (version < 4) { |
- if (!AddServersData(*servers_dict, spdy_servers.get(), |
+ if (!AddServersData(*servers_dict, spdy_servers_map.get(), |
alternative_service_map.get(), |
server_network_stats_map.get(), version)) { |
detected_corrupted_prefs = true; |
} |
} else { |
- for (base::ListValue::const_iterator it = servers_list->begin(); |
- it != servers_list->end(); ++it) { |
+ // Iterate servers list in reverse MRU order so that entries are inserted |
+ // into |spdy_servers_map|, |alternative_service_map|, and |
+ // |server_network_stats_map| from oldest to newest. |
+ for (base::ListValue::const_iterator it = servers_list->end(); |
+ it != servers_list->begin();) { |
+ --it; |
if (!it->GetAsDictionary(&servers_dict)) { |
DVLOG(1) << "Malformed http_server_properties for servers dictionary."; |
detected_corrupted_prefs = true; |
continue; |
} |
- if (!AddServersData(*servers_dict, spdy_servers.get(), |
+ if (!AddServersData(*servers_dict, spdy_servers_map.get(), |
alternative_service_map.get(), |
server_network_stats_map.get(), version)) { |
detected_corrupted_prefs = true; |
@@ -532,16 +537,15 @@ void HttpServerPropertiesManager::UpdateCacheFromPrefsOnPrefSequence() { |
FROM_HERE, |
base::Bind( |
&HttpServerPropertiesManager::UpdateCacheFromPrefsOnNetworkSequence, |
- base::Unretained(this), base::Owned(spdy_servers.release()), |
- base::Owned(alternative_service_map.release()), base::Owned(addr), |
- base::Owned(server_network_stats_map.release()), |
- base::Owned(quic_server_info_map.release()), |
- detected_corrupted_prefs)); |
+ base::Unretained(this), base::Passed(&spdy_servers_map), |
+ base::Passed(&alternative_service_map), base::Passed(&addr), |
+ base::Passed(&server_network_stats_map), |
+ base::Passed(&quic_server_info_map), detected_corrupted_prefs)); |
} |
bool HttpServerPropertiesManager::AddServersData( |
const base::DictionaryValue& servers_dict, |
- ServerList* spdy_servers, |
+ SpdyServersMap* spdy_servers_map, |
AlternativeServiceMap* alternative_service_map, |
ServerNetworkStatsMap* network_stats_map, |
int version) { |
@@ -568,9 +572,9 @@ bool HttpServerPropertiesManager::AddServersData( |
// Get if server supports Spdy. |
bool supports_spdy = false; |
- if ((server_pref_dict->GetBoolean(kSupportsSpdyKey, &supports_spdy)) && |
+ if (server_pref_dict->GetBoolean(kSupportsSpdyKey, &supports_spdy) && |
supports_spdy) { |
- spdy_servers->push_back(spdy_server.Serialize()); |
+ spdy_servers_map->Put(spdy_server.Serialize(), supports_spdy); |
} |
if (!AddToAlternativeServiceMap(spdy_server, *server_pref_dict, |
@@ -789,34 +793,36 @@ bool HttpServerPropertiesManager::AddToQuicServerInfoMap( |
} |
void HttpServerPropertiesManager::UpdateCacheFromPrefsOnNetworkSequence( |
- ServerList* spdy_servers, |
- AlternativeServiceMap* alternative_service_map, |
- IPAddress* last_quic_address, |
- ServerNetworkStatsMap* server_network_stats_map, |
- QuicServerInfoMap* quic_server_info_map, |
+ std::unique_ptr<SpdyServersMap> spdy_servers_map, |
+ std::unique_ptr<AlternativeServiceMap> alternative_service_map, |
+ std::unique_ptr<IPAddress> last_quic_address, |
+ std::unique_ptr<ServerNetworkStatsMap> server_network_stats_map, |
+ std::unique_ptr<QuicServerInfoMap> quic_server_info_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. |
DCHECK(network_task_runner_->RunsTasksInCurrentSequence()); |
- UMA_HISTOGRAM_COUNTS("Net.CountOfSpdyServers", spdy_servers->size()); |
- http_server_properties_impl_->SetSpdyServers(spdy_servers, true); |
+ UMA_HISTOGRAM_COUNTS("Net.CountOfSpdyServers", spdy_servers_map->size()); |
+ http_server_properties_impl_->SetSpdyServers(std::move(spdy_servers_map)); |
// Update the cached data and use the new alternative service list from |
// preferences. |
UMA_HISTOGRAM_COUNTS("Net.CountOfAlternateProtocolServers", |
alternative_service_map->size()); |
http_server_properties_impl_->SetAlternativeServiceServers( |
- alternative_service_map); |
+ std::move(alternative_service_map)); |
- http_server_properties_impl_->SetSupportsQuic(last_quic_address); |
+ http_server_properties_impl_->SetSupportsQuic(*last_quic_address); |
- http_server_properties_impl_->SetServerNetworkStats(server_network_stats_map); |
+ http_server_properties_impl_->SetServerNetworkStats( |
+ std::move(server_network_stats_map)); |
UMA_HISTOGRAM_COUNTS_1000("Net.CountOfQuicServerInfos", |
quic_server_info_map->size()); |
- http_server_properties_impl_->SetQuicServerInfoMap(quic_server_info_map); |
+ http_server_properties_impl_->SetQuicServerInfoMap( |
+ std::move(quic_server_info_map)); |
// Update the prefs with what we have read (delete all corrupted prefs). |
if (detected_corrupted_prefs) |
@@ -852,12 +858,14 @@ void HttpServerPropertiesManager::UpdatePrefsFromCacheOnNetworkSequence( |
DCHECK(network_task_runner_->RunsTasksInCurrentSequence()); |
// It is in MRU order. |
- base::ListValue* spdy_server_list = new base::ListValue; |
+ std::unique_ptr<std::vector<std::string>> spdy_servers = |
+ base::MakeUnique<std::vector<std::string>>(); |
http_server_properties_impl_->GetSpdyServerList( |
- spdy_server_list, kMaxSupportsSpdyServerHostsToPersist); |
+ spdy_servers.get(), kMaxSupportsSpdyServerHostsToPersist); |
- AlternativeServiceMap* alternative_service_map = |
- new AlternativeServiceMap(kMaxAlternateProtocolHostsToPersist); |
+ std::unique_ptr<AlternativeServiceMap> alternative_service_map = |
+ base::MakeUnique<AlternativeServiceMap>( |
+ kMaxAlternateProtocolHostsToPersist); |
const AlternativeServiceMap& map = |
http_server_properties_impl_->alternative_service_map(); |
UMA_HISTOGRAM_COUNTS("Net.CountOfAlternateProtocolServers.Memory", |
@@ -904,8 +912,9 @@ void HttpServerPropertiesManager::UpdatePrefsFromCacheOnNetworkSequence( |
++count; |
} |
- ServerNetworkStatsMap* server_network_stats_map = |
- new ServerNetworkStatsMap(kMaxServerNetworkStatsHostsToPersist); |
+ std::unique_ptr<ServerNetworkStatsMap> server_network_stats_map = |
+ base::MakeUnique<ServerNetworkStatsMap>( |
+ kMaxServerNetworkStatsHostsToPersist); |
const ServerNetworkStatsMap& network_stats_map = |
http_server_properties_impl_->server_network_stats_map(); |
count = 0; |
@@ -917,28 +926,30 @@ void HttpServerPropertiesManager::UpdatePrefsFromCacheOnNetworkSequence( |
server_network_stats_map->Put(it->first, it->second); |
} |
- QuicServerInfoMap* quic_server_info_map = nullptr; |
+ std::unique_ptr<QuicServerInfoMap> quic_server_info_map; |
const QuicServerInfoMap& main_quic_server_info_map = |
http_server_properties_impl_->quic_server_info_map(); |
if (main_quic_server_info_map.size() > 0) { |
- quic_server_info_map = |
- new QuicServerInfoMap(max_server_configs_stored_in_properties()); |
- for (const std::pair<const QuicServerId, std::string>& entry : |
- main_quic_server_info_map) { |
- quic_server_info_map->Put(entry.first, entry.second); |
+ quic_server_info_map = base::MakeUnique<QuicServerInfoMap>( |
+ max_server_configs_stored_in_properties()); |
+ for (QuicServerInfoMap::const_reverse_iterator it = |
+ main_quic_server_info_map.rbegin(); |
+ it != main_quic_server_info_map.rend(); ++it) { |
+ quic_server_info_map->Put(it->first, it->second); |
} |
} |
- IPAddress* last_quic_addr = new IPAddress; |
- http_server_properties_impl_->GetSupportsQuic(last_quic_addr); |
+ std::unique_ptr<IPAddress> last_quic_addr = base::MakeUnique<IPAddress>(); |
+ http_server_properties_impl_->GetSupportsQuic(last_quic_addr.get()); |
// 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(alternative_service_map), |
- base::Owned(last_quic_addr), base::Owned(server_network_stats_map), |
- base::Owned(quic_server_info_map), completion)); |
+ base::Bind(&HttpServerPropertiesManager::UpdatePrefsOnPrefThread, |
+ pref_weak_ptr_, base::Passed(&spdy_servers), |
+ base::Passed(&alternative_service_map), |
+ base::Passed(&last_quic_addr), |
+ base::Passed(&server_network_stats_map), |
+ base::Passed(&quic_server_info_map), completion)); |
} |
// A local or temporary data structure to hold |supports_spdy|, SpdySettings, |
@@ -971,11 +982,11 @@ struct ServerPref { |
// All maps and lists are in MRU order. |
void HttpServerPropertiesManager::UpdatePrefsOnPrefThread( |
- base::ListValue* spdy_server_list, |
- AlternativeServiceMap* alternative_service_map, |
- IPAddress* last_quic_address, |
- ServerNetworkStatsMap* server_network_stats_map, |
- QuicServerInfoMap* quic_server_info_map, |
+ std::unique_ptr<std::vector<std::string>> spdy_servers, |
+ std::unique_ptr<AlternativeServiceMap> alternative_service_map, |
+ std::unique_ptr<IPAddress> last_quic_address, |
+ std::unique_ptr<ServerNetworkStatsMap> server_network_stats_map, |
+ std::unique_ptr<QuicServerInfoMap> quic_server_info_map, |
const base::Closure& completion) { |
typedef base::MRUCache<url::SchemeHostPort, ServerPref> ServerPrefMap; |
ServerPrefMap server_pref_map(ServerPrefMap::NO_AUTO_EVICT); |
@@ -983,22 +994,21 @@ void HttpServerPropertiesManager::UpdatePrefsOnPrefThread( |
DCHECK(pref_task_runner_->RunsTasksInCurrentSequence()); |
// Add servers that support spdy to server_pref_map in the MRU order. |
- for (size_t index = spdy_server_list->GetSize(); index > 0; --index) { |
- std::string server_str; |
- if (spdy_server_list->GetString(index - 1, &server_str)) { |
- url::SchemeHostPort server((GURL(server_str))); |
- ServerPrefMap::iterator it = server_pref_map.Get(server); |
- if (it == server_pref_map.end()) { |
- ServerPref server_pref; |
- server_pref.supports_spdy = true; |
- server_pref_map.Put(server, server_pref); |
- } else { |
- it->second.supports_spdy = true; |
- } |
+ DCHECK(spdy_servers); |
+ for (size_t i = spdy_servers->size(); i > 0; --i) { |
+ url::SchemeHostPort server((GURL(spdy_servers->at(i - 1)))); |
+ ServerPrefMap::iterator it = server_pref_map.Get(server); |
+ if (it == server_pref_map.end()) { |
+ ServerPref server_pref; |
+ server_pref.supports_spdy = true; |
+ server_pref_map.Put(server, server_pref); |
+ } else { |
+ it->second.supports_spdy = true; |
} |
} |
// Add alternative services to server_pref_map in the MRU order. |
+ DCHECK(alternative_service_map); |
for (AlternativeServiceMap::const_reverse_iterator map_it = |
alternative_service_map->rbegin(); |
map_it != alternative_service_map->rend(); ++map_it) { |
@@ -1014,6 +1024,7 @@ void HttpServerPropertiesManager::UpdatePrefsOnPrefThread( |
} |
// Add ServerNetworkStats servers to server_pref_map in the MRU order. |
+ DCHECK(server_network_stats_map); |
for (ServerNetworkStatsMap::const_reverse_iterator map_it = |
server_network_stats_map->rbegin(); |
map_it != server_network_stats_map->rend(); ++map_it) { |
@@ -1040,12 +1051,17 @@ void HttpServerPropertiesManager::UpdatePrefsOnPrefThread( |
auto server_pref_dict = base::MakeUnique<base::DictionaryValue>(); |
// Save supports_spdy. |
- if (server_pref.supports_spdy) |
+ if (server_pref.supports_spdy) { |
server_pref_dict->SetBoolean(kSupportsSpdyKey, server_pref.supports_spdy); |
- SaveAlternativeServiceToServerPrefs( |
- server_pref.alternative_service_info_vector, server_pref_dict.get()); |
- SaveNetworkStatsToServerPrefs(server_pref.server_network_stats, |
- server_pref_dict.get()); |
+ } |
+ if (server_pref.alternative_service_info_vector) { |
+ SaveAlternativeServiceToServerPrefs( |
+ *server_pref.alternative_service_info_vector, server_pref_dict.get()); |
+ } |
+ if (server_pref.server_network_stats) { |
+ SaveNetworkStatsToServerPrefs(*server_pref.server_network_stats, |
+ server_pref_dict.get()); |
+ } |
servers_dict->SetWithoutPathExpansion(server.Serialize(), |
std::move(server_pref_dict)); |
@@ -1057,10 +1073,13 @@ void HttpServerPropertiesManager::UpdatePrefsOnPrefThread( |
std::move(servers_list)); |
SetVersion(&http_server_properties_dict, kVersionNumber); |
- SaveSupportsQuicToPrefs(last_quic_address, &http_server_properties_dict); |
+ DCHECK(last_quic_address); |
+ SaveSupportsQuicToPrefs(*last_quic_address, &http_server_properties_dict); |
- SaveQuicServerInfoMapToServerPrefs(quic_server_info_map, |
- &http_server_properties_dict); |
+ if (quic_server_info_map) { |
+ SaveQuicServerInfoMapToServerPrefs(*quic_server_info_map, |
+ &http_server_properties_dict); |
+ } |
setting_prefs_ = true; |
pref_delegate_->SetServerProperties(http_server_properties_dict); |
@@ -1077,16 +1096,15 @@ void HttpServerPropertiesManager::UpdatePrefsOnPrefThread( |
} |
void HttpServerPropertiesManager::SaveAlternativeServiceToServerPrefs( |
- const AlternativeServiceInfoVector* alternative_service_info_vector, |
+ const AlternativeServiceInfoVector& alternative_service_info_vector, |
base::DictionaryValue* server_pref_dict) { |
- if (!alternative_service_info_vector || |
- alternative_service_info_vector->empty()) { |
+ if (alternative_service_info_vector.empty()) { |
return; |
} |
std::unique_ptr<base::ListValue> alternative_service_list( |
new base::ListValue); |
for (const AlternativeServiceInfo& alternative_service_info : |
- *alternative_service_info_vector) { |
+ alternative_service_info_vector) { |
const AlternativeService alternative_service = |
alternative_service_info.alternative_service(); |
DCHECK(IsAlternateProtocolValid(alternative_service.protocol)); |
@@ -1112,28 +1130,25 @@ void HttpServerPropertiesManager::SaveAlternativeServiceToServerPrefs( |
} |
void HttpServerPropertiesManager::SaveSupportsQuicToPrefs( |
- const IPAddress* last_quic_address, |
+ const IPAddress& last_quic_address, |
base::DictionaryValue* http_server_properties_dict) { |
- if (!last_quic_address || !last_quic_address->IsValid()) |
+ if (!last_quic_address.IsValid()) |
return; |
auto supports_quic_dict = base::MakeUnique<base::DictionaryValue>(); |
supports_quic_dict->SetBoolean(kUsedQuicKey, true); |
- supports_quic_dict->SetString(kAddressKey, last_quic_address->ToString()); |
+ supports_quic_dict->SetString(kAddressKey, last_quic_address.ToString()); |
http_server_properties_dict->SetWithoutPathExpansion( |
kSupportsQuicKey, std::move(supports_quic_dict)); |
} |
void HttpServerPropertiesManager::SaveNetworkStatsToServerPrefs( |
- const ServerNetworkStats* server_network_stats, |
+ const ServerNetworkStats& server_network_stats, |
base::DictionaryValue* server_pref_dict) { |
- if (!server_network_stats) |
- return; |
- |
auto server_network_stats_dict = base::MakeUnique<base::DictionaryValue>(); |
// Becasue JSON doesn't support int64_t, persist int64_t as a string. |
server_network_stats_dict->SetInteger( |
- kSrttKey, static_cast<int>(server_network_stats->srtt.ToInternalValue())); |
+ 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( |
@@ -1141,18 +1156,16 @@ void HttpServerPropertiesManager::SaveNetworkStatsToServerPrefs( |
} |
void HttpServerPropertiesManager::SaveQuicServerInfoMapToServerPrefs( |
- QuicServerInfoMap* quic_server_info_map, |
+ const QuicServerInfoMap& quic_server_info_map, |
base::DictionaryValue* http_server_properties_dict) { |
- if (!quic_server_info_map) |
- return; |
- |
auto quic_servers_dict = base::MakeUnique<base::DictionaryValue>(); |
- for (const std::pair<QuicServerId, std::string>& entry : |
- *quic_server_info_map) { |
- const QuicServerId& server_id = entry.first; |
+ for (QuicServerInfoMap::const_reverse_iterator it = |
+ quic_server_info_map.rbegin(); |
+ it != quic_server_info_map.rend(); ++it) { |
+ const QuicServerId& server_id = it->first; |
auto quic_server_pref_dict = base::MakeUnique<base::DictionaryValue>(); |
quic_server_pref_dict->SetStringWithoutPathExpansion(kServerInfoKey, |
- entry.second); |
+ it->second); |
quic_servers_dict->SetWithoutPathExpansion( |
server_id.ToString(), std::move(quic_server_pref_dict)); |
} |