Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(372)

Unified Diff: net/http/http_server_properties_manager.cc

Issue 992733002: Remove //net (except for Android test stuff) and sdch (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/http/http_server_properties_manager.h ('k') | net/http/http_server_properties_manager_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
deleted file mode 100644
index d6bfb38cce1ecbf584ea098a4c1a40fe1f8f5ec7..0000000000000000000000000000000000000000
--- a/net/http/http_server_properties_manager.cc
+++ /dev/null
@@ -1,876 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "net/http/http_server_properties_manager.h"
-
-#include "base/bind.h"
-#include "base/metrics/histogram.h"
-#include "base/prefs/pref_service.h"
-#include "base/single_thread_task_runner.h"
-#include "base/stl_util.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/stringprintf.h"
-#include "base/thread_task_runner_handle.h"
-#include "base/values.h"
-#include "net/base/net_util.h"
-
-namespace net {
-
-namespace {
-
-// Time to wait before starting an update the http_server_properties_impl_ cache
-// from preferences. Scheduling another update during this period will reset the
-// timer.
-const int64 kUpdateCacheDelayMs = 1000;
-
-// Time to wait before starting an update the preferences from the
-// http_server_properties_impl_ cache. Scheduling another update during this
-// period will reset the timer.
-const int64 kUpdatePrefsDelayMs = 5000;
-
-// "version" 0 indicates, http_server_properties doesn't have "version"
-// property.
-const int kMissingVersion = 0;
-
-// The version number of persisted http_server_properties.
-const int kVersionNumber = 3;
-
-typedef std::vector<std::string> StringVector;
-
-// Persist 200 MRU AlternateProtocolHostPortPairs.
-const int kMaxAlternateProtocolHostsToPersist = 200;
-
-// Persist 200 MRU SpdySettingsHostPortPairs.
-const int kMaxSpdySettingsHostsToPersist = 200;
-
-// Persist 300 MRU SupportsSpdyServerHostPortPairs.
-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
-
-////////////////////////////////////////////////////////////////////////////////
-// HttpServerPropertiesManager
-
-HttpServerPropertiesManager::HttpServerPropertiesManager(
- PrefService* pref_service,
- const char* pref_path,
- scoped_refptr<base::SequencedTaskRunner> network_task_runner)
- : pref_task_runner_(base::ThreadTaskRunnerHandle::Get()),
- pref_service_(pref_service),
- setting_prefs_(false),
- path_(pref_path),
- network_task_runner_(network_task_runner) {
- DCHECK(pref_service);
- pref_weak_ptr_factory_.reset(
- new base::WeakPtrFactory<HttpServerPropertiesManager>(this));
- pref_weak_ptr_ = pref_weak_ptr_factory_->GetWeakPtr();
- pref_cache_update_timer_.reset(
- new base::OneShotTimer<HttpServerPropertiesManager>);
- pref_change_registrar_.Init(pref_service_);
- pref_change_registrar_.Add(
- path_,
- base::Bind(&HttpServerPropertiesManager::OnHttpServerPropertiesChanged,
- base::Unretained(this)));
-}
-
-HttpServerPropertiesManager::~HttpServerPropertiesManager() {
- DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
- network_weak_ptr_factory_.reset();
-}
-
-void HttpServerPropertiesManager::InitializeOnNetworkThread() {
- DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
- network_weak_ptr_factory_.reset(
- new base::WeakPtrFactory<HttpServerPropertiesManager>(this));
- http_server_properties_impl_.reset(new HttpServerPropertiesImpl());
-
- network_prefs_update_timer_.reset(
- new base::OneShotTimer<HttpServerPropertiesManager>);
-
- pref_task_runner_->PostTask(
- FROM_HERE,
- base::Bind(&HttpServerPropertiesManager::UpdateCacheFromPrefsOnPrefThread,
- pref_weak_ptr_));
-}
-
-void HttpServerPropertiesManager::ShutdownOnPrefThread() {
- DCHECK(pref_task_runner_->RunsTasksOnCurrentThread());
- // Cancel any pending updates, and stop listening for pref change updates.
- pref_cache_update_timer_->Stop();
- pref_weak_ptr_factory_.reset();
- pref_change_registrar_.RemoveAll();
-}
-
-// static
-void HttpServerPropertiesManager::SetVersion(
- base::DictionaryValue* http_server_properties_dict,
- int version_number) {
- if (version_number < 0)
- version_number = kVersionNumber;
- DCHECK_LE(version_number, kVersionNumber);
- if (version_number <= kVersionNumber)
- http_server_properties_dict->SetInteger(kVersionKey, version_number);
-}
-
-// This is required for conformance with the HttpServerProperties interface.
-base::WeakPtr<HttpServerProperties> HttpServerPropertiesManager::GetWeakPtr() {
- DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
- return network_weak_ptr_factory_->GetWeakPtr();
-}
-
-void HttpServerPropertiesManager::Clear() {
- Clear(base::Closure());
-}
-
-void HttpServerPropertiesManager::Clear(const base::Closure& completion) {
- DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
-
- http_server_properties_impl_->Clear();
- UpdatePrefsFromCacheOnNetworkThread(completion);
-}
-
-bool HttpServerPropertiesManager::SupportsRequestPriority(
- const HostPortPair& server) {
- DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
- return http_server_properties_impl_->SupportsRequestPriority(server);
-}
-
-void HttpServerPropertiesManager::SetSupportsSpdy(const HostPortPair& server,
- bool support_spdy) {
- DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
-
- http_server_properties_impl_->SetSupportsSpdy(server, support_spdy);
- ScheduleUpdatePrefsOnNetworkThread();
-}
-
-bool HttpServerPropertiesManager::RequiresHTTP11(const HostPortPair& server) {
- DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
- return http_server_properties_impl_->RequiresHTTP11(server);
-}
-
-void HttpServerPropertiesManager::SetHTTP11Required(
- const HostPortPair& server) {
- DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
-
- http_server_properties_impl_->SetHTTP11Required(server);
- ScheduleUpdatePrefsOnNetworkThread();
-}
-
-void HttpServerPropertiesManager::MaybeForceHTTP11(const HostPortPair& server,
- SSLConfig* ssl_config) {
- DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
- http_server_properties_impl_->MaybeForceHTTP11(server, ssl_config);
-}
-
-AlternateProtocolInfo HttpServerPropertiesManager::GetAlternateProtocol(
- const HostPortPair& server) {
- DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
- return http_server_properties_impl_->GetAlternateProtocol(server);
-}
-
-void HttpServerPropertiesManager::SetAlternateProtocol(
- const HostPortPair& server,
- uint16 alternate_port,
- AlternateProtocol alternate_protocol,
- double alternate_probability) {
- DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
- http_server_properties_impl_->SetAlternateProtocol(
- server, alternate_port, alternate_protocol, alternate_probability);
- ScheduleUpdatePrefsOnNetworkThread();
-}
-
-void HttpServerPropertiesManager::SetBrokenAlternateProtocol(
- const HostPortPair& server) {
- DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
- http_server_properties_impl_->SetBrokenAlternateProtocol(server);
- ScheduleUpdatePrefsOnNetworkThread();
-}
-
-bool HttpServerPropertiesManager::WasAlternateProtocolRecentlyBroken(
- const HostPortPair& server) {
- DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
- return http_server_properties_impl_->WasAlternateProtocolRecentlyBroken(
- server);
-}
-
-void HttpServerPropertiesManager::ConfirmAlternateProtocol(
- const HostPortPair& server) {
- DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
- http_server_properties_impl_->ConfirmAlternateProtocol(server);
- ScheduleUpdatePrefsOnNetworkThread();
-}
-
-void HttpServerPropertiesManager::ClearAlternateProtocol(
- const HostPortPair& server) {
- DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
- http_server_properties_impl_->ClearAlternateProtocol(server);
- ScheduleUpdatePrefsOnNetworkThread();
-}
-
-const AlternateProtocolMap&
-HttpServerPropertiesManager::alternate_protocol_map() const {
- DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
- return http_server_properties_impl_->alternate_protocol_map();
-}
-
-void HttpServerPropertiesManager::SetAlternateProtocolProbabilityThreshold(
- double threshold) {
- DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
- http_server_properties_impl_->SetAlternateProtocolProbabilityThreshold(
- threshold);
-}
-
-const SettingsMap& HttpServerPropertiesManager::GetSpdySettings(
- const HostPortPair& host_port_pair) {
- DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
- return http_server_properties_impl_->GetSpdySettings(host_port_pair);
-}
-
-bool HttpServerPropertiesManager::SetSpdySetting(
- const HostPortPair& host_port_pair,
- SpdySettingsIds id,
- SpdySettingsFlags flags,
- uint32 value) {
- DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
- bool persist = http_server_properties_impl_->SetSpdySetting(
- host_port_pair, id, flags, value);
- if (persist)
- ScheduleUpdatePrefsOnNetworkThread();
- return persist;
-}
-
-void HttpServerPropertiesManager::ClearSpdySettings(
- const HostPortPair& host_port_pair) {
- DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
- http_server_properties_impl_->ClearSpdySettings(host_port_pair);
- ScheduleUpdatePrefsOnNetworkThread();
-}
-
-void HttpServerPropertiesManager::ClearAllSpdySettings() {
- DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
- http_server_properties_impl_->ClearAllSpdySettings();
- ScheduleUpdatePrefsOnNetworkThread();
-}
-
-const SpdySettingsMap& HttpServerPropertiesManager::spdy_settings_map()
- const {
- DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
- return http_server_properties_impl_->spdy_settings_map();
-}
-
-bool HttpServerPropertiesManager::GetSupportsQuic(
- IPAddressNumber* last_address) const {
- DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
- return http_server_properties_impl_->GetSupportsQuic(last_address);
-}
-
-void HttpServerPropertiesManager::SetSupportsQuic(
- bool used_quic,
- const IPAddressNumber& address) {
- DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
- http_server_properties_impl_->SetSupportsQuic(used_quic, address);
- ScheduleUpdatePrefsOnNetworkThread();
-}
-
-void HttpServerPropertiesManager::SetServerNetworkStats(
- const HostPortPair& host_port_pair,
- ServerNetworkStats stats) {
- DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
- http_server_properties_impl_->SetServerNetworkStats(host_port_pair, stats);
- ScheduleUpdatePrefsOnNetworkThread();
-}
-
-const ServerNetworkStats* HttpServerPropertiesManager::GetServerNetworkStats(
- const HostPortPair& host_port_pair) {
- DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
- return http_server_properties_impl_->GetServerNetworkStats(host_port_pair);
-}
-
-const ServerNetworkStatsMap&
-HttpServerPropertiesManager::server_network_stats_map() const {
- DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
- return http_server_properties_impl_->server_network_stats_map();
-}
-
-//
-// Update the HttpServerPropertiesImpl's cache with data from preferences.
-//
-void HttpServerPropertiesManager::ScheduleUpdateCacheOnPrefThread() {
- DCHECK(pref_task_runner_->RunsTasksOnCurrentThread());
- // Cancel pending updates, if any.
- pref_cache_update_timer_->Stop();
- StartCacheUpdateTimerOnPrefThread(
- base::TimeDelta::FromMilliseconds(kUpdateCacheDelayMs));
-}
-
-void HttpServerPropertiesManager::StartCacheUpdateTimerOnPrefThread(
- base::TimeDelta delay) {
- DCHECK(pref_task_runner_->RunsTasksOnCurrentThread());
- pref_cache_update_timer_->Start(
- FROM_HERE,
- delay,
- this,
- &HttpServerPropertiesManager::UpdateCacheFromPrefsOnPrefThread);
-}
-
-void HttpServerPropertiesManager::UpdateCacheFromPrefsOnPrefThread() {
- // The preferences can only be read on the pref thread.
- DCHECK(pref_task_runner_->RunsTasksOnCurrentThread());
-
- if (!pref_service_->HasPrefPath(path_))
- return;
-
- bool detected_corrupted_prefs = false;
- const base::DictionaryValue& http_server_properties_dict =
- *pref_service_->GetDictionary(path_);
-
- int version = kMissingVersion;
- if (!http_server_properties_dict.GetIntegerWithoutPathExpansion(kVersionKey,
- &version)) {
- DVLOG(1) << "Missing version. Clearing all properties.";
- return;
- }
-
- // The properties for a given server is in
- // http_server_properties_dict["servers"][server].
- const base::DictionaryValue* servers_dict = NULL;
- if (!http_server_properties_dict.GetDictionaryWithoutPathExpansion(
- 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<ServerNetworkStatsMap> server_network_stats_map(
- new ServerNetworkStatsMap(kMaxServerNetworkStatsHostsToPersist));
-
- for (base::DictionaryValue::Iterator it(*servers_dict); !it.IsAtEnd();
- it.Advance()) {
- // Get server's host/pair.
- const std::string& server_str = it.key();
- HostPortPair server = HostPortPair::FromString(server_str);
- if (server.host().empty()) {
- DVLOG(1) << "Malformed http_server_properties for server: " << server_str;
- detected_corrupted_prefs = true;
- continue;
- }
-
- const base::DictionaryValue* server_pref_dict = NULL;
- if (!it.value().GetAsDictionary(&server_pref_dict)) {
- DVLOG(1) << "Malformed http_server_properties server: " << server_str;
- detected_corrupted_prefs = true;
- continue;
- }
-
- // Get if server supports Spdy.
- bool supports_spdy = false;
- if ((server_pref_dict->GetBoolean(kSupportsSpdyKey, &supports_spdy)) &&
- supports_spdy) {
- spdy_servers->push_back(server_str);
- }
-
- 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;
- }
- }
-
- network_task_runner_->PostTask(
- FROM_HERE,
- base::Bind(
- &HttpServerPropertiesManager::UpdateCacheFromPrefsOnNetworkThread,
- base::Unretained(this), base::Owned(spdy_servers.release()),
- base::Owned(spdy_settings_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,
- IPAddressNumber* last_quic_address,
- ServerNetworkStatsMap* server_network_stats_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_->RunsTasksOnCurrentThread());
-
- UMA_HISTOGRAM_COUNTS("Net.CountOfSpdyServers", spdy_servers->size());
- http_server_properties_impl_->InitializeSpdyServers(spdy_servers, true);
-
- // Update the cached data and use the new spdy_settings from preferences.
- UMA_HISTOGRAM_COUNTS("Net.CountOfSpdySettings", spdy_settings_map->size());
- http_server_properties_impl_->InitializeSpdySettingsServers(
- spdy_settings_map);
-
- // Update the cached data and use the new Alternate-Protocol server list from
- // preferences.
- UMA_HISTOGRAM_COUNTS("Net.CountOfAlternateProtocolServers",
- alternate_protocol_map->size());
- http_server_properties_impl_->InitializeAlternateProtocolServers(
- alternate_protocol_map);
-
- http_server_properties_impl_->InitializeSupportsQuic(last_quic_address);
-
- http_server_properties_impl_->InitializeServerNetworkStats(
- server_network_stats_map);
-
- // Update the prefs with what we have read (delete all corrupted prefs).
- if (detected_corrupted_prefs)
- ScheduleUpdatePrefsOnNetworkThread();
-}
-
-//
-// Update Preferences with data from the cached data.
-//
-void HttpServerPropertiesManager::ScheduleUpdatePrefsOnNetworkThread() {
- DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
- // Cancel pending updates, if any.
- network_prefs_update_timer_->Stop();
- StartPrefsUpdateTimerOnNetworkThread(
- base::TimeDelta::FromMilliseconds(kUpdatePrefsDelayMs));
-}
-
-void HttpServerPropertiesManager::StartPrefsUpdateTimerOnNetworkThread(
- base::TimeDelta delay) {
- DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
- // This is overridden in tests to post the task without the delay.
- network_prefs_update_timer_->Start(
- FROM_HERE,
- delay,
- this,
- &HttpServerPropertiesManager::UpdatePrefsFromCacheOnNetworkThread);
-}
-
-// This is required so we can set this as the callback for a timer.
-void HttpServerPropertiesManager::UpdatePrefsFromCacheOnNetworkThread() {
- UpdatePrefsFromCacheOnNetworkThread(base::Closure());
-}
-
-void HttpServerPropertiesManager::UpdatePrefsFromCacheOnNetworkThread(
- const base::Closure& completion) {
- DCHECK(network_task_runner_->RunsTasksOnCurrentThread());
-
- base::ListValue* spdy_server_list = new base::ListValue;
- http_server_properties_impl_->GetSpdyServerList(
- spdy_server_list, kMaxSupportsSpdyServerHostsToPersist);
-
- SpdySettingsMap* spdy_settings_map =
- new SpdySettingsMap(kMaxSpdySettingsHostsToPersist);
- const SpdySettingsMap& main_map =
- http_server_properties_impl_->spdy_settings_map();
- int count = 0;
- for (SpdySettingsMap::const_iterator it = main_map.begin();
- it != main_map.end() && count < kMaxSpdySettingsHostsToPersist;
- ++it, ++count) {
- spdy_settings_map->Put(it->first, it->second);
- }
-
- AlternateProtocolMap* alternate_protocol_map =
- new AlternateProtocolMap(kMaxAlternateProtocolHostsToPersist);
- const AlternateProtocolMap& map =
- http_server_properties_impl_->alternate_protocol_map();
- count = 0;
- typedef std::map<std::string, bool> CanonicalHostPersistedMap;
- CanonicalHostPersistedMap persisted_map;
- for (AlternateProtocolMap::const_iterator it = map.begin();
- it != map.end() && count < kMaxAlternateProtocolHostsToPersist; ++it) {
- const HostPortPair& server = it->first;
- std::string canonical_suffix =
- http_server_properties_impl_->GetCanonicalSuffix(server.host());
- if (!canonical_suffix.empty()) {
- if (persisted_map.find(canonical_suffix) != persisted_map.end())
- continue;
- persisted_map[canonical_suffix] = true;
- }
- alternate_protocol_map->Put(server, it->second);
- ++count;
- }
-
- ServerNetworkStatsMap* server_network_stats_map =
- new ServerNetworkStatsMap(kMaxServerNetworkStatsHostsToPersist);
- const ServerNetworkStatsMap& main_server_network_stats_map =
- http_server_properties_impl_->server_network_stats_map();
- for (ServerNetworkStatsMap::const_iterator it =
- main_server_network_stats_map.begin();
- it != main_server_network_stats_map.end(); ++it) {
- 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(last_quic_addr),
- base::Owned(server_network_stats_map), completion));
-}
-
-// A local or temporary data structure to hold |supports_spdy|, SpdySettings,
-// 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),
- supports_quic(NULL),
- server_network_stats(NULL) {}
- ServerPref(bool supports_spdy,
- const SettingsMap* settings_map,
- const AlternateProtocolInfo* alternate_protocol,
- const SupportsQuic* supports_quic,
- const ServerNetworkStats* server_network_stats)
- : supports_spdy(supports_spdy),
- settings_map(settings_map),
- alternate_protocol(alternate_protocol),
- supports_quic(supports_quic),
- server_network_stats(server_network_stats) {}
- bool supports_spdy;
- const SettingsMap* settings_map;
- const AlternateProtocolInfo* alternate_protocol;
- const SupportsQuic* supports_quic;
- const ServerNetworkStats* server_network_stats;
-};
-
-void HttpServerPropertiesManager::UpdatePrefsOnPrefThread(
- base::ListValue* spdy_server_list,
- SpdySettingsMap* spdy_settings_map,
- AlternateProtocolMap* alternate_protocol_map,
- IPAddressNumber* last_quic_address,
- ServerNetworkStatsMap* server_network_stats_map,
- const base::Closure& completion) {
- typedef std::map<HostPortPair, ServerPref> ServerPrefMap;
- ServerPrefMap server_pref_map;
-
- DCHECK(pref_task_runner_->RunsTasksOnCurrentThread());
-
- // Add servers that support spdy to server_pref_map.
- std::string s;
- for (base::ListValue::const_iterator list_it = spdy_server_list->begin();
- list_it != spdy_server_list->end();
- ++list_it) {
- if ((*list_it)->GetAsString(&s)) {
- HostPortPair server = HostPortPair::FromString(s);
- server_pref_map[server].supports_spdy = true;
- }
- }
-
- // Add servers that have SpdySettings to server_pref_map.
- for (SpdySettingsMap::iterator map_it = spdy_settings_map->begin();
- map_it != spdy_settings_map->end(); ++map_it) {
- const HostPortPair& server = map_it->first;
- server_pref_map[server].settings_map = &map_it->second;
- }
-
- // Add AlternateProtocol servers to server_pref_map.
- for (AlternateProtocolMap::const_iterator map_it =
- alternate_protocol_map->begin();
- map_it != alternate_protocol_map->end(); ++map_it) {
- const HostPortPair& server = map_it->first;
- const AlternateProtocolInfo& port_alternate_protocol = map_it->second;
- if (!IsAlternateProtocolValid(port_alternate_protocol.protocol)) {
- continue;
- }
- server_pref_map[server].alternate_protocol = &map_it->second;
- }
-
- // Add ServerNetworkStats servers to server_pref_map.
- for (ServerNetworkStatsMap::const_iterator map_it =
- server_network_stats_map->begin();
- map_it != server_network_stats_map->end(); ++map_it) {
- const HostPortPair& server = map_it->first;
- server_pref_map[server].server_network_stats = &map_it->second;
- }
-
- // Persist properties to the |path_|.
- base::DictionaryValue http_server_properties_dict;
- base::DictionaryValue* servers_dict = new base::DictionaryValue;
- for (ServerPrefMap::const_iterator map_it = server_pref_map.begin();
- map_it != server_pref_map.end();
- ++map_it) {
- const HostPortPair& server = map_it->first;
- const ServerPref& server_pref = map_it->second;
-
- base::DictionaryValue* server_pref_dict = new base::DictionaryValue;
-
- // Save supports_spdy.
- if (server_pref.supports_spdy)
- 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(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;
-
- // Note that |completion| will be fired after we have written everything to
- // the Preferences, but likely before these changes are serialized to disk.
- // This is not a problem though, as JSONPrefStore guarantees that this will
- // happen, pretty soon, and even in the case we shut down immediately.
- if (!completion.is_null())
- 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_)
- ScheduleUpdateCacheOnPrefThread();
-}
-
-} // namespace net
« no previous file with comments | « net/http/http_server_properties_manager.h ('k') | net/http/http_server_properties_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698