blob: b57653a3b77aea99af3d6904e8f0ee6f2e0a37fd [file] [log] [blame]
[email protected]cf4cae32014-05-27 00:39:101// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/http/http_network_session.h"
6
xunjielid5debfc2017-02-24 15:55:497#include <inttypes.h>
8
[email protected]cf4cae32014-05-27 00:39:109#include <utility>
10
vitalybukabfe0e4272015-12-03 01:51:4211#include "base/atomic_sequence_num.h"
[email protected]cf4cae32014-05-27 00:39:1012#include "base/compiler_specific.h"
13#include "base/debug/stack_trace.h"
14#include "base/logging.h"
hajimehoshi8156e7c2016-09-29 06:17:5215#include "base/memory/memory_coordinator_client_registry.h"
avifceb32f62016-10-07 16:30:5216#include "base/memory/ptr_util.h"
michaeln3e5bced2015-02-09 22:58:2317#include "base/profiler/scoped_tracker.h"
vitalybukabfe0e4272015-12-03 01:51:4218#include "base/strings/string_number_conversions.h"
[email protected]cf4cae32014-05-27 00:39:1019#include "base/strings/string_util.h"
xunjieli9f8c5fb52016-12-07 22:59:3320#include "base/strings/stringprintf.h"
21#include "base/trace_event/memory_allocator_dump.h"
xunjielif5267de2017-01-20 21:18:5722#include "base/trace_event/memory_dump_request_args.h"
xunjieli9f8c5fb52016-12-07 22:59:3323#include "base/trace_event/process_memory_dump.h"
[email protected]cf4cae32014-05-27 00:39:1024#include "base/values.h"
rdsmithbf8c3c12016-11-18 18:16:2425#include "net/base/network_throttle_manager_impl.h"
[email protected]cf4cae32014-05-27 00:39:1026#include "net/http/http_auth_handler_factory.h"
27#include "net/http/http_response_body_drainer.h"
28#include "net/http/http_stream_factory_impl.h"
29#include "net/http/url_security_manager.h"
30#include "net/proxy/proxy_service.h"
rch223465c2016-12-08 21:17:2931#include "net/quic/chromium/quic_crypto_client_stream_factory.h"
rch675757b2016-07-29 16:40:1132#include "net/quic/chromium/quic_stream_factory.h"
rchd4db7c152016-07-29 21:58:1233#include "net/quic/core/crypto/quic_random.h"
vasilvv28270e8f2016-12-01 21:38:0934#include "net/quic/core/quic_packets.h"
mpw94250b82016-11-19 18:13:3035#include "net/quic/core/quic_tag.h"
rchd4db7c152016-07-29 21:58:1236#include "net/quic/core/quic_utils.h"
rch799bbe82016-12-06 15:30:0937#include "net/quic/platform/impl/quic_chromium_clock.h"
[email protected]cf4cae32014-05-27 00:39:1038#include "net/socket/client_socket_factory.h"
39#include "net/socket/client_socket_pool_manager_impl.h"
40#include "net/socket/next_proto.h"
bnc1e757502014-12-13 02:20:1641#include "net/socket/ssl_client_socket.h"
[email protected]cf4cae32014-05-27 00:39:1042#include "net/spdy/spdy_session_pool.h"
43
ttuttle859dc7a2015-04-23 19:42:2944namespace net {
45
[email protected]cf4cae32014-05-27 00:39:1046namespace {
47
vitalybukabfe0e4272015-12-03 01:51:4248base::StaticAtomicSequenceNumber g_next_shard_id;
49
ttuttle859dc7a2015-04-23 19:42:2950ClientSocketPoolManager* CreateSocketPoolManager(
51 HttpNetworkSession::SocketPoolType pool_type,
vitalybukabfe0e4272015-12-03 01:51:4252 const HttpNetworkSession::Params& params,
53 const std::string& ssl_session_cache_shard) {
[email protected]cf4cae32014-05-27 00:39:1054 // TODO(yutak): Differentiate WebSocket pool manager and allow more
55 // simultaneous connections for WebSockets.
ttuttle859dc7a2015-04-23 19:42:2956 return new ClientSocketPoolManagerImpl(
57 params.net_log,
58 params.client_socket_factory ? params.client_socket_factory
59 : ClientSocketFactory::GetDefaultFactory(),
tbansal7b403bcc2016-04-13 22:33:2160 params.socket_performance_watcher_factory, params.host_resolver,
61 params.cert_verifier, params.channel_id_service,
eranm6571b2b2014-12-03 15:53:2362 params.transport_security_state, params.cert_transparency_verifier,
estark6f9b3d82016-01-12 21:37:0563 params.ct_policy_enforcer, ssl_session_cache_shard,
rsleevif020edc2015-03-16 19:31:2464 params.ssl_config_service, pool_type);
[email protected]cf4cae32014-05-27 00:39:1065}
66
67} // unnamed namespace
68
bnc8f0f3b62015-04-08 04:37:2369// The maximum receive window sizes for HTTP/2 sessions and streams.
Avi Drissman13fc8932015-12-20 04:40:4670const int32_t kSpdySessionMaxRecvWindowSize = 15 * 1024 * 1024; // 15 MB
71const int32_t kSpdyStreamMaxRecvWindowSize = 6 * 1024 * 1024; // 6 MB
rche713c1792015-05-07 01:39:1872// QUIC's socket receive buffer size.
73// We should adaptively set this buffer size, but for now, we'll use a size
74// that seems large enough to receive data at line rate for most connections,
75// and does not consume "too much" memory.
Avi Drissman13fc8932015-12-20 04:40:4676const int32_t kQuicSocketReceiveBufferSize = 1024 * 1024; // 1MB
bnc8f0f3b62015-04-08 04:37:2377
bnc3171a2432016-12-28 18:40:2678namespace {
79
80// Keep all HTTP2 parameters in |http2_settings|, even the ones that are not
81// implemented, to be sent to the server.
82// Set default values for settings that |http2_settings| does not specify.
83SettingsMap AddDefaultHttp2Settings(SettingsMap http2_settings) {
84 // Set default values only if |http2_settings| does not have
85 // a value set for given setting.
86 SettingsMap::iterator it = http2_settings.find(SETTINGS_HEADER_TABLE_SIZE);
87 if (it == http2_settings.end())
88 http2_settings[SETTINGS_HEADER_TABLE_SIZE] = kSpdyMaxHeaderTableSize;
89
90 it = http2_settings.find(SETTINGS_MAX_CONCURRENT_STREAMS);
91 if (it == http2_settings.end())
92 http2_settings[SETTINGS_MAX_CONCURRENT_STREAMS] =
93 kSpdyMaxConcurrentPushedStreams;
94
95 it = http2_settings.find(SETTINGS_INITIAL_WINDOW_SIZE);
96 if (it == http2_settings.end())
97 http2_settings[SETTINGS_INITIAL_WINDOW_SIZE] = kSpdyStreamMaxRecvWindowSize;
98
99 return http2_settings;
100}
101
102} // unnamed namespace
103
[email protected]cf4cae32014-05-27 00:39:10104HttpNetworkSession::Params::Params()
pmarko6ab8be242017-01-11 11:02:55105 : client_socket_factory(nullptr),
106 host_resolver(nullptr),
107 cert_verifier(nullptr),
108 channel_id_service(nullptr),
109 transport_security_state(nullptr),
110 cert_transparency_verifier(nullptr),
111 ct_policy_enforcer(nullptr),
112 proxy_service(nullptr),
113 ssl_config_service(nullptr),
114 http_auth_handler_factory(nullptr),
115 net_log(nullptr),
116 host_mapping_rules(nullptr),
117 socket_performance_watcher_factory(nullptr),
[email protected]cf4cae32014-05-27 00:39:10118 ignore_certificate_errors(false),
119 testing_fixed_http_port(0),
120 testing_fixed_https_port(0),
jrif9b4bec2014-09-15 15:46:54121 enable_tcp_fast_open_for_ssl(false),
[email protected]cf4cae32014-05-27 00:39:10122 enable_spdy_ping_based_connection_checking(true),
bncefcd9652016-02-03 18:00:32123 enable_http2(true),
bnc8f0f3b62015-04-08 04:37:23124 spdy_session_max_recv_window_size(kSpdySessionMaxRecvWindowSize),
[email protected]cf4cae32014-05-27 00:39:10125 time_func(&base::TimeTicks::Now),
bnca86815342016-06-27 12:27:48126 enable_http2_alternative_service_with_different_host(false),
127 enable_quic_alternative_service_with_different_host(true),
[email protected]cf4cae32014-05-27 00:39:10128 enable_quic(false),
zhongyi75527dd2016-01-21 22:26:43129 disable_quic_on_timeout_with_open_streams(false),
jri2b966f22014-09-02 22:25:36130 quic_always_require_handshake_confirmation(false),
jri584002d12014-09-09 00:51:28131 quic_disable_connection_pooling(false),
rtennetica75eb1b2015-03-03 23:09:50132 quic_load_server_info_timeout_srtt_multiplier(0.25f),
rtenneti4f809972015-02-11 19:38:34133 quic_enable_connection_racing(false),
qyearsley3257b7de2015-02-28 06:59:03134 quic_enable_non_blocking_io(false),
rtenneti34dffe752015-02-24 23:27:32135 quic_disable_disk_cache(false),
rch9976b0c2015-06-10 21:27:23136 quic_prefer_aes(false),
rche713c1792015-05-07 01:39:18137 quic_socket_receive_buffer_size(kQuicSocketReceiveBufferSize),
rtennetiafccbc062016-05-16 18:21:14138 quic_delay_tcp_race(true),
rtenneti6971c172016-01-15 20:12:10139 quic_max_server_configs_stored_in_properties(0u),
pmarko6ab8be242017-01-11 11:02:55140 quic_clock(nullptr),
141 quic_random(nullptr),
[email protected]cf4cae32014-05-27 00:39:10142 quic_max_packet_length(kDefaultMaxPacketSize),
143 enable_user_alternate_protocol_ports(false),
rch1f83eaf32016-01-06 00:27:11144 quic_crypto_client_stream_factory(
145 QuicCryptoClientStreamFactory::GetDefaultFactory()),
jri8c44d692015-10-23 23:53:41146 quic_close_sessions_on_ip_change(false),
rtenneti41c09992015-11-30 18:24:01147 quic_idle_connection_timeout_seconds(kIdleConnectionTimeoutSeconds),
zhongyidd1439f62016-09-02 02:02:26148 quic_reduced_ping_timeout_seconds(kPingTimeoutSecs),
zhongyi6ba0f4252016-08-23 05:20:04149 quic_packet_reader_yield_after_duration_milliseconds(
150 kQuicYieldAfterDurationMilliseconds),
rtennetid2e74caa2015-12-09 00:51:57151 quic_disable_preconnect_if_0rtt(false),
jri7e636642016-01-14 06:57:08152 quic_migrate_sessions_on_network_change(false),
jrid36ada62016-02-06 02:42:08153 quic_migrate_sessions_early(false),
jri217455a12016-07-13 20:15:09154 quic_allow_server_migration(false),
xunjieli888c29922016-03-18 21:05:09155 quic_disable_bidirectional_streams(false),
ckrasicda193a82016-07-09 00:39:36156 quic_force_hol_blocking(false),
rtennetid073dd22016-08-04 01:58:33157 quic_race_cert_verification(false),
rchbedd57452016-08-30 19:11:48158 quic_do_not_fragment(false),
tbansal6b527482017-01-27 19:10:49159 quic_do_not_mark_as_broken_on_network_change(false),
rchd6163f32017-01-30 23:50:38160 quic_estimate_initial_rtt(false),
pmarko6ab8be242017-01-11 11:02:55161 proxy_delegate(nullptr),
mmenkea7da6da2016-09-01 21:56:52162 enable_token_binding(false),
mmenke82d19a582017-01-27 23:26:32163 http_09_on_non_default_ports_enabled(false),
tbansal7450edf2016-12-28 21:12:53164 restrict_to_one_preconnect_for_proxies(false) {
rch02ebae82016-08-16 18:25:25165 quic_supported_versions.push_back(QUIC_VERSION_35);
[email protected]cf4cae32014-05-27 00:39:10166}
167
vmpstracd23b72016-02-26 21:08:55168HttpNetworkSession::Params::Params(const Params& other) = default;
169
[email protected]cf4cae32014-05-27 00:39:10170HttpNetworkSession::Params::~Params() {}
171
172// TODO(mbelshe): Move the socket factories into HttpStreamFactory.
173HttpNetworkSession::HttpNetworkSession(const Params& params)
174 : net_log_(params.net_log),
[email protected]cf4cae32014-05-27 00:39:10175 http_server_properties_(params.http_server_properties),
176 cert_verifier_(params.cert_verifier),
177 http_auth_handler_factory_(params.http_auth_handler_factory),
178 proxy_service_(params.proxy_service),
179 ssl_config_service_(params.ssl_config_service),
zhongyiaf257542016-12-19 03:36:01180 push_delegate_(nullptr),
jri2b966f22014-09-02 22:25:36181 quic_stream_factory_(
jridf673d22016-06-02 22:06:33182 params.net_log,
jri2b966f22014-09-02 22:25:36183 params.host_resolver,
nharper642ae4b2016-06-30 00:40:36184 params.ssl_config_service,
jri2b966f22014-09-02 22:25:36185 params.client_socket_factory
186 ? params.client_socket_factory
ttuttle859dc7a2015-04-23 19:42:29187 : ClientSocketFactory::GetDefaultFactory(),
jri2b966f22014-09-02 22:25:36188 params.http_server_properties,
tbansal3b966952016-10-25 23:25:14189 params.proxy_delegate,
jri2b966f22014-09-02 22:25:36190 params.cert_verifier,
estark6f9b3d82016-01-12 21:37:05191 params.ct_policy_enforcer,
jri2b966f22014-09-02 22:25:36192 params.channel_id_service,
193 params.transport_security_state,
rtenneti052774e2015-11-24 21:00:12194 params.cert_transparency_verifier,
tbansalfdf5665b2015-09-21 22:46:40195 params.socket_performance_watcher_factory,
jri2b966f22014-09-02 22:25:36196 params.quic_crypto_client_stream_factory,
197 params.quic_random ? params.quic_random : QuicRandom::GetInstance(),
rch799bbe82016-12-06 15:30:09198 params.quic_clock ? params.quic_clock : new QuicChromiumClock(),
jri2b966f22014-09-02 22:25:36199 params.quic_max_packet_length,
200 params.quic_user_agent_id,
201 params.quic_supported_versions,
jri2b966f22014-09-02 22:25:36202 params.quic_always_require_handshake_confirmation,
jri584002d12014-09-09 00:51:28203 params.quic_disable_connection_pooling,
rtenneti2912825c2015-01-06 01:19:46204 params.quic_load_server_info_timeout_srtt_multiplier,
rtenneti4f809972015-02-11 19:38:34205 params.quic_enable_connection_racing,
qyearsley3257b7de2015-02-28 06:59:03206 params.quic_enable_non_blocking_io,
rtenneti34dffe752015-02-24 23:27:32207 params.quic_disable_disk_cache,
rch9976b0c2015-06-10 21:27:23208 params.quic_prefer_aes,
rch185ebee2015-07-14 23:56:22209 params.quic_socket_receive_buffer_size,
rtennetib8e80fb2016-05-16 00:12:09210 params.quic_delay_tcp_race,
rtenneti6971c172016-01-15 20:12:10211 params.quic_max_server_configs_stored_in_properties,
jri8c44d692015-10-23 23:53:41212 params.quic_close_sessions_on_ip_change,
zhongyi89649c32016-01-22 00:14:01213 params.disable_quic_on_timeout_with_open_streams,
rtenneti41c09992015-11-30 18:24:01214 params.quic_idle_connection_timeout_seconds,
zhongyidd1439f62016-09-02 02:02:26215 params.quic_reduced_ping_timeout_seconds,
zhongyi6ba0f4252016-08-23 05:20:04216 params.quic_packet_reader_yield_after_duration_milliseconds,
jri7e636642016-01-14 06:57:08217 params.quic_migrate_sessions_on_network_change,
jrid36ada62016-02-06 02:42:08218 params.quic_migrate_sessions_early,
jri217455a12016-07-13 20:15:09219 params.quic_allow_server_migration,
ckrasicda193a82016-07-09 00:39:36220 params.quic_force_hol_blocking,
rtennetid073dd22016-08-04 01:58:33221 params.quic_race_cert_verification,
rchbedd57452016-08-30 19:11:48222 params.quic_do_not_fragment,
rchd6163f32017-01-30 23:50:38223 params.quic_estimate_initial_rtt,
nharperd5cddca2016-02-27 03:37:52224 params.quic_connection_options,
225 params.enable_token_binding),
[email protected]cf4cae32014-05-27 00:39:10226 spdy_session_pool_(params.host_resolver,
227 params.ssl_config_service,
228 params.http_server_properties,
[email protected]5db452202014-08-19 05:22:15229 params.transport_security_state,
[email protected]cf4cae32014-05-27 00:39:10230 params.enable_spdy_ping_based_connection_checking,
bnc8f0f3b62015-04-08 04:37:23231 params.spdy_session_max_recv_window_size,
bnc3171a2432016-12-28 18:40:26232 AddDefaultHttp2Settings(params.http2_settings),
[email protected]cf4cae32014-05-27 00:39:10233 params.time_func,
tbansal28e68f82016-02-04 02:56:15234 params.proxy_delegate),
[email protected]cf4cae32014-05-27 00:39:10235 http_stream_factory_(new HttpStreamFactoryImpl(this, false)),
jri2b966f22014-09-02 22:25:36236 http_stream_factory_for_websocket_(new HttpStreamFactoryImpl(this, true)),
rdsmithbf8c3c12016-11-18 18:16:24237 network_stream_throttler_(new NetworkThrottleManagerImpl()),
[email protected]cf4cae32014-05-27 00:39:10238 params_(params) {
239 DCHECK(proxy_service_);
240 DCHECK(ssl_config_service_.get());
241 CHECK(http_server_properties_);
242
vitalybukabfe0e4272015-12-03 01:51:42243 const std::string ssl_session_cache_shard =
244 "http_network_session/" + base::IntToString(g_next_shard_id.GetNext());
245 normal_socket_pool_manager_.reset(CreateSocketPoolManager(
246 NORMAL_SOCKET_POOL, params, ssl_session_cache_shard));
247 websocket_socket_pool_manager_.reset(CreateSocketPoolManager(
248 WEBSOCKET_SOCKET_POOL, params, ssl_session_cache_shard));
249
bnc3f0118e2016-02-02 15:42:22250 if (params_.enable_http2) {
251 next_protos_.push_back(kProtoHTTP2);
bnc3f0118e2016-02-02 15:42:22252 }
253
254 next_protos_.push_back(kProtoHTTP11);
255
rtenneti6971c172016-01-15 20:12:10256 http_server_properties_->SetMaxServerConfigsStoredInProperties(
257 params.quic_max_server_configs_stored_in_properties);
maksim.sisov0adf8592016-07-15 06:25:56258
259 memory_pressure_listener_.reset(new base::MemoryPressureListener(base::Bind(
260 &HttpNetworkSession::OnMemoryPressure, base::Unretained(this))));
hajimehoshi8156e7c2016-09-29 06:17:52261 base::MemoryCoordinatorClientRegistry::GetInstance()->Register(this);
[email protected]cf4cae32014-05-27 00:39:10262}
263
264HttpNetworkSession::~HttpNetworkSession() {
avifceb32f62016-10-07 16:30:52265 response_drainers_.clear();
[email protected]cf4cae32014-05-27 00:39:10266 spdy_session_pool_.CloseAllSessions();
hajimehoshi8156e7c2016-09-29 06:17:52267 base::MemoryCoordinatorClientRegistry::GetInstance()->Unregister(this);
[email protected]cf4cae32014-05-27 00:39:10268}
269
avifceb32f62016-10-07 16:30:52270void HttpNetworkSession::AddResponseDrainer(
271 std::unique_ptr<HttpResponseBodyDrainer> drainer) {
272 DCHECK(!base::ContainsKey(response_drainers_, drainer.get()));
273 HttpResponseBodyDrainer* drainer_ptr = drainer.get();
274 response_drainers_[drainer_ptr] = std::move(drainer);
[email protected]cf4cae32014-05-27 00:39:10275}
276
277void HttpNetworkSession::RemoveResponseDrainer(
278 HttpResponseBodyDrainer* drainer) {
skyostilb8f60ca2016-08-12 12:34:43279 DCHECK(base::ContainsKey(response_drainers_, drainer));
avifceb32f62016-10-07 16:30:52280 response_drainers_[drainer].release();
[email protected]cf4cae32014-05-27 00:39:10281 response_drainers_.erase(drainer);
282}
283
284TransportClientSocketPool* HttpNetworkSession::GetTransportSocketPool(
285 SocketPoolType pool_type) {
286 return GetSocketPoolManager(pool_type)->GetTransportSocketPool();
287}
288
289SSLClientSocketPool* HttpNetworkSession::GetSSLSocketPool(
290 SocketPoolType pool_type) {
291 return GetSocketPoolManager(pool_type)->GetSSLSocketPool();
292}
293
294SOCKSClientSocketPool* HttpNetworkSession::GetSocketPoolForSOCKSProxy(
295 SocketPoolType pool_type,
296 const HostPortPair& socks_proxy) {
297 return GetSocketPoolManager(pool_type)->GetSocketPoolForSOCKSProxy(
298 socks_proxy);
299}
300
301HttpProxyClientSocketPool* HttpNetworkSession::GetSocketPoolForHTTPProxy(
302 SocketPoolType pool_type,
303 const HostPortPair& http_proxy) {
304 return GetSocketPoolManager(pool_type)->GetSocketPoolForHTTPProxy(http_proxy);
305}
306
307SSLClientSocketPool* HttpNetworkSession::GetSocketPoolForSSLWithProxy(
308 SocketPoolType pool_type,
309 const HostPortPair& proxy_server) {
310 return GetSocketPoolManager(pool_type)->GetSocketPoolForSSLWithProxy(
311 proxy_server);
312}
313
danakj1fd259a02016-04-16 03:17:09314std::unique_ptr<base::Value> HttpNetworkSession::SocketPoolInfoToValue() const {
[email protected]cf4cae32014-05-27 00:39:10315 // TODO(yutak): Should merge values from normal pools and WebSocket pools.
316 return normal_socket_pool_manager_->SocketPoolInfoToValue();
317}
318
danakj1fd259a02016-04-16 03:17:09319std::unique_ptr<base::Value> HttpNetworkSession::SpdySessionPoolInfoToValue()
320 const {
[email protected]cf4cae32014-05-27 00:39:10321 return spdy_session_pool_.SpdySessionPoolInfoToValue();
322}
323
danakj1fd259a02016-04-16 03:17:09324std::unique_ptr<base::Value> HttpNetworkSession::QuicInfoToValue() const {
325 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
[email protected]cf4cae32014-05-27 00:39:10326 dict->Set("sessions", quic_stream_factory_.QuicStreamFactoryInfoToValue());
pmarko6ab8be242017-01-11 11:02:55327 dict->SetBoolean("quic_enabled", IsQuicEnabled());
danakj1fd259a02016-04-16 03:17:09328 std::unique_ptr<base::ListValue> connection_options(new base::ListValue);
[email protected]ecb4dc32014-08-16 05:49:25329 for (QuicTagVector::const_iterator it =
330 params_.quic_connection_options.begin();
331 it != params_.quic_connection_options.end(); ++it) {
mpw94250b82016-11-19 18:13:30332 connection_options->AppendString("'" + QuicTagToString(*it) + "'");
[email protected]ecb4dc32014-08-16 05:49:25333 }
dchengc7eeda422015-12-26 03:56:48334 dict->Set("connection_options", std::move(connection_options));
rtenneti8a2f4632016-03-21 20:26:57335
danakj1fd259a02016-04-16 03:17:09336 std::unique_ptr<base::ListValue> origins_to_force_quic_on(
337 new base::ListValue);
rtenneti8a2f4632016-03-21 20:26:57338 for (const auto& origin : params_.origins_to_force_quic_on) {
339 origins_to_force_quic_on->AppendString("'" + origin.ToString() + "'");
340 }
341 dict->Set("origins_to_force_quic_on", std::move(origins_to_force_quic_on));
342
rtennetif4b29d72016-01-11 19:29:39343 dict->SetDouble("load_server_info_timeout_srtt_multiplier",
344 params_.quic_load_server_info_timeout_srtt_multiplier);
345 dict->SetBoolean("enable_connection_racing",
346 params_.quic_enable_connection_racing);
347 dict->SetBoolean("disable_disk_cache", params_.quic_disable_disk_cache);
348 dict->SetBoolean("prefer_aes", params_.quic_prefer_aes);
rtennetib8e80fb2016-05-16 00:12:09349 dict->SetBoolean("delay_tcp_race", params_.quic_delay_tcp_race);
rtenneti6971c172016-01-15 20:12:10350 dict->SetInteger("max_server_configs_stored_in_properties",
351 params_.quic_max_server_configs_stored_in_properties);
rtennetif4b29d72016-01-11 19:29:39352 dict->SetInteger("idle_connection_timeout_seconds",
353 params_.quic_idle_connection_timeout_seconds);
zhongyidd1439f62016-09-02 02:02:26354 dict->SetInteger("reduced_ping_timeout_seconds",
355 params_.quic_reduced_ping_timeout_seconds);
zhongyi6ba0f4252016-08-23 05:20:04356 dict->SetInteger(
357 "packet_reader_yield_after_duration_milliseconds",
358 params_.quic_packet_reader_yield_after_duration_milliseconds);
rtennetif4b29d72016-01-11 19:29:39359 dict->SetBoolean("disable_preconnect_if_0rtt",
360 params_.quic_disable_preconnect_if_0rtt);
rtennetib60e77a2016-03-29 17:34:37361 dict->SetBoolean("disable_quic_on_timeout_with_open_streams",
362 params_.disable_quic_on_timeout_with_open_streams);
rch703d0e02016-09-13 18:35:36363 dict->SetBoolean("is_quic_disabled", quic_stream_factory_.IsQuicDisabled());
ckrasicda193a82016-07-09 00:39:36364 dict->SetBoolean("force_hol_blocking", params_.quic_force_hol_blocking);
rtennetid073dd22016-08-04 01:58:33365 dict->SetBoolean("race_cert_verification",
366 params_.quic_race_cert_verification);
dchengc7eeda422015-12-26 03:56:48367 return std::move(dict);
[email protected]cf4cae32014-05-27 00:39:10368}
369
370void HttpNetworkSession::CloseAllConnections() {
371 normal_socket_pool_manager_->FlushSocketPoolsWithError(ERR_ABORTED);
372 websocket_socket_pool_manager_->FlushSocketPoolsWithError(ERR_ABORTED);
373 spdy_session_pool_.CloseCurrentSessions(ERR_ABORTED);
jri7e636642016-01-14 06:57:08374 quic_stream_factory_.CloseAllSessions(ERR_ABORTED, QUIC_INTERNAL_ERROR);
[email protected]cf4cae32014-05-27 00:39:10375}
376
377void HttpNetworkSession::CloseIdleConnections() {
378 normal_socket_pool_manager_->CloseIdleSockets();
379 websocket_socket_pool_manager_->CloseIdleSockets();
380 spdy_session_pool_.CloseCurrentIdleSessions();
381}
382
bnc3472afd2016-11-17 15:27:21383bool HttpNetworkSession::IsProtocolEnabled(NextProto protocol) const {
bnc8f8225c2016-09-23 21:19:46384 switch (protocol) {
bnc3472afd2016-11-17 15:27:21385 case kProtoUnknown:
bnc8f8225c2016-09-23 21:19:46386 NOTREACHED();
387 return false;
bnc3472afd2016-11-17 15:27:21388 case kProtoHTTP11:
389 return true;
390 case kProtoHTTP2:
391 return params_.enable_http2;
392 case kProtoQUIC:
pmarko6ab8be242017-01-11 11:02:55393 return IsQuicEnabled();
bnc8f8225c2016-09-23 21:19:46394 }
395 NOTREACHED();
396 return false;
[email protected]cf4cae32014-05-27 00:39:10397}
398
zhongyiaf257542016-12-19 03:36:01399void HttpNetworkSession::SetServerPushDelegate(
400 std::unique_ptr<ServerPushDelegate> push_delegate) {
401 DCHECK(!push_delegate_ && push_delegate);
402
403 push_delegate_ = std::move(push_delegate);
404 spdy_session_pool_.set_server_push_delegate(push_delegate_.get());
405 quic_stream_factory_.set_server_push_delegate(push_delegate_.get());
406}
407
bnc1f295372015-10-21 23:24:22408void HttpNetworkSession::GetAlpnProtos(NextProtoVector* alpn_protos) const {
bnc927c4962016-07-21 14:45:59409 *alpn_protos = next_protos_;
bnc1f295372015-10-21 23:24:22410}
411
nharper8cdb0fb2016-04-22 21:34:59412void HttpNetworkSession::GetSSLConfig(const HttpRequestInfo& request,
413 SSLConfig* server_config,
414 SSLConfig* proxy_config) const {
415 ssl_config_service_->GetSSLConfig(server_config);
416 GetAlpnProtos(&server_config->alpn_protos);
nharper8cdb0fb2016-04-22 21:34:59417 *proxy_config = *server_config;
418 if (request.privacy_mode == PRIVACY_MODE_ENABLED) {
419 server_config->channel_id_enabled = false;
420 } else if (params_.enable_token_binding && params_.channel_id_service) {
421 server_config->token_binding_params.push_back(TB_PARAM_ECDSAP256);
422 }
423}
424
xunjieli9f8c5fb52016-12-07 22:59:33425void HttpNetworkSession::DumpMemoryStats(
426 base::trace_event::ProcessMemoryDump* pmd,
427 const std::string& parent_absolute_name) const {
xunjielid5debfc2017-02-24 15:55:49428 std::string name = base::StringPrintf("net/http_network_session_0x%" PRIxPTR,
429 reinterpret_cast<uintptr_t>(this));
xunjieli9f8c5fb52016-12-07 22:59:33430 base::trace_event::MemoryAllocatorDump* http_network_session_dump =
431 pmd->GetAllocatorDump(name);
xunjieli2a2468bd2017-01-04 21:17:33432 if (http_network_session_dump == nullptr) {
433 http_network_session_dump = pmd->CreateAllocatorDump(name);
434 normal_socket_pool_manager_->DumpMemoryStats(
435 pmd, http_network_session_dump->absolute_name());
436 spdy_session_pool_.DumpMemoryStats(
437 pmd, http_network_session_dump->absolute_name());
xunjielif5267de2017-01-20 21:18:57438 if (http_stream_factory_) {
439 http_stream_factory_->DumpMemoryStats(
440 pmd, http_network_session_dump->absolute_name());
441 }
xunjieli69720dd2017-01-30 15:36:29442 quic_stream_factory_.DumpMemoryStats(
443 pmd, http_network_session_dump->absolute_name());
xunjieli9f8c5fb52016-12-07 22:59:33444 }
xunjielid5debfc2017-02-24 15:55:49445
xunjieli2a2468bd2017-01-04 21:17:33446 // Create an empty row under parent's dump so size can be attributed correctly
447 // if |this| is shared between URLRequestContexts.
448 base::trace_event::MemoryAllocatorDump* empty_row_dump =
449 pmd->CreateAllocatorDump(base::StringPrintf(
450 "%s/http_network_session", parent_absolute_name.c_str()));
451 pmd->AddOwnershipEdge(empty_row_dump->guid(),
xunjieli9f8c5fb52016-12-07 22:59:33452 http_network_session_dump->guid());
453}
454
pmarko6ab8be242017-01-11 11:02:55455bool HttpNetworkSession::IsQuicEnabled() const {
456 return params_.enable_quic;
457}
458
459void HttpNetworkSession::DisableQuic() {
460 params_.enable_quic = false;
461}
462
[email protected]cf4cae32014-05-27 00:39:10463ClientSocketPoolManager* HttpNetworkSession::GetSocketPoolManager(
464 SocketPoolType pool_type) {
465 switch (pool_type) {
466 case NORMAL_SOCKET_POOL:
467 return normal_socket_pool_manager_.get();
468 case WEBSOCKET_SOCKET_POOL:
469 return websocket_socket_pool_manager_.get();
470 default:
471 NOTREACHED();
472 break;
473 }
474 return NULL;
475}
476
maksim.sisov0adf8592016-07-15 06:25:56477void HttpNetworkSession::OnMemoryPressure(
478 base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) {
479 switch (memory_pressure_level) {
480 case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE:
481 break;
482 case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE:
483 case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL:
484 CloseIdleConnections();
485 break;
486 }
487}
488
bashi56b23f302017-02-09 01:24:57489void HttpNetworkSession::OnPurgeMemory() {
490 CloseIdleConnections();
hajimehoshi8156e7c2016-09-29 06:17:52491}
492
ttuttle859dc7a2015-04-23 19:42:29493} // namespace net