diff options
author | mef <mef@chromium.org> | 2016-02-09 12:14:23 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-02-09 20:15:32 +0000 |
commit | c5da5713830e1c6ad09c75638e06f018396ca40d (patch) | |
tree | 5222c55a71bce4126118b47a3f0feefd51ff508f | |
parent | 11565e0ec4c1c02bddaf1ed8ac726124e5c61400 (diff) | |
download | chromium_src-c5da5713830e1c6ad09c75638e06f018396ca40d.zip chromium_src-c5da5713830e1c6ad09c75638e06f018396ca40d.tar.gz chromium_src-c5da5713830e1c6ad09c75638e06f018396ca40d.tar.bz2 |
[Cronet] Expose quic_user_agent_id and quic_prefer_aes config options.
- QUIC will soon require that user agent id field is non-empty, but normal User-Agent request header is too rich and verbose to be used for this purpose. The app can override default value using 'user_agent_id' quic experimental option.
- prefer_aes experimental option is needed to experiment with performance of using AES instead of ChaCha20.
BUG=575771
Review URL: https://codereview.chromium.org/1665503002
Cr-Commit-Position: refs/heads/master@{#374438}
12 files changed, 98 insertions, 15 deletions
diff --git a/components/cronet/android/BUILD.gn b/components/cronet/android/BUILD.gn index b1a3469..34b4cbb 100644 --- a/components/cronet/android/BUILD.gn +++ b/components/cronet/android/BUILD.gn @@ -411,6 +411,7 @@ shared_library("cronet_tests") { deps = [ ":cronet_static", ":cronet_tests_jni_headers", + ":cronet_version_header", "//base", "//base:i18n", "//net", @@ -419,6 +420,8 @@ shared_library("cronet_tests") { "//third_party/icu", ] + include_dirs = [ _cronet_version_header_include_dir ] + if (cronet_enable_data_reduction_proxy_support) { deps += [ "//components/data_reduction_proxy/core/browser" ] } diff --git a/components/cronet/android/api/src/org/chromium/net/CronetEngine.java b/components/cronet/android/api/src/org/chromium/net/CronetEngine.java index a07ae3c..a249839 100644 --- a/components/cronet/android/api/src/org/chromium/net/CronetEngine.java +++ b/components/cronet/android/api/src/org/chromium/net/CronetEngine.java @@ -131,8 +131,8 @@ public abstract class CronetEngine { } /** - * Constructs a User-Agent string including Cronet version, and - * application name and version. + * Constructs a User-Agent string including application name and version, + * system build version, model and id, and Cronet version. * * @return User-Agent string. */ @@ -240,7 +240,8 @@ public abstract class CronetEngine { /** * Sets whether <a href="https://www.chromium.org/quic">QUIC</a> protocol - * is enabled. Defaults to disabled. + * is enabled. Defaults to disabled. If QUIC is enabled, then QUIC User Agent Id + * containing application name and Cronet version is sent to the server. * @param value {@code true} to enable QUIC, {@code false} to disable. * @return the builder to facilitate chaining. */ @@ -254,6 +255,16 @@ public abstract class CronetEngine { } /** + * Constructs default QUIC User Agent Id string including application name + * and Cronet version. Returns empty string if QUIC is not enabled. + * + * @return QUIC User Agent ID string. + */ + String getDefaultQuicUserAgentId() { + return mQuicEnabled ? UserAgent.getQuicUserAgentIdFrom(mContext) : ""; + } + + /** * Sets whether <a href="https://tools.ietf.org/html/rfc7540">HTTP/2</a> * protocol is enabled. Defaults to enabled. * @param value {@code true} to enable HTTP/2, {@code false} to disable. diff --git a/components/cronet/android/api/src/org/chromium/net/UserAgent.java b/components/cronet/android/api/src/org/chromium/net/UserAgent.java index a0ce85f..5837473 100644 --- a/components/cronet/android/api/src/org/chromium/net/UserAgent.java +++ b/components/cronet/android/api/src/org/chromium/net/UserAgent.java @@ -29,8 +29,8 @@ public final class UserAgent { } /** - * Constructs a User-Agent string including Cronet version, and application - * name and version. + * Constructs a User-Agent string including application name and version, + * system build version, model and Id, and Cronet version. * @param context the context to fetch the application name and version * from. * @return User-Agent string. @@ -69,6 +69,23 @@ public final class UserAgent { return builder.toString(); } + /** + * Constructs default QUIC User Agent Id string including application name + * and Cronet version. + * @param context the context to fetch the application name from. + * @return User-Agent string. + */ + static String getQuicUserAgentIdFrom(Context context) { + StringBuilder builder = new StringBuilder(); + + // Application name and cronet version. + builder.append(context.getPackageName()); + builder.append(" Cronet/"); + builder.append(Version.CRONET_VERSION); + + return builder.toString(); + } + private static int versionFromContext(Context context) { synchronized (sLock) { if (sVersionCode == VERSION_CODE_UNINITIALIZED) { diff --git a/components/cronet/android/cronet_url_request_context_adapter.cc b/components/cronet/android/cronet_url_request_context_adapter.cc index 49ba22a..776fec7 100644 --- a/components/cronet/android/cronet_url_request_context_adapter.cc +++ b/components/cronet/android/cronet_url_request_context_adapter.cc @@ -687,6 +687,7 @@ static jlong CreateRequestContextConfig( const JavaParamRef<jstring>& juser_agent, const JavaParamRef<jstring>& jstorage_path, jboolean jquic_enabled, + const JavaParamRef<jstring>& jquic_default_user_agent_id, jboolean jhttp2_enabled, jboolean jsdch_enabled, const JavaParamRef<jstring>& jdata_reduction_proxy_key, @@ -699,7 +700,9 @@ static jlong CreateRequestContextConfig( const JavaParamRef<jstring>& jexperimental_quic_connection_options, jlong jmock_cert_verifier) { return reinterpret_cast<jlong>(new URLRequestContextConfig( - jquic_enabled, jhttp2_enabled, jsdch_enabled, + jquic_enabled, + base::android::ConvertJavaStringToUTF8(env, jquic_default_user_agent_id), + jhttp2_enabled, jsdch_enabled, static_cast<URLRequestContextConfig::HttpCacheType>(jhttp_cache_mode), jhttp_cache_max_size, jdisable_cache, base::android::ConvertJavaStringToUTF8(env, jstorage_path), diff --git a/components/cronet/android/java/src/org/chromium/net/CronetUrlRequestContext.java b/components/cronet/android/java/src/org/chromium/net/CronetUrlRequestContext.java index 4d935b7..ae28ecb 100644 --- a/components/cronet/android/java/src/org/chromium/net/CronetUrlRequestContext.java +++ b/components/cronet/android/java/src/org/chromium/net/CronetUrlRequestContext.java @@ -107,8 +107,9 @@ class CronetUrlRequestContext extends CronetEngine { static long createNativeUrlRequestContextConfig(CronetEngine.Builder builder) { final long urlRequestContextConfig = nativeCreateRequestContextConfig( builder.getUserAgent(), builder.storagePath(), builder.quicEnabled(), - builder.http2Enabled(), builder.sdchEnabled(), builder.dataReductionProxyKey(), - builder.dataReductionProxyPrimaryProxy(), builder.dataReductionProxyFallbackProxy(), + builder.getDefaultQuicUserAgentId(), builder.http2Enabled(), builder.sdchEnabled(), + builder.dataReductionProxyKey(), builder.dataReductionProxyPrimaryProxy(), + builder.dataReductionProxyFallbackProxy(), builder.dataReductionProxySecureProxyCheckUrl(), builder.cacheDisabled(), builder.httpCacheMode(), builder.httpCacheMaxSize(), builder.experimentalOptions(), builder.mockCertVerifier()); @@ -465,11 +466,11 @@ class CronetUrlRequestContext extends CronetEngine { // Native methods are implemented in cronet_url_request_context_adapter.cc. private static native long nativeCreateRequestContextConfig(String userAgent, - String storagePath, boolean quicEnabled, boolean http2Enabled, boolean sdchEnabled, - String dataReductionProxyKey, String dataReductionProxyPrimaryProxy, - String dataReductionProxyFallbackProxy, String dataReductionProxySecureProxyCheckUrl, - boolean disableCache, int httpCacheMode, long httpCacheMaxSize, - String experimentalOptions, long mockCertVerifier); + String storagePath, boolean quicEnabled, String quicUserAgentId, boolean http2Enabled, + boolean sdchEnabled, String dataReductionProxyKey, + String dataReductionProxyPrimaryProxy, String dataReductionProxyFallbackProxy, + String dataReductionProxySecureProxyCheckUrl, boolean disableCache, int httpCacheMode, + long httpCacheMaxSize, String experimentalOptions, long mockCertVerifier); private static native void nativeAddQuicHint( long urlRequestContextConfig, String host, int port, int alternatePort); diff --git a/components/cronet/android/test/cronet_url_request_context_config_test.cc b/components/cronet/android/test/cronet_url_request_context_config_test.cc index c879fe9..d3156c0 100644 --- a/components/cronet/android/test/cronet_url_request_context_config_test.cc +++ b/components/cronet/android/test/cronet_url_request_context_config_test.cc @@ -11,6 +11,7 @@ #include "base/android/scoped_java_ref.h" #include "base/logging.h" #include "components/cronet/url_request_context_config.h" +#include "components/cronet/version.h" #include "jni/CronetUrlRequestContextTest_jni.h" namespace cronet { @@ -32,6 +33,8 @@ static void VerifyUrlRequestContextConfig( CHECK_EQ((*config->quic_hints.begin())->host, "example.com"); CHECK_EQ((*config->quic_hints.begin())->port, 12); CHECK_EQ((*config->quic_hints.begin())->alternate_port, 34); + CHECK_NE(config->quic_user_agent_id.find("Cronet/" CRONET_VERSION), + std::string::npos); CHECK_EQ(config->load_disable_cache, false); CHECK_EQ(config->http_cache, URLRequestContextConfig::HttpCacheType::MEMORY); CHECK_EQ(config->http_cache_max_size, 54321); @@ -49,4 +52,4 @@ bool RegisterCronetUrlRequestContextConfigTest(JNIEnv* env) { return RegisterNativesImpl(env); } -} // namespace cronet
\ No newline at end of file +} // namespace cronet diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/QuicTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/QuicTest.java index 655c2f3..45369d3 100644 --- a/components/cronet/android/test/javatests/src/org/chromium/net/QuicTest.java +++ b/components/cronet/android/test/javatests/src/org/chromium/net/QuicTest.java @@ -48,7 +48,7 @@ public class QuicTest extends CronetTestBase { .put("packet_loss_threshold", 0.5) .put("idle_connection_timeout_seconds", 300) .put("close_sessions_on_ip_change", true) - .put("migrate_sessions_on_network_change", true); + .put("migrate_sessions_on_network_change", false); JSONObject experimentalOptions = new JSONObject().put("QUIC", quicParams); mBuilder.setExperimentalOptions(experimentalOptions.toString()); diff --git a/components/cronet/url_request_context_config.cc b/components/cronet/url_request_context_config.cc index 4627628..49af1af 100644 --- a/components/cronet/url_request_context_config.cc +++ b/components/cronet/url_request_context_config.cc @@ -41,6 +41,8 @@ const char kQuicHostWhitelist[] = "host_whitelist"; const char kQuicCloseSessionsOnIpChange[] = "close_sessions_on_ip_change"; const char kQuicMigrateSessionsOnNetworkChange[] = "migrate_sessions_on_network_change"; +const char kQuicPreferAes[] = "prefer_aes"; +const char kQuicUserAgentId[] = "user_agent_id"; // AsyncDNS experiment dictionary name. const char kAsyncDnsFieldTrialName[] = "AsyncDNS"; @@ -148,6 +150,16 @@ void ParseAndSetExperimentalOptions( context_builder->set_quic_migrate_sessions_on_network_change( quic_migrate_sessions_on_network_change); } + + bool quic_prefer_aes = false; + if (quic_args->GetBoolean(kQuicPreferAes, &quic_prefer_aes)) { + context_builder->set_quic_prefer_aes(quic_prefer_aes); + } + + std::string quic_user_agent_id; + if (quic_args->GetString(kQuicUserAgentId, &quic_user_agent_id)) { + context_builder->set_quic_user_agent_id(quic_user_agent_id); + } } const base::DictionaryValue* async_dns_args = nullptr; @@ -187,6 +199,7 @@ URLRequestContextConfig::Pkp::~Pkp() {} URLRequestContextConfig::URLRequestContextConfig( bool enable_quic, + const std::string& quic_user_agent_id, bool enable_spdy, bool enable_sdch, HttpCacheType http_cache, @@ -201,6 +214,7 @@ URLRequestContextConfig::URLRequestContextConfig( const std::string& data_reduction_secure_proxy_check_url, scoped_ptr<net::CertVerifier> mock_cert_verifier) : enable_quic(enable_quic), + quic_user_agent_id(quic_user_agent_id), enable_spdy(enable_spdy), enable_sdch(enable_sdch), http_cache(http_cache), @@ -239,6 +253,8 @@ void URLRequestContextConfig::ConfigureURLRequestContextBuilder( context_builder->set_user_agent(user_agent); context_builder->SetSpdyAndQuicEnabled(enable_spdy, enable_quic); context_builder->set_sdch_enabled(enable_sdch); + if (enable_quic) + context_builder->set_quic_user_agent_id(quic_user_agent_id); ParseAndSetExperimentalOptions(experimental_options, context_builder, net_log); diff --git a/components/cronet/url_request_context_config.h b/components/cronet/url_request_context_config.h index 29e1c85..4031447 100644 --- a/components/cronet/url_request_context_config.h +++ b/components/cronet/url_request_context_config.h @@ -73,6 +73,8 @@ struct URLRequestContextConfig { URLRequestContextConfig( // Enable QUIC. bool enable_quic, + // QUIC User Agent ID. + const std::string& quic_user_agent_id, // Enable SPDY. bool enable_spdy, // Enable SDCH. @@ -109,6 +111,8 @@ struct URLRequestContextConfig { // Enable QUIC. const bool enable_quic; + // QUIC User Agent ID. + const std::string quic_user_agent_id; // Enable SPDY. const bool enable_spdy; // Enable SDCH. diff --git a/components/cronet/url_request_context_config_unittest.cc b/components/cronet/url_request_context_config_unittest.cc index f309e25..b140c34 100644 --- a/components/cronet/url_request_context_config_unittest.cc +++ b/components/cronet/url_request_context_config_unittest.cc @@ -19,6 +19,8 @@ TEST(URLRequestContextConfigTest, SetQuicExperimentalOptions) { URLRequestContextConfig config( // Enable QUIC. true, + // QUIC User Agent ID. + "Default QUIC User Agent ID", // Enable SPDY. true, // Enable SDCH. @@ -38,6 +40,8 @@ TEST(URLRequestContextConfigTest, SetQuicExperimentalOptions) { "{\"QUIC\":{\"max_server_configs_stored_in_properties\":2," "\"delay_tcp_race\":true," "\"max_number_of_lossy_connections\":10," + "\"prefer_aes\":true," + "\"user_agent_id\":\"Custom QUIC UAID\"," "\"packet_loss_threshold\":0.5," "\"idle_connection_timeout_seconds\":300," "\"close_sessions_on_ip_change\":true," @@ -71,12 +75,18 @@ TEST(URLRequestContextConfigTest, SetQuicExperimentalOptions) { quic_connection_options.push_back(net::kREJ); EXPECT_EQ(quic_connection_options, params->quic_connection_options); + // Check Custom QUIC User Agent Id. + EXPECT_EQ("Custom QUIC UAID", params->quic_user_agent_id); + // Check max_server_configs_stored_in_properties. EXPECT_EQ(2u, params->quic_max_server_configs_stored_in_properties); // Check delay_tcp_race. EXPECT_TRUE(params->quic_delay_tcp_race); + // Check prefer_aes. + EXPECT_TRUE(params->quic_prefer_aes); + // Check max_number_of_lossy_connections and packet_loss_threshold. EXPECT_EQ(10, params->quic_max_number_of_lossy_connections); EXPECT_FLOAT_EQ(0.5f, params->quic_packet_loss_threshold); diff --git a/net/url_request/url_request_context_builder.cc b/net/url_request/url_request_context_builder.cc index 156c675..769932e 100644 --- a/net/url_request/url_request_context_builder.cc +++ b/net/url_request/url_request_context_builder.cc @@ -186,6 +186,7 @@ URLRequestContextBuilder::HttpNetworkSessionParams::HttpNetworkSessionParams() quic_max_server_configs_stored_in_properties(0), quic_delay_tcp_race(false), quic_max_number_of_lossy_connections(0), + quic_prefer_aes(false), quic_packet_loss_threshold(1.0f), quic_idle_connection_timeout_seconds(kIdleConnectionTimeoutSeconds), quic_close_sessions_on_ip_change(false), @@ -416,6 +417,10 @@ scoped_ptr<URLRequestContext> URLRequestContextBuilder::Build() { http_network_session_params_.quic_close_sessions_on_ip_change; network_session_params.quic_migrate_sessions_on_network_change = http_network_session_params_.quic_migrate_sessions_on_network_change; + network_session_params.quic_user_agent_id = + http_network_session_params_.quic_user_agent_id; + network_session_params.quic_prefer_aes = + http_network_session_params_.quic_prefer_aes; storage->set_http_network_session( make_scoped_ptr(new HttpNetworkSession(network_session_params))); diff --git a/net/url_request/url_request_context_builder.h b/net/url_request/url_request_context_builder.h index 4876ea2..6fdaf36 100644 --- a/net/url_request/url_request_context_builder.h +++ b/net/url_request/url_request_context_builder.h @@ -89,10 +89,12 @@ class NET_EXPORT URLRequestContextBuilder { bool parse_alternative_services; bool enable_alternative_service_with_different_host; bool enable_quic; + std::string quic_user_agent_id; int quic_max_server_configs_stored_in_properties; bool quic_delay_tcp_race; int quic_max_number_of_lossy_connections; std::unordered_set<std::string> quic_host_whitelist; + bool quic_prefer_aes; float quic_packet_loss_threshold; int quic_idle_connection_timeout_seconds; QuicTagVector quic_connection_options; @@ -200,6 +202,10 @@ class NET_EXPORT URLRequestContextBuilder { quic_connection_options; } + void set_quic_user_agent_id(const std::string& quic_user_agent_id) { + http_network_session_params_.quic_user_agent_id = quic_user_agent_id; + } + void set_quic_max_server_configs_stored_in_properties( int quic_max_server_configs_stored_in_properties) { http_network_session_params_.quic_max_server_configs_stored_in_properties = @@ -244,6 +250,10 @@ class NET_EXPORT URLRequestContextBuilder { quic_migrate_sessions_on_network_change; } + void set_quic_prefer_aes(bool quic_prefer_aes) { + http_network_session_params_.quic_prefer_aes = quic_prefer_aes; + } + void set_throttling_enabled(bool throttling_enabled) { throttling_enabled_ = throttling_enabled; } |