| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/network_session_configurator/network_session_configurator.h
" | 5 #include "components/network_session_configurator/network_session_configurator.h
" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 | 8 |
| 9 #include "base/metrics/field_trial.h" | 9 #include "base/metrics/field_trial.h" |
| 10 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 // Map from name to value for all parameters associate with a field trial. | 25 // Map from name to value for all parameters associate with a field trial. |
| 26 using VariationParameters = std::map<std::string, std::string>; | 26 using VariationParameters = std::map<std::string, std::string>; |
| 27 | 27 |
| 28 const char kTCPFastOpenFieldTrialName[] = "TCPFastOpen"; | 28 const char kTCPFastOpenFieldTrialName[] = "TCPFastOpen"; |
| 29 const char kTCPFastOpenHttpsEnabledGroupName[] = "HttpsEnabled"; | 29 const char kTCPFastOpenHttpsEnabledGroupName[] = "HttpsEnabled"; |
| 30 | 30 |
| 31 const char kQuicFieldTrialName[] = "QUIC"; | 31 const char kQuicFieldTrialName[] = "QUIC"; |
| 32 const char kQuicFieldTrialEnabledGroupName[] = "Enabled"; | 32 const char kQuicFieldTrialEnabledGroupName[] = "Enabled"; |
| 33 const char kQuicFieldTrialHttpsEnabledGroupName[] = "HttpsEnabled"; | 33 const char kQuicFieldTrialHttpsEnabledGroupName[] = "HttpsEnabled"; |
| 34 | 34 |
| 35 // The SPDY trial composes two different trial plus control groups: | 35 // Field trial for HTTP/2. |
| 36 // * A "holdback" group with SPDY disabled, and corresponding control | 36 const char kHttp2FieldTrialName[] = "HTTP2"; |
| 37 // (SPDY/3.1). The primary purpose of the holdback group is to encourage site | 37 const char kHttp2FieldTrialDisablePrefix[] = "Disable"; |
| 38 // operators to do feature detection rather than UA-sniffing. As such, this | |
| 39 // trial runs continuously. | |
| 40 // * A SPDY/4 experiment, for SPDY/4 (aka HTTP/2) vs SPDY/3.1 comparisons and | |
| 41 // eventual SPDY/4 deployment. | |
| 42 const char kSpdyFieldTrialName[] = "SPDY"; | |
| 43 const char kSpdyFieldTrialHoldbackGroupNamePrefix[] = "SpdyDisabled"; | |
| 44 const char kSpdyFieldTrialSpdy31GroupNamePrefix[] = "Spdy31Enabled"; | |
| 45 const char kSpdyFieldTrialSpdy4GroupNamePrefix[] = "Spdy4Enabled"; | |
| 46 const char kSpdyFieldTrialParametrizedPrefix[] = "Parametrized"; | |
| 47 | 38 |
| 48 // Field trial for NPN. | 39 // Field trial for NPN. |
| 49 const char kNpnTrialName[] = "NPN"; | 40 const char kNpnTrialName[] = "NPN"; |
| 50 const char kNpnTrialEnabledGroupNamePrefix[] = "Enable"; | 41 const char kNpnTrialEnabledGroupNamePrefix[] = "Enable"; |
| 51 const char kNpnTrialDisabledGroupNamePrefix[] = "Disable"; | 42 const char kNpnTrialDisabledGroupNamePrefix[] = "Disable"; |
| 52 | 43 |
| 53 // Field trial for priority dependencies. | 44 // Field trial for priority dependencies. |
| 54 const char kSpdyDependenciesFieldTrial[] = "SpdyEnableDependencies"; | 45 const char kSpdyDependenciesFieldTrial[] = "SpdyEnableDependencies"; |
| 55 const char kSpdyDependenciesFieldTrialEnable[] = "Enable"; | 46 const char kSpdyDependenciesFieldTrialEnable[] = "Enable"; |
| 56 const char kSpdyDepencenciesFieldTrialDisable[] = "Disable"; | 47 const char kSpdyDepencenciesFieldTrialDisable[] = "Disable"; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 76 | 67 |
| 77 return it->second; | 68 return it->second; |
| 78 } | 69 } |
| 79 | 70 |
| 80 void ConfigureTCPFastOpenParams(base::StringPiece tfo_trial_group, | 71 void ConfigureTCPFastOpenParams(base::StringPiece tfo_trial_group, |
| 81 net::HttpNetworkSession::Params* params) { | 72 net::HttpNetworkSession::Params* params) { |
| 82 if (tfo_trial_group == kTCPFastOpenHttpsEnabledGroupName) | 73 if (tfo_trial_group == kTCPFastOpenHttpsEnabledGroupName) |
| 83 params->enable_tcp_fast_open_for_ssl = true; | 74 params->enable_tcp_fast_open_for_ssl = true; |
| 84 } | 75 } |
| 85 | 76 |
| 86 void ConfigureSpdyParams(const base::CommandLine& command_line, | 77 void ConfigureHttp2Params(const base::CommandLine& command_line, |
| 87 base::StringPiece spdy_trial_group, | 78 base::StringPiece http2_trial_group, |
| 88 const VariationParameters& spdy_trial_params, | 79 net::HttpNetworkSession::Params* params) { |
| 89 bool is_spdy_allowed_by_policy, | |
| 90 net::HttpNetworkSession::Params* params) { | |
| 91 // Only handle SPDY field trial parameters and command line flags if | |
| 92 // "spdy.disabled" preference is not forced via policy. | |
| 93 if (!is_spdy_allowed_by_policy) { | |
| 94 params->enable_spdy31 = false; | |
| 95 return; | |
| 96 } | |
| 97 | |
| 98 if (command_line.HasSwitch(switches::kIgnoreUrlFetcherCertRequests)) | 80 if (command_line.HasSwitch(switches::kIgnoreUrlFetcherCertRequests)) |
| 99 net::URLFetcher::SetIgnoreCertificateRequests(true); | 81 net::URLFetcher::SetIgnoreCertificateRequests(true); |
| 100 | 82 |
| 101 if (command_line.HasSwitch(switches::kDisableHttp2)) { | 83 if (command_line.HasSwitch(switches::kDisableHttp2)) { |
| 102 params->enable_spdy31 = false; | |
| 103 params->enable_http2 = false; | 84 params->enable_http2 = false; |
| 104 return; | 85 return; |
| 105 } | 86 } |
| 106 | 87 |
| 107 if (spdy_trial_group.starts_with(kSpdyFieldTrialHoldbackGroupNamePrefix)) { | 88 if (http2_trial_group.starts_with(kHttp2FieldTrialDisablePrefix)) { |
| 108 net::HttpStreamFactory::set_spdy_enabled(false); | |
| 109 return; | |
| 110 } | |
| 111 if (spdy_trial_group.starts_with(kSpdyFieldTrialSpdy31GroupNamePrefix)) { | |
| 112 params->enable_spdy31 = true; | |
| 113 params->enable_http2 = false; | 89 params->enable_http2 = false; |
| 114 return; | |
| 115 } | |
| 116 if (spdy_trial_group.starts_with(kSpdyFieldTrialSpdy4GroupNamePrefix)) { | |
| 117 params->enable_spdy31 = true; | |
| 118 params->enable_http2 = true; | |
| 119 return; | |
| 120 } | |
| 121 if (spdy_trial_group.starts_with(kSpdyFieldTrialParametrizedPrefix)) { | |
| 122 bool spdy_enabled = false; | |
| 123 params->enable_spdy31 = false; | |
| 124 params->enable_http2 = false; | |
| 125 if (base::LowerCaseEqualsASCII( | |
| 126 GetVariationParam(spdy_trial_params, "enable_http2"), "true")) { | |
| 127 spdy_enabled = true; | |
| 128 params->enable_http2 = true; | |
| 129 } | |
| 130 if (base::LowerCaseEqualsASCII( | |
| 131 GetVariationParam(spdy_trial_params, "enable_spdy31"), "true")) { | |
| 132 spdy_enabled = true; | |
| 133 params->enable_spdy31 = true; | |
| 134 } | |
| 135 // TODO(bnc): https://crbug.com/521597 | |
| 136 // HttpStreamFactory::spdy_enabled_ is redundant with params->enable_http2 | |
| 137 // and enable_spdy31, can it be eliminated? | |
| 138 net::HttpStreamFactory::set_spdy_enabled(spdy_enabled); | |
| 139 return; | |
| 140 } | 90 } |
| 141 } | 91 } |
| 142 | 92 |
| 143 void ConfigureNPNParams(const base::CommandLine& command_line, | 93 void ConfigureNPNParams(const base::CommandLine& command_line, |
| 144 base::StringPiece npn_trial_group, | 94 base::StringPiece npn_trial_group, |
| 145 net::HttpNetworkSession::Params* params) { | 95 net::HttpNetworkSession::Params* params) { |
| 146 if (npn_trial_group.starts_with(kNpnTrialEnabledGroupNamePrefix)) { | 96 if (npn_trial_group.starts_with(kNpnTrialEnabledGroupNamePrefix)) { |
| 147 params->enable_npn = true; | 97 params->enable_npn = true; |
| 148 } else if (npn_trial_group.starts_with(kNpnTrialDisabledGroupNamePrefix)) { | 98 } else if (npn_trial_group.starts_with(kNpnTrialDisabledGroupNamePrefix)) { |
| 149 params->enable_npn = false; | 99 params->enable_npn = false; |
| (...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 496 params->origins_to_force_quic_on.insert(net::HostPortPair()); | 446 params->origins_to_force_quic_on.insert(net::HostPortPair()); |
| 497 net::HostPortPair quic_origin = net::HostPortPair::FromString(host_port); | 447 net::HostPortPair quic_origin = net::HostPortPair::FromString(host_port); |
| 498 if (!quic_origin.IsEmpty()) | 448 if (!quic_origin.IsEmpty()) |
| 499 params->origins_to_force_quic_on.insert(quic_origin); | 449 params->origins_to_force_quic_on.insert(quic_origin); |
| 500 } | 450 } |
| 501 } | 451 } |
| 502 } | 452 } |
| 503 | 453 |
| 504 void ParseFieldTrialsAndCommandLineInternal( | 454 void ParseFieldTrialsAndCommandLineInternal( |
| 505 const base::CommandLine& command_line, | 455 const base::CommandLine& command_line, |
| 506 bool is_spdy_allowed_by_policy, | |
| 507 bool is_quic_allowed_by_policy, | 456 bool is_quic_allowed_by_policy, |
| 508 const std::string& quic_user_agent_id, | 457 const std::string& quic_user_agent_id, |
| 509 net::HttpNetworkSession::Params* params) { | 458 net::HttpNetworkSession::Params* params) { |
| 510 // Parameters only controlled by command line. | 459 // Parameters only controlled by command line. |
| 511 if (command_line.HasSwitch(switches::kIgnoreCertificateErrors)) | 460 if (command_line.HasSwitch(switches::kIgnoreCertificateErrors)) |
| 512 params->ignore_certificate_errors = true; | 461 params->ignore_certificate_errors = true; |
| 513 if (command_line.HasSwitch(switches::kTestingFixedHttpPort)) { | 462 if (command_line.HasSwitch(switches::kTestingFixedHttpPort)) { |
| 514 params->testing_fixed_http_port = | 463 params->testing_fixed_http_port = |
| 515 GetSwitchValueAsInt(command_line, switches::kTestingFixedHttpPort); | 464 GetSwitchValueAsInt(command_line, switches::kTestingFixedHttpPort); |
| 516 } | 465 } |
| 517 if (command_line.HasSwitch(switches::kTestingFixedHttpsPort)) { | 466 if (command_line.HasSwitch(switches::kTestingFixedHttpsPort)) { |
| 518 params->testing_fixed_https_port = | 467 params->testing_fixed_https_port = |
| 519 GetSwitchValueAsInt(command_line, switches::kTestingFixedHttpsPort); | 468 GetSwitchValueAsInt(command_line, switches::kTestingFixedHttpsPort); |
| 520 } | 469 } |
| 521 | 470 |
| 522 // Always fetch the field trial groups to ensure they are reported correctly. | 471 // Always fetch the field trial groups to ensure they are reported correctly. |
| 523 // The command line flags will be associated with a group that is reported so | 472 // The command line flags will be associated with a group that is reported so |
| 524 // long as trial is actually queried. | 473 // long as trial is actually queried. |
| 525 | 474 |
| 526 std::string quic_trial_group = | 475 std::string quic_trial_group = |
| 527 base::FieldTrialList::FindFullName(kQuicFieldTrialName); | 476 base::FieldTrialList::FindFullName(kQuicFieldTrialName); |
| 528 VariationParameters quic_trial_params; | 477 VariationParameters quic_trial_params; |
| 529 if (!variations::GetVariationParams(kQuicFieldTrialName, &quic_trial_params)) | 478 if (!variations::GetVariationParams(kQuicFieldTrialName, &quic_trial_params)) |
| 530 quic_trial_params.clear(); | 479 quic_trial_params.clear(); |
| 531 ConfigureQuicParams(command_line, quic_trial_group, quic_trial_params, | 480 ConfigureQuicParams(command_line, quic_trial_group, quic_trial_params, |
| 532 is_quic_allowed_by_policy, quic_user_agent_id, params); | 481 is_quic_allowed_by_policy, quic_user_agent_id, params); |
| 533 | 482 |
| 534 if (!is_spdy_allowed_by_policy) { | 483 std::string http2_trial_group = |
| 535 base::FieldTrial* trial = base::FieldTrialList::Find(kSpdyFieldTrialName); | 484 base::FieldTrialList::FindFullName(kHttp2FieldTrialName); |
| 536 if (trial) | 485 ConfigureHttp2Params(command_line, http2_trial_group, params); |
| 537 trial->Disable(); | |
| 538 } | |
| 539 std::string spdy_trial_group = | |
| 540 base::FieldTrialList::FindFullName(kSpdyFieldTrialName); | |
| 541 VariationParameters spdy_trial_params; | |
| 542 if (!variations::GetVariationParams(kSpdyFieldTrialName, &spdy_trial_params)) | |
| 543 spdy_trial_params.clear(); | |
| 544 ConfigureSpdyParams(command_line, spdy_trial_group, spdy_trial_params, | |
| 545 is_spdy_allowed_by_policy, params); | |
| 546 | 486 |
| 547 const std::string tfo_trial_group = | 487 const std::string tfo_trial_group = |
| 548 base::FieldTrialList::FindFullName(kTCPFastOpenFieldTrialName); | 488 base::FieldTrialList::FindFullName(kTCPFastOpenFieldTrialName); |
| 549 ConfigureTCPFastOpenParams(tfo_trial_group, params); | 489 ConfigureTCPFastOpenParams(tfo_trial_group, params); |
| 550 | 490 |
| 551 std::string npn_trial_group = | 491 std::string npn_trial_group = |
| 552 base::FieldTrialList::FindFullName(kNpnTrialName); | 492 base::FieldTrialList::FindFullName(kNpnTrialName); |
| 553 ConfigureNPNParams(command_line, npn_trial_group, params); | 493 ConfigureNPNParams(command_line, npn_trial_group, params); |
| 554 | 494 |
| 555 std::string priority_dependencies_trial_group = | 495 std::string priority_dependencies_trial_group = |
| 556 base::FieldTrialList::FindFullName(kSpdyDependenciesFieldTrial); | 496 base::FieldTrialList::FindFullName(kSpdyDependenciesFieldTrial); |
| 557 ConfigurePriorityDependencies(priority_dependencies_trial_group, params); | 497 ConfigurePriorityDependencies(priority_dependencies_trial_group, params); |
| 558 } | 498 } |
| 559 | 499 |
| 560 } // anonymous namespace | 500 } // anonymous namespace |
| 561 | 501 |
| 562 namespace network_session_configurator { | 502 namespace network_session_configurator { |
| 563 | 503 |
| 564 void ParseFieldTrials(bool is_spdy_allowed_by_policy, | 504 void ParseFieldTrials(bool is_quic_allowed_by_policy, |
| 565 bool is_quic_allowed_by_policy, | |
| 566 const std::string& quic_user_agent_id, | 505 const std::string& quic_user_agent_id, |
| 567 net::HttpNetworkSession::Params* params) { | 506 net::HttpNetworkSession::Params* params) { |
| 568 const base::CommandLine command_line(base::CommandLine::NO_PROGRAM); | 507 const base::CommandLine command_line(base::CommandLine::NO_PROGRAM); |
| 569 ParseFieldTrialsAndCommandLineInternal( | 508 ParseFieldTrialsAndCommandLineInternal( |
| 570 command_line, is_spdy_allowed_by_policy, is_quic_allowed_by_policy, | 509 command_line, is_quic_allowed_by_policy, quic_user_agent_id, params); |
| 571 quic_user_agent_id, params); | |
| 572 } | 510 } |
| 573 | 511 |
| 574 void ParseFieldTrialsAndCommandLine(bool is_spdy_allowed_by_policy, | 512 void ParseFieldTrialsAndCommandLine(bool is_quic_allowed_by_policy, |
| 575 bool is_quic_allowed_by_policy, | |
| 576 const std::string& quic_user_agent_id, | 513 const std::string& quic_user_agent_id, |
| 577 net::HttpNetworkSession::Params* params) { | 514 net::HttpNetworkSession::Params* params) { |
| 578 const base::CommandLine& command_line = | 515 const base::CommandLine& command_line = |
| 579 *base::CommandLine::ForCurrentProcess(); | 516 *base::CommandLine::ForCurrentProcess(); |
| 580 ParseFieldTrialsAndCommandLineInternal( | 517 ParseFieldTrialsAndCommandLineInternal( |
| 581 command_line, is_spdy_allowed_by_policy, is_quic_allowed_by_policy, | 518 command_line, is_quic_allowed_by_policy, quic_user_agent_id, params); |
| 582 quic_user_agent_id, params); | |
| 583 } | 519 } |
| 584 | 520 |
| 585 } // namespace network_session_configurator | 521 } // namespace network_session_configurator |
| OLD | NEW |