| Index: chrome/browser/io_thread.cc
|
| diff --git a/chrome/browser/io_thread.cc b/chrome/browser/io_thread.cc
|
| index ed2f0d670fb2f6e31dd1a7e48ab5c8932fb18b66..5f8941abc2e4a208bc27084a9db31f4a20f38c96 100644
|
| --- a/chrome/browser/io_thread.cc
|
| +++ b/chrome/browser/io_thread.cc
|
| @@ -136,6 +136,7 @@ const char kSpdyFieldTrialName[] = "SPDY";
|
| const char kSpdyFieldTrialHoldbackGroupNamePrefix[] = "SpdyDisabled";
|
| const char kSpdyFieldTrialSpdy31GroupNamePrefix[] = "Spdy31Enabled";
|
| const char kSpdyFieldTrialSpdy4GroupNamePrefix[] = "Spdy4Enabled";
|
| +const char kSpdyFieldTrialParametrizedPrefix[] = "Parametrized";
|
|
|
| // Field trial for Cache-Control: stale-while-revalidate directive.
|
| const char kStaleWhileRevalidateFieldTrialName[] = "StaleWhileRevalidate";
|
| @@ -319,6 +320,100 @@ bool IsCertificateTransparencyRequiredForEV(
|
| return group_name == "RequirementEnforced";
|
| }
|
|
|
| +// Parse kUseSpdy command line flag options, which may contain the following:
|
| +//
|
| +// "off" : Disables SPDY support entirely.
|
| +// "ssl" : Forces SPDY for all HTTPS requests.
|
| +// "no-ssl" : Forces SPDY for all HTTP requests.
|
| +// "no-ping" : Disables SPDY ping connection testing.
|
| +// "exclude=<host>" : Disables SPDY support for the host <host>.
|
| +// "no-compress" : Disables SPDY header compression.
|
| +// "no-alt-protocols : Disables alternate protocol support.
|
| +// "force-alt-protocols : Forces an alternate protocol of SPDY/3
|
| +// on port 443.
|
| +// "single-domain" : Forces all spdy traffic to a single domain.
|
| +// "init-max-streams=<limit>" : Specifies the maximum number of concurrent
|
| +// streams for a SPDY session, unless the
|
| +// specifies a different value via SETTINGS.
|
| +void ConfigureSpdyGlobalsFromUseSpdyArgument(const std::string& mode,
|
| + IOThread::Globals* globals) {
|
| + static const char kOff[] = "off";
|
| + static const char kSSL[] = "ssl";
|
| + static const char kDisableSSL[] = "no-ssl";
|
| + static const char kDisablePing[] = "no-ping";
|
| + static const char kExclude[] = "exclude"; // Hosts to exclude
|
| + static const char kDisableCompression[] = "no-compress";
|
| + static const char kDisableAltProtocols[] = "no-alt-protocols";
|
| + static const char kForceAltProtocols[] = "force-alt-protocols";
|
| + static const char kSingleDomain[] = "single-domain";
|
| +
|
| + static const char kInitialMaxConcurrentStreams[] = "init-max-streams";
|
| +
|
| + std::vector<std::string> spdy_options;
|
| + base::SplitString(mode, ',', &spdy_options);
|
| +
|
| + for (const std::string& element : spdy_options) {
|
| + std::vector<std::string> name_value;
|
| + base::SplitString(element, '=', &name_value);
|
| + const std::string& option =
|
| + name_value.size() > 0 ? name_value[0] : std::string();
|
| + const std::string value =
|
| + name_value.size() > 1 ? name_value[1] : std::string();
|
| +
|
| + if (option == kOff) {
|
| + net::HttpStreamFactory::set_spdy_enabled(false);
|
| + continue;
|
| + }
|
| + if (option == kDisableSSL) {
|
| + globals->spdy_default_protocol.set(net::kProtoSPDY31);
|
| + globals->force_spdy_over_ssl.set(false);
|
| + globals->force_spdy_always.set(true);
|
| + continue;
|
| + }
|
| + if (option == kSSL) {
|
| + globals->spdy_default_protocol.set(net::kProtoSPDY31);
|
| + globals->force_spdy_over_ssl.set(true);
|
| + globals->force_spdy_always.set(true);
|
| + continue;
|
| + }
|
| + if (option == kDisablePing) {
|
| + globals->enable_spdy_ping_based_connection_checking.set(false);
|
| + continue;
|
| + }
|
| + if (option == kExclude) {
|
| + globals->forced_spdy_exclusions.insert(
|
| + net::HostPortPair::FromURL(GURL(value)));
|
| + continue;
|
| + }
|
| + if (option == kDisableCompression) {
|
| + globals->enable_spdy_compression.set(false);
|
| + continue;
|
| + }
|
| + if (option == kDisableAltProtocols) {
|
| + globals->use_alternate_protocols.set(false);
|
| + continue;
|
| + }
|
| + if (option == kForceAltProtocols) {
|
| + net::AlternateProtocolInfo pair(443, net::NPN_SPDY_3, 1);
|
| + net::HttpServerPropertiesImpl::ForceAlternateProtocol(pair);
|
| + continue;
|
| + }
|
| + if (option == kSingleDomain) {
|
| + DVLOG(1) << "FORCING SINGLE DOMAIN";
|
| + globals->force_spdy_single_domain.set(true);
|
| + continue;
|
| + }
|
| + if (option == kInitialMaxConcurrentStreams) {
|
| + int streams;
|
| + if (base::StringToInt(value, &streams)) {
|
| + globals->initial_max_spdy_concurrent_streams.set(streams);
|
| + continue;
|
| + }
|
| + }
|
| + LOG(DFATAL) << "Unrecognized spdy option: " << option;
|
| + }
|
| +}
|
| +
|
| } // namespace
|
|
|
| class IOThread::LoggingNetworkChangeObserver
|
| @@ -865,28 +960,12 @@ void IOThread::InitializeNetworkOptions(const base::CommandLine& command_line) {
|
| if (trial)
|
| trial->Disable();
|
| } else {
|
| - if (command_line.HasSwitch(switches::kTrustedSpdyProxy)) {
|
| - globals_->trusted_spdy_proxy.set(
|
| - command_line.GetSwitchValueASCII(switches::kTrustedSpdyProxy));
|
| - }
|
| - if (command_line.HasSwitch(switches::kIgnoreUrlFetcherCertRequests))
|
| - net::URLFetcher::SetIgnoreCertificateRequests(true);
|
| -
|
| - if (command_line.HasSwitch(switches::kUseSpdy)) {
|
| - std::string spdy_mode =
|
| - command_line.GetSwitchValueASCII(switches::kUseSpdy);
|
| - EnableSpdy(spdy_mode);
|
| - } else if (command_line.HasSwitch(switches::kEnableSpdy4)) {
|
| - globals_->next_protos = net::NextProtosSpdy4Http2();
|
| - globals_->use_alternate_protocols.set(true);
|
| - } else if (command_line.HasSwitch(switches::kEnableNpnHttpOnly)) {
|
| - globals_->next_protos = net::NextProtosHttpOnly();
|
| - globals_->use_alternate_protocols.set(false);
|
| - } else {
|
| - // No SPDY command-line flags have been specified. Examine trial groups.
|
| - ConfigureSpdyFromTrial(
|
| - base::FieldTrialList::FindFullName(kSpdyFieldTrialName), globals_);
|
| + std::string group = base::FieldTrialList::FindFullName(kSpdyFieldTrialName);
|
| + VariationParameters params;
|
| + if (!variations::GetVariationParams(kSpdyFieldTrialName, ¶ms)) {
|
| + params.clear();
|
| }
|
| + ConfigureSpdyGlobals(command_line, group, params, globals_);
|
| }
|
|
|
| ConfigureTCPFastOpen(command_line);
|
| @@ -930,87 +1009,92 @@ void IOThread::ConfigureSdch() {
|
| }
|
| }
|
|
|
| -void IOThread::ConfigureSpdyFromTrial(base::StringPiece spdy_trial_group,
|
| - Globals* globals) {
|
| - if (spdy_trial_group.starts_with(kSpdyFieldTrialHoldbackGroupNamePrefix)) {
|
| - // TODO(jgraettinger): Use net::NextProtosHttpOnly() instead?
|
| - net::HttpStreamFactory::set_spdy_enabled(false);
|
| - } else if (spdy_trial_group.starts_with(
|
| - kSpdyFieldTrialSpdy31GroupNamePrefix)) {
|
| - globals->next_protos = net::NextProtosSpdy31();
|
| - globals->use_alternate_protocols.set(true);
|
| - } else if (spdy_trial_group.starts_with(
|
| - kSpdyFieldTrialSpdy4GroupNamePrefix)) {
|
| - globals->next_protos = net::NextProtosSpdy4Http2();
|
| - globals->use_alternate_protocols.set(true);
|
| - } else {
|
| - // By default, enable HTTP/2.
|
| - globals->next_protos = net::NextProtosSpdy4Http2();
|
| - globals->use_alternate_protocols.set(true);
|
| +// static
|
| +void IOThread::ConfigureSpdyGlobals(
|
| + const base::CommandLine& command_line,
|
| + base::StringPiece spdy_trial_group,
|
| + const VariationParameters& spdy_trial_params,
|
| + IOThread::Globals* globals) {
|
| + if (command_line.HasSwitch(switches::kTrustedSpdyProxy)) {
|
| + globals->trusted_spdy_proxy.set(
|
| + command_line.GetSwitchValueASCII(switches::kTrustedSpdyProxy));
|
| }
|
| -}
|
| -
|
| -void IOThread::EnableSpdy(const std::string& mode) {
|
| - static const char kOff[] = "off";
|
| - static const char kSSL[] = "ssl";
|
| - static const char kDisableSSL[] = "no-ssl";
|
| - static const char kDisablePing[] = "no-ping";
|
| - static const char kExclude[] = "exclude"; // Hosts to exclude
|
| - static const char kDisableCompression[] = "no-compress";
|
| - static const char kDisableAltProtocols[] = "no-alt-protocols";
|
| - static const char kForceAltProtocols[] = "force-alt-protocols";
|
| - static const char kSingleDomain[] = "single-domain";
|
| + if (command_line.HasSwitch(switches::kIgnoreUrlFetcherCertRequests))
|
| + net::URLFetcher::SetIgnoreCertificateRequests(true);
|
|
|
| - static const char kInitialMaxConcurrentStreams[] = "init-max-streams";
|
| + if (command_line.HasSwitch(switches::kUseSpdy)) {
|
| + std::string spdy_mode =
|
| + command_line.GetSwitchValueASCII(switches::kUseSpdy);
|
| + ConfigureSpdyGlobalsFromUseSpdyArgument(spdy_mode, globals);
|
| + return;
|
| + }
|
|
|
| - std::vector<std::string> spdy_options;
|
| - base::SplitString(mode, ',', &spdy_options);
|
| + globals->next_protos.clear();
|
| + globals->next_protos.push_back(net::kProtoHTTP11);
|
| + bool enable_quic = false;
|
| + globals->enable_quic.CopyToIfSet(&enable_quic);
|
| + if (enable_quic) {
|
| + globals->next_protos.push_back(net::kProtoQUIC1SPDY3);
|
| + }
|
|
|
| - for (std::vector<std::string>::iterator it = spdy_options.begin();
|
| - it != spdy_options.end(); ++it) {
|
| - const std::string& element = *it;
|
| - std::vector<std::string> name_value;
|
| - base::SplitString(element, '=', &name_value);
|
| - const std::string& option =
|
| - name_value.size() > 0 ? name_value[0] : std::string();
|
| - const std::string value =
|
| - name_value.size() > 1 ? name_value[1] : std::string();
|
| + if (command_line.HasSwitch(switches::kEnableSpdy4)) {
|
| + globals->next_protos.push_back(net::kProtoSPDY31);
|
| + globals->next_protos.push_back(net::kProtoSPDY4_14);
|
| + globals->next_protos.push_back(net::kProtoSPDY4);
|
| + globals->use_alternate_protocols.set(true);
|
| + return;
|
| + }
|
| + if (command_line.HasSwitch(switches::kEnableNpnHttpOnly)) {
|
| + globals->use_alternate_protocols.set(false);
|
| + return;
|
| + }
|
|
|
| - if (option == kOff) {
|
| - net::HttpStreamFactory::set_spdy_enabled(false);
|
| - } else if (option == kDisableSSL) {
|
| - globals_->spdy_default_protocol.set(net::kProtoSPDY31);
|
| - globals_->force_spdy_over_ssl.set(false);
|
| - globals_->force_spdy_always.set(true);
|
| - } else if (option == kSSL) {
|
| - globals_->spdy_default_protocol.set(net::kProtoSPDY31);
|
| - globals_->force_spdy_over_ssl.set(true);
|
| - globals_->force_spdy_always.set(true);
|
| - } else if (option == kDisablePing) {
|
| - globals_->enable_spdy_ping_based_connection_checking.set(false);
|
| - } else if (option == kExclude) {
|
| - globals_->forced_spdy_exclusions.insert(
|
| - net::HostPortPair::FromURL(GURL(value)));
|
| - } else if (option == kDisableCompression) {
|
| - globals_->enable_spdy_compression.set(false);
|
| - } else if (option == kDisableAltProtocols) {
|
| - globals_->use_alternate_protocols.set(false);
|
| - } else if (option == kForceAltProtocols) {
|
| - net::AlternateProtocolInfo pair(443, net::NPN_SPDY_3, 1);
|
| - net::HttpServerPropertiesImpl::ForceAlternateProtocol(pair);
|
| - } else if (option == kSingleDomain) {
|
| - DVLOG(1) << "FORCING SINGLE DOMAIN";
|
| - globals_->force_spdy_single_domain.set(true);
|
| - } else if (option == kInitialMaxConcurrentStreams) {
|
| - int streams;
|
| - if (base::StringToInt(value, &streams))
|
| - globals_->initial_max_spdy_concurrent_streams.set(streams);
|
| - } else if (option.empty() && it == spdy_options.begin()) {
|
| - continue;
|
| - } else {
|
| - LOG(DFATAL) << "Unrecognized spdy option: " << option;
|
| + // No SPDY command-line flags have been specified. Examine trial groups.
|
| + if (spdy_trial_group.starts_with(kSpdyFieldTrialHoldbackGroupNamePrefix)) {
|
| + net::HttpStreamFactory::set_spdy_enabled(false);
|
| + return;
|
| + }
|
| + if (spdy_trial_group.starts_with(kSpdyFieldTrialSpdy31GroupNamePrefix)) {
|
| + globals->next_protos.push_back(net::kProtoSPDY31);
|
| + globals->use_alternate_protocols.set(true);
|
| + return;
|
| + }
|
| + if (spdy_trial_group.starts_with(kSpdyFieldTrialSpdy4GroupNamePrefix)) {
|
| + globals->next_protos.push_back(net::kProtoSPDY31);
|
| + globals->next_protos.push_back(net::kProtoSPDY4_14);
|
| + globals->next_protos.push_back(net::kProtoSPDY4);
|
| + globals->use_alternate_protocols.set(true);
|
| + return;
|
| + }
|
| + if (spdy_trial_group.starts_with(kSpdyFieldTrialParametrizedPrefix)) {
|
| + bool spdy_enabled = false;
|
| + if (LowerCaseEqualsASCII(
|
| + GetVariationParam(spdy_trial_params, "enable_spdy31"), "true")) {
|
| + globals->next_protos.push_back(net::kProtoSPDY31);
|
| + spdy_enabled = true;
|
| + }
|
| + if (LowerCaseEqualsASCII(
|
| + GetVariationParam(spdy_trial_params, "enable_http2_14"), "true")) {
|
| + globals->next_protos.push_back(net::kProtoSPDY4_14);
|
| + spdy_enabled = true;
|
| + }
|
| + if (LowerCaseEqualsASCII(
|
| + GetVariationParam(spdy_trial_params, "enable_http2"), "true")) {
|
| + globals->next_protos.push_back(net::kProtoSPDY4);
|
| + spdy_enabled = true;
|
| }
|
| + // TODO(bnc): HttpStreamFactory::spdy_enabled_ is redundant with
|
| + // globals->next_protos, can it be eliminated?
|
| + net::HttpStreamFactory::set_spdy_enabled(spdy_enabled);
|
| + globals->use_alternate_protocols.set(true);
|
| + return;
|
| }
|
| +
|
| + // By default, enable HTTP/2.
|
| + globals->next_protos.push_back(net::kProtoSPDY31);
|
| + globals->next_protos.push_back(net::kProtoSPDY4_14);
|
| + globals->next_protos.push_back(net::kProtoSPDY4);
|
| + globals->use_alternate_protocols.set(true);
|
| }
|
|
|
| // static
|
|
|