summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrtenneti <rtenneti@chromium.org>2016-03-21 13:26:57 -0700
committerCommit bot <commit-bot@chromium.org>2016-03-21 20:27:47 +0000
commit8a2f463d3726f944f5ec279664b25118fd3ccf3c (patch)
tree9c2f8731b7618b5bb03dfce1f105e7f53a35dcda
parentc96b751d4f1c02151b5e705d1fb216b06a864893 (diff)
downloadchromium_src-8a2f463d3726f944f5ec279664b25118fd3ccf3c.zip
chromium_src-8a2f463d3726f944f5ec279664b25118fd3ccf3c.tar.gz
chromium_src-8a2f463d3726f944f5ec279664b25118fd3ccf3c.tar.bz2
QUIC - extend origin-to-force-quic-on command line option to accept list
of host_ports for which QUIC will be forced. A TCP job wouldn't even be started for these origins. R=rch@chromium.org, eroman@chromium.org, Review URL: https://codereview.chromium.org/1808303005 Cr-Commit-Position: refs/heads/master@{#382370}
-rw-r--r--chrome/browser/io_thread.cc16
-rw-r--r--chrome/browser/io_thread.h2
-rw-r--r--chrome/browser/io_thread_unittest.cc17
-rw-r--r--chrome/browser/resources/net_internals/quic_view.html2
-rw-r--r--chrome/common/chrome_switches.cc2
-rw-r--r--net/http/http_network_session.cc9
-rw-r--r--net/http/http_network_session.h5
-rw-r--r--net/http/http_stream_factory_impl_job.cc2
-rw-r--r--net/quic/quic_end_to_end_unittest.cc4
-rw-r--r--net/quic/quic_network_transaction_unittest.cc16
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(
&params->quic_migrate_sessions_on_network_change);
globals.quic_migrate_sessions_early.CopyToIfSet(
&params->quic_migrate_sessions_early);
- globals.origin_to_force_quic_on.CopyToIfSet(
- &params->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(&params);
+ 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)};