| 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
|
|
|