diff options
-rw-r--r-- | chrome/browser/io_thread.cc | 16 | ||||
-rw-r--r-- | chrome/browser/io_thread.h | 2 | ||||
-rw-r--r-- | chrome/browser/io_thread_unittest.cc | 17 | ||||
-rw-r--r-- | chrome/browser/resources/net_internals/quic_view.html | 2 | ||||
-rw-r--r-- | chrome/common/chrome_switches.cc | 2 | ||||
-rw-r--r-- | net/http/http_network_session.cc | 9 | ||||
-rw-r--r-- | net/http/http_network_session.h | 5 | ||||
-rw-r--r-- | net/http/http_stream_factory_impl_job.cc | 2 | ||||
-rw-r--r-- | net/quic/quic_end_to_end_unittest.cc | 4 | ||||
-rw-r--r-- | net/quic/quic_network_transaction_unittest.cc | 16 |
10 files changed, 50 insertions, 25 deletions
diff --git a/chrome/browser/io_thread.cc b/chrome/browser/io_thread.cc index f8e9b01..e6b3fab 100644 --- a/chrome/browser/io_thread.cc +++ b/chrome/browser/io_thread.cc @@ -1154,8 +1154,8 @@ void IOThread::InitializeNetworkSessionParamsFromGlobals( ¶ms->quic_migrate_sessions_on_network_change); globals.quic_migrate_sessions_early.CopyToIfSet( ¶ms->quic_migrate_sessions_early); - globals.origin_to_force_quic_on.CopyToIfSet( - ¶ms->origin_to_force_quic_on); + if (!globals.origins_to_force_quic_on.empty()) + params->origins_to_force_quic_on = globals.origins_to_force_quic_on; params->enable_user_alternate_protocol_ports = globals.enable_user_alternate_protocol_ports; params->enable_token_binding = globals.enable_token_binding; @@ -1343,11 +1343,13 @@ void IOThread::ConfigureQuicGlobals( } if (command_line.HasSwitch(switches::kOriginToForceQuicOn)) { - net::HostPortPair quic_origin = - net::HostPortPair::FromString( - command_line.GetSwitchValueASCII(switches::kOriginToForceQuicOn)); - if (!quic_origin.IsEmpty()) { - globals->origin_to_force_quic_on.set(quic_origin); + std::string origins = + command_line.GetSwitchValueASCII(switches::kOriginToForceQuicOn); + for (const std::string& host_port : base::SplitString( + origins, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL)) { + net::HostPortPair quic_origin = net::HostPortPair::FromString(host_port); + if (!quic_origin.IsEmpty()) + globals->origins_to_force_quic_on.insert(quic_origin); } } } diff --git a/chrome/browser/io_thread.h b/chrome/browser/io_thread.h index 6cb2e07..f3d6e14 100644 --- a/chrome/browser/io_thread.h +++ b/chrome/browser/io_thread.h @@ -236,7 +236,7 @@ class IOThread : public content::BrowserThreadDelegate { net::QuicTagVector quic_connection_options; Optional<std::string> quic_user_agent_id; Optional<net::QuicVersionVector> quic_supported_versions; - Optional<net::HostPortPair> origin_to_force_quic_on; + std::set<net::HostPortPair> origins_to_force_quic_on; Optional<bool> quic_close_sessions_on_ip_change; Optional<int> quic_idle_connection_timeout_seconds; Optional<bool> quic_disable_preconnect_if_0rtt; diff --git a/chrome/browser/io_thread_unittest.cc b/chrome/browser/io_thread_unittest.cc index abf93c2..aee5250 100644 --- a/chrome/browser/io_thread_unittest.cc +++ b/chrome/browser/io_thread_unittest.cc @@ -603,6 +603,23 @@ TEST_F(IOThreadTest, QuicDelayTcpConnection) { EXPECT_TRUE(params.quic_delay_tcp_race); } +TEST_F(IOThreadTest, QuicOriginsToForceQuicOn) { + command_line_.AppendSwitch("enable-quic"); + command_line_.AppendSwitchASCII("origin-to-force-quic-on", + "www.example.com:443, www.example.org:443"); + + ConfigureQuicGlobals(); + net::HttpNetworkSession::Params params; + InitializeNetworkSessionParams(¶ms); + EXPECT_EQ(2u, params.origins_to_force_quic_on.size()); + EXPECT_TRUE( + ContainsKey(params.origins_to_force_quic_on, + net::HostPortPair::FromString("www.example.com:443"))); + EXPECT_TRUE( + ContainsKey(params.origins_to_force_quic_on, + net::HostPortPair::FromString("www.example.org:443"))); +} + TEST_F(IOThreadTest, QuicWhitelistFromCommandLinet) { command_line_.AppendSwitch("enable-quic"); command_line_.AppendSwitchASCII("quic-host-whitelist", diff --git a/chrome/browser/resources/net_internals/quic_view.html b/chrome/browser/resources/net_internals/quic_view.html index 399140c..ddd8b40 100644 --- a/chrome/browser/resources/net_internals/quic_view.html +++ b/chrome/browser/resources/net_internals/quic_view.html @@ -1,7 +1,7 @@ <div id=quic-view-tab-content class=content-box> <ul style='margin-top:0'> <li>QUIC Enabled: <span jscontent="!!quic_enabled"></span></li> - <li>Origin To Force QUIC On: <span jscontent="origin_to_force_quic_on"></span></li> + <li>Origins To Force QUIC On: <span jscontent="origins_to_force_quic_on"></span></li> <li>Connection options: <span jscontent="connection_options"></span></li> <li>Consistent Port Selection Enabled: <span jscontent="!!enable_quic_port_selection"></span></li> <li>Load Server Info Timeout Multiplier: <span jscontent="$this.load_server_info_timeout_srtt_multiplier"></span></li> diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc index 88cbdc7..040608a 100644 --- a/chrome/common/chrome_switches.cc +++ b/chrome/common/chrome_switches.cc @@ -771,7 +771,7 @@ const char kNumPacThreads[] = "num-pac-threads"; // Launches URL in new browser window. const char kOpenInNewWindow[] = "new-window"; -// Force use of QUIC for requests to the specified origin. +// Specifies a comma separated list of host/port pairs to force use of QUIC. const char kOriginToForceQuicOn[] = "origin-to-force-quic-on"; // The time that a new chrome process which is delegating to an already running diff --git a/net/http/http_network_session.cc b/net/http/http_network_session.cc index 053509a..748f27e 100644 --- a/net/http/http_network_session.cc +++ b/net/http/http_network_session.cc @@ -317,8 +317,13 @@ scoped_ptr<base::Value> HttpNetworkSession::QuicInfoToValue() const { connection_options->AppendString("'" + QuicUtils::TagToString(*it) + "'"); } dict->Set("connection_options", std::move(connection_options)); - dict->SetString("origin_to_force_quic_on", - params_.origin_to_force_quic_on.ToString()); + + scoped_ptr<base::ListValue> origins_to_force_quic_on(new base::ListValue); + for (const auto& origin : params_.origins_to_force_quic_on) { + origins_to_force_quic_on->AppendString("'" + origin.ToString() + "'"); + } + dict->Set("origins_to_force_quic_on", std::move(origins_to_force_quic_on)); + dict->SetDouble("load_server_info_timeout_srtt_multiplier", params_.quic_load_server_info_timeout_srtt_multiplier); dict->SetBoolean("enable_connection_racing", diff --git a/net/http/http_network_session.h b/net/http/http_network_session.h index a636308..c779539 100644 --- a/net/http/http_network_session.h +++ b/net/http/http_network_session.h @@ -149,8 +149,9 @@ class NET_EXPORT HttpNetworkSession // Maximum number of server configs that are to be stored in // HttpServerProperties, instead of the disk cache. size_t quic_max_server_configs_stored_in_properties; - // If not empty, QUIC will be used for all connections to this origin. - HostPortPair origin_to_force_quic_on; + // If not empty, QUIC will be used for all connections to the set of + // origins in |origins_to_force_quic_on|. + std::set<HostPortPair> origins_to_force_quic_on; // Source of time for QUIC connections. Will be owned by QuicStreamFactory. QuicClock* quic_clock; // Source of entropy for QUIC connections. diff --git a/net/http/http_stream_factory_impl_job.cc b/net/http/http_stream_factory_impl_job.cc index f4cc08c..24f888b 100644 --- a/net/http/http_stream_factory_impl_job.cc +++ b/net/http/http_stream_factory_impl_job.cc @@ -899,7 +899,7 @@ int HttpStreamFactoryImpl::Job::DoResolveProxyComplete(int result) { bool HttpStreamFactoryImpl::Job::ShouldForceQuic() const { return session_->params().enable_quic && - session_->params().origin_to_force_quic_on.Equals(server_) && + ContainsKey(session_->params().origins_to_force_quic_on, server_) && proxy_info_.is_direct() && origin_url_.SchemeIs("https"); } diff --git a/net/quic/quic_end_to_end_unittest.cc b/net/quic/quic_end_to_end_unittest.cc index 9ec8731..7441c7f 100644 --- a/net/quic/quic_end_to_end_unittest.cc +++ b/net/quic/quic_end_to_end_unittest.cc @@ -159,8 +159,8 @@ class QuicEndToEndTest : public ::testing::TestWithParam<TestParams> { // To simplify the test, and avoid the race with the HTTP request, we force // QUIC for these requests. - params_.origin_to_force_quic_on = - HostPortPair::FromString("test.example.com:443"); + params_.origins_to_force_quic_on.insert( + HostPortPair::FromString("test.example.com:443")); transaction_factory_.reset(new TestTransactionFactory(params_)); } diff --git a/net/quic/quic_network_transaction_unittest.cc b/net/quic/quic_network_transaction_unittest.cc index d4098c5..6b174cc 100644 --- a/net/quic/quic_network_transaction_unittest.cc +++ b/net/quic/quic_network_transaction_unittest.cc @@ -621,8 +621,8 @@ INSTANTIATE_TEST_CASE_P(Version, ::testing::ValuesIn(QuicSupportedVersions())); TEST_P(QuicNetworkTransactionTest, ForceQuic) { - params_.origin_to_force_quic_on = - HostPortPair::FromString("mail.example.org:443"); + params_.origins_to_force_quic_on.insert( + HostPortPair::FromString("mail.example.org:443")); MockQuicData mock_quic_data; mock_quic_data.AddWrite( @@ -809,8 +809,8 @@ TEST_P(QuicNetworkTransactionTest, AlternativeServicesDifferentHost) { } TEST_P(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) { - params_.origin_to_force_quic_on = - HostPortPair::FromString("mail.example.org:443"); + params_.origins_to_force_quic_on.insert( + HostPortPair::FromString("mail.example.org:443")); MockQuicData mock_quic_data1; mock_quic_data1.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED); @@ -841,8 +841,8 @@ TEST_P(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) { TEST_P(QuicNetworkTransactionTest, DoNotForceQuicForHttps) { // Attempt to "force" quic on 443, which will not be honored. - params_.origin_to_force_quic_on = - HostPortPair::FromString("www.google.com:443"); + params_.origins_to_force_quic_on.insert( + HostPortPair::FromString("www.google.com:443")); MockRead http_reads[] = { MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"), @@ -2236,8 +2236,8 @@ TEST_P(QuicNetworkTransactionTest, SecureResourceOverSecureQuic) { } TEST_P(QuicNetworkTransactionTest, QuicUpload) { - params_.origin_to_force_quic_on = - HostPortPair::FromString("mail.example.org:443"); + params_.origins_to_force_quic_on.insert( + HostPortPair::FromString("mail.example.org:443")); MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; MockWrite writes[] = {MockWrite(SYNCHRONOUS, ERR_FAILED, 1)}; |