blob: 4b1fe0d8ebea4d70eb1ae8ebfde9a6ab823b25f3 [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>
Bence Béky8cae04e2018-01-15 18:37:068
[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"
vitalybukabfe0e4272015-12-03 01:51:4216#include "base/strings/string_number_conversions.h"
[email protected]cf4cae32014-05-27 00:39:1017#include "base/strings/string_util.h"
xunjieli9f8c5fb52016-12-07 22:59:3318#include "base/strings/stringprintf.h"
19#include "base/trace_event/memory_allocator_dump.h"
xunjielif5267de2017-01-20 21:18:5720#include "base/trace_event/memory_dump_request_args.h"
xunjieli9f8c5fb52016-12-07 22:59:3321#include "base/trace_event/process_memory_dump.h"
[email protected]cf4cae32014-05-27 00:39:1022#include "base/values.h"
rdsmithbf8c3c12016-11-18 18:16:2423#include "net/base/network_throttle_manager_impl.h"
[email protected]cf4cae32014-05-27 00:39:1024#include "net/http/http_auth_handler_factory.h"
25#include "net/http/http_response_body_drainer.h"
26#include "net/http/http_stream_factory_impl.h"
27#include "net/http/url_security_manager.h"
28#include "net/proxy/proxy_service.h"
rch223465c2016-12-08 21:17:2929#include "net/quic/chromium/quic_crypto_client_stream_factory.h"
rch675757b2016-07-29 16:40:1130#include "net/quic/chromium/quic_stream_factory.h"
rchd4db7c152016-07-29 21:58:1231#include "net/quic/core/crypto/quic_random.h"
vasilvv28270e8f2016-12-01 21:38:0932#include "net/quic/core/quic_packets.h"
mpw94250b82016-11-19 18:13:3033#include "net/quic/core/quic_tag.h"
rchd4db7c152016-07-29 21:58:1234#include "net/quic/core/quic_utils.h"
rch799bbe82016-12-06 15:30:0935#include "net/quic/platform/impl/quic_chromium_clock.h"
[email protected]cf4cae32014-05-27 00:39:1036#include "net/socket/client_socket_factory.h"
37#include "net/socket/client_socket_pool_manager_impl.h"
38#include "net/socket/next_proto.h"
bnc1e757502014-12-13 02:20:1639#include "net/socket/ssl_client_socket.h"
bnc8f8f7d302017-04-24 18:08:0640#include "net/spdy/chromium/spdy_session_pool.h"
[email protected]cf4cae32014-05-27 00:39:1041
ttuttle859dc7a2015-04-23 19:42:2942namespace net {
43
[email protected]cf4cae32014-05-27 00:39:1044namespace {
45
tzik74c2eb2c2017-07-25 15:26:1546base::AtomicSequenceNumber g_next_shard_id;
vitalybukabfe0e4272015-12-03 01:51:4247
Juan Jose Lopez Jaimez7fa1f002017-11-20 22:13:3348std::unique_ptr<ClientSocketPoolManager> CreateSocketPoolManager(
ttuttle859dc7a2015-04-23 19:42:2949 HttpNetworkSession::SocketPoolType pool_type,
mmenke6ddfbea2017-05-31 21:48:4150 const HttpNetworkSession::Context& context,
vitalybukabfe0e4272015-12-03 01:51:4251 const std::string& ssl_session_cache_shard) {
[email protected]cf4cae32014-05-27 00:39:1052 // TODO(yutak): Differentiate WebSocket pool manager and allow more
53 // simultaneous connections for WebSockets.
Juan Jose Lopez Jaimez7fa1f002017-11-20 22:13:3354 return std::make_unique<ClientSocketPoolManagerImpl>(
mmenke6ddfbea2017-05-31 21:48:4155 context.net_log,
56 context.client_socket_factory ? context.client_socket_factory
57 : ClientSocketFactory::GetDefaultFactory(),
tbansal16196a1e2017-06-09 01:50:0958 context.socket_performance_watcher_factory,
59 context.network_quality_provider, context.host_resolver,
mmenke6ddfbea2017-05-31 21:48:4160 context.cert_verifier, context.channel_id_service,
61 context.transport_security_state, context.cert_transparency_verifier,
62 context.ct_policy_enforcer, ssl_session_cache_shard,
63 context.ssl_config_service, pool_type);
[email protected]cf4cae32014-05-27 00:39:1064}
65
66} // unnamed namespace
67
bnc8f0f3b62015-04-08 04:37:2368// The maximum receive window sizes for HTTP/2 sessions and streams.
Avi Drissman13fc8932015-12-20 04:40:4669const int32_t kSpdySessionMaxRecvWindowSize = 15 * 1024 * 1024; // 15 MB
70const int32_t kSpdyStreamMaxRecvWindowSize = 6 * 1024 * 1024; // 6 MB
bnc8f0f3b62015-04-08 04:37:2371
bnc3171a2432016-12-28 18:40:2672namespace {
73
74// Keep all HTTP2 parameters in |http2_settings|, even the ones that are not
75// implemented, to be sent to the server.
76// Set default values for settings that |http2_settings| does not specify.
77SettingsMap AddDefaultHttp2Settings(SettingsMap http2_settings) {
78 // Set default values only if |http2_settings| does not have
79 // a value set for given setting.
80 SettingsMap::iterator it = http2_settings.find(SETTINGS_HEADER_TABLE_SIZE);
81 if (it == http2_settings.end())
82 http2_settings[SETTINGS_HEADER_TABLE_SIZE] = kSpdyMaxHeaderTableSize;
83
84 it = http2_settings.find(SETTINGS_MAX_CONCURRENT_STREAMS);
85 if (it == http2_settings.end())
86 http2_settings[SETTINGS_MAX_CONCURRENT_STREAMS] =
87 kSpdyMaxConcurrentPushedStreams;
88
89 it = http2_settings.find(SETTINGS_INITIAL_WINDOW_SIZE);
90 if (it == http2_settings.end())
91 http2_settings[SETTINGS_INITIAL_WINDOW_SIZE] = kSpdyStreamMaxRecvWindowSize;
92
93 return http2_settings;
94}
95
96} // unnamed namespace
97
[email protected]cf4cae32014-05-27 00:39:1098HttpNetworkSession::Params::Params()
mmenke6ddfbea2017-05-31 21:48:4199 : enable_server_push_cancellation(false),
[email protected]cf4cae32014-05-27 00:39:10100 ignore_certificate_errors(false),
101 testing_fixed_http_port(0),
102 testing_fixed_https_port(0),
Matt Menke53c59762017-09-14 16:38:12103 tcp_fast_open_mode(TcpFastOpenMode::DISABLED),
rch1546ccd2017-04-20 02:14:23104 enable_user_alternate_protocol_ports(false),
[email protected]cf4cae32014-05-27 00:39:10105 enable_spdy_ping_based_connection_checking(true),
bncefcd9652016-02-03 18:00:32106 enable_http2(true),
bnc8f0f3b62015-04-08 04:37:23107 spdy_session_max_recv_window_size(kSpdySessionMaxRecvWindowSize),
[email protected]cf4cae32014-05-27 00:39:10108 time_func(&base::TimeTicks::Now),
bnca86731e2017-04-17 12:31:28109 enable_http2_alternative_service(false),
[email protected]cf4cae32014-05-27 00:39:10110 enable_quic(false),
rch1546ccd2017-04-20 02:14:23111 quic_max_packet_length(kDefaultMaxPacketSize),
rch1546ccd2017-04-20 02:14:23112 quic_max_server_configs_stored_in_properties(0u),
113 mark_quic_broken_when_network_blackholes(false),
114 retry_without_alt_svc_on_quic_errors(false),
Yixin Wanga9afead2017-10-19 20:23:10115 support_ietf_format_quic_altsvc(false),
Jana Iyengar903dec22017-11-28 00:44:23116 quic_close_sessions_on_ip_change(false),
rtenneti41c09992015-11-30 18:24:01117 quic_idle_connection_timeout_seconds(kIdleConnectionTimeoutSeconds),
zhongyidd1439f62016-09-02 02:02:26118 quic_reduced_ping_timeout_seconds(kPingTimeoutSecs),
Yixin Wang469da562017-11-15 21:34:58119 quic_max_time_before_crypto_handshake_seconds(
120 kMaxTimeForCryptoHandshakeSecs),
121 quic_max_idle_time_before_crypto_handshake_seconds(
122 kInitialIdleTimeoutSecs),
Zhongyi Shi1a605d22017-09-29 20:09:48123 quic_connect_using_default_network(false),
jri7e636642016-01-14 06:57:08124 quic_migrate_sessions_on_network_change(false),
jrid36ada62016-02-06 02:42:08125 quic_migrate_sessions_early(false),
Zhongyi Shif4683a32017-12-01 00:03:28126 quic_migrate_sessions_on_network_change_v2(false),
127 quic_migrate_sessions_early_v2(false),
Zhongyi Shi73f23ca872017-12-13 18:37:13128 quic_max_time_on_non_default_network(
129 base::TimeDelta::FromSeconds(kMaxTimeOnNonDefaultNetworkSecs)),
Zhongyi Shi8b1e43f2017-12-13 20:46:30130 quic_max_migrations_to_non_default_network_on_path_degrading(
131 kMaxMigrationsToNonDefaultNetworkOnPathDegrading),
jri217455a12016-07-13 20:15:09132 quic_allow_server_migration(false),
Ryan Hamiltonc84473f2017-11-23 03:18:34133 quic_allow_remote_alt_svc(false),
xunjieli888c29922016-03-18 21:05:09134 quic_disable_bidirectional_streams(false),
ckrasicda193a82016-07-09 00:39:36135 quic_force_hol_blocking(false),
rtennetid073dd22016-08-04 01:58:33136 quic_race_cert_verification(false),
rchd6163f32017-01-30 23:50:38137 quic_estimate_initial_rtt(false),
Yixin Wang079ad542018-01-11 04:06:05138 quic_headers_include_h2_stream_dependency(false),
mmenkea7da6da2016-09-01 21:56:52139 enable_token_binding(false),
yucliu48f235d2018-01-11 00:59:55140 http_09_on_non_default_ports_enabled(false),
141 disable_idle_sockets_close_on_memory_pressure(false) {
rchd6e1cab2017-07-07 03:59:30142 quic_supported_versions.push_back(QUIC_VERSION_39);
[email protected]cf4cae32014-05-27 00:39:10143}
144
vmpstracd23b72016-02-26 21:08:55145HttpNetworkSession::Params::Params(const Params& other) = default;
146
Chris Watkins7a41d3552017-12-01 02:13:27147HttpNetworkSession::Params::~Params() = default;
[email protected]cf4cae32014-05-27 00:39:10148
mmenke6ddfbea2017-05-31 21:48:41149HttpNetworkSession::Context::Context()
150 : client_socket_factory(nullptr),
151 host_resolver(nullptr),
152 cert_verifier(nullptr),
153 channel_id_service(nullptr),
154 transport_security_state(nullptr),
155 cert_transparency_verifier(nullptr),
156 ct_policy_enforcer(nullptr),
157 proxy_service(nullptr),
158 ssl_config_service(nullptr),
159 http_auth_handler_factory(nullptr),
160 net_log(nullptr),
161 socket_performance_watcher_factory(nullptr),
tbansal16196a1e2017-06-09 01:50:09162 network_quality_provider(nullptr),
mmenke6ddfbea2017-05-31 21:48:41163 quic_clock(nullptr),
164 quic_random(nullptr),
165 quic_crypto_client_stream_factory(
166 QuicCryptoClientStreamFactory::GetDefaultFactory()),
167 proxy_delegate(nullptr) {}
168
169HttpNetworkSession::Context::Context(const Context& other) = default;
170
Chris Watkins7a41d3552017-12-01 02:13:27171HttpNetworkSession::Context::~Context() = default;
mmenke6ddfbea2017-05-31 21:48:41172
[email protected]cf4cae32014-05-27 00:39:10173// TODO(mbelshe): Move the socket factories into HttpStreamFactory.
mmenke6ddfbea2017-05-31 21:48:41174HttpNetworkSession::HttpNetworkSession(const Params& params,
175 const Context& context)
176 : net_log_(context.net_log),
177 http_server_properties_(context.http_server_properties),
178 cert_verifier_(context.cert_verifier),
179 http_auth_handler_factory_(context.http_auth_handler_factory),
180 proxy_service_(context.proxy_service),
181 ssl_config_service_(context.ssl_config_service),
zhongyiaf257542016-12-19 03:36:01182 push_delegate_(nullptr),
jri2b966f22014-09-02 22:25:36183 quic_stream_factory_(
mmenke6ddfbea2017-05-31 21:48:41184 context.net_log,
185 context.host_resolver,
186 context.ssl_config_service,
187 context.client_socket_factory
188 ? context.client_socket_factory
ttuttle859dc7a2015-04-23 19:42:29189 : ClientSocketFactory::GetDefaultFactory(),
mmenke6ddfbea2017-05-31 21:48:41190 context.http_server_properties,
191 context.cert_verifier,
192 context.ct_policy_enforcer,
193 context.channel_id_service,
194 context.transport_security_state,
195 context.cert_transparency_verifier,
196 context.socket_performance_watcher_factory,
197 context.quic_crypto_client_stream_factory,
198 context.quic_random ? context.quic_random : QuicRandom::GetInstance(),
199 context.quic_clock ? context.quic_clock
200 : QuicChromiumClock::GetInstance(),
jri2b966f22014-09-02 22:25:36201 params.quic_max_packet_length,
202 params.quic_user_agent_id,
rch431dd4452017-04-19 15:22:35203 params.quic_max_server_configs_stored_in_properties > 0,
Jana Iyengar903dec22017-11-28 00:44:23204 params.quic_close_sessions_on_ip_change,
rch9ecde09b2017-04-08 00:18:23205 params.mark_quic_broken_when_network_blackholes,
rtenneti41c09992015-11-30 18:24:01206 params.quic_idle_connection_timeout_seconds,
zhongyidd1439f62016-09-02 02:02:26207 params.quic_reduced_ping_timeout_seconds,
Yixin Wang469da562017-11-15 21:34:58208 params.quic_max_time_before_crypto_handshake_seconds,
209 params.quic_max_idle_time_before_crypto_handshake_seconds,
Zhongyi Shi1a605d22017-09-29 20:09:48210 params.quic_connect_using_default_network,
jri7e636642016-01-14 06:57:08211 params.quic_migrate_sessions_on_network_change,
jrid36ada62016-02-06 02:42:08212 params.quic_migrate_sessions_early,
Zhongyi Shif4683a32017-12-01 00:03:28213 params.quic_migrate_sessions_on_network_change_v2,
214 params.quic_migrate_sessions_early_v2,
Zhongyi Shi73f23ca872017-12-13 18:37:13215 params.quic_max_time_on_non_default_network,
Zhongyi Shi8b1e43f2017-12-13 20:46:30216 params.quic_max_migrations_to_non_default_network_on_path_degrading,
jri217455a12016-07-13 20:15:09217 params.quic_allow_server_migration,
rtennetid073dd22016-08-04 01:58:33218 params.quic_race_cert_verification,
rchd6163f32017-01-30 23:50:38219 params.quic_estimate_initial_rtt,
Yixin Wang079ad542018-01-11 04:06:05220 params.quic_headers_include_h2_stream_dependency,
nharperd5cddca2016-02-27 03:37:52221 params.quic_connection_options,
Yixin Wang46a425f2017-08-10 23:02:20222 params.quic_client_connection_options,
nharperd5cddca2016-02-27 03:37:52223 params.enable_token_binding),
mmenke6ddfbea2017-05-31 21:48:41224 spdy_session_pool_(context.host_resolver,
225 context.ssl_config_service,
226 context.http_server_properties,
227 context.transport_security_state,
zhongyi8ac630d2017-06-26 19:46:33228 params.quic_supported_versions,
[email protected]cf4cae32014-05-27 00:39:10229 params.enable_spdy_ping_based_connection_checking,
Yixin Wanga9afead2017-10-19 20:23:10230 params.support_ietf_format_quic_altsvc,
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,
mmenke6ddfbea2017-05-31 21:48:41234 context.proxy_delegate),
Bence Béky8cae04e2018-01-15 18:37:06235 http_stream_factory_(std::make_unique<HttpStreamFactoryImpl>(this)),
236 network_stream_throttler_(std::make_unique<NetworkThrottleManagerImpl>()),
mmenke6ddfbea2017-05-31 21:48:41237 params_(params),
238 context_(context) {
[email protected]cf4cae32014-05-27 00:39:10239 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());
Juan Jose Lopez Jaimez7fa1f002017-11-20 22:13:33245 normal_socket_pool_manager_ = CreateSocketPoolManager(
246 NORMAL_SOCKET_POOL, context, ssl_session_cache_shard);
247 websocket_socket_pool_manager_ = CreateSocketPoolManager(
248 WEBSOCKET_SOCKET_POOL, context, ssl_session_cache_shard);
vitalybukabfe0e4272015-12-03 01:51:42249
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
yucliu48f235d2018-01-11 00:59:55259 if (!params_.disable_idle_sockets_close_on_memory_pressure) {
260 memory_pressure_listener_.reset(
261 new base::MemoryPressureListener(base::BindRepeating(
262 &HttpNetworkSession::OnMemoryPressure, base::Unretained(this))));
263 }
264
hajimehoshi8156e7c2016-09-29 06:17:52265 base::MemoryCoordinatorClientRegistry::GetInstance()->Register(this);
[email protected]cf4cae32014-05-27 00:39:10266}
267
268HttpNetworkSession::~HttpNetworkSession() {
gab47aa7da2017-06-02 16:09:43269 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
avifceb32f62016-10-07 16:30:52270 response_drainers_.clear();
Bence Béky3ba8c332017-12-11 20:19:24271 // TODO(bnc): CloseAllSessions() is also called in SpdySessionPool destructor,
272 // one of the two calls should be removed.
[email protected]cf4cae32014-05-27 00:39:10273 spdy_session_pool_.CloseAllSessions();
hajimehoshi8156e7c2016-09-29 06:17:52274 base::MemoryCoordinatorClientRegistry::GetInstance()->Unregister(this);
[email protected]cf4cae32014-05-27 00:39:10275}
276
avifceb32f62016-10-07 16:30:52277void HttpNetworkSession::AddResponseDrainer(
278 std::unique_ptr<HttpResponseBodyDrainer> drainer) {
279 DCHECK(!base::ContainsKey(response_drainers_, drainer.get()));
280 HttpResponseBodyDrainer* drainer_ptr = drainer.get();
281 response_drainers_[drainer_ptr] = std::move(drainer);
[email protected]cf4cae32014-05-27 00:39:10282}
283
284void HttpNetworkSession::RemoveResponseDrainer(
285 HttpResponseBodyDrainer* drainer) {
skyostilb8f60ca2016-08-12 12:34:43286 DCHECK(base::ContainsKey(response_drainers_, drainer));
avifceb32f62016-10-07 16:30:52287 response_drainers_[drainer].release();
[email protected]cf4cae32014-05-27 00:39:10288 response_drainers_.erase(drainer);
289}
290
291TransportClientSocketPool* HttpNetworkSession::GetTransportSocketPool(
292 SocketPoolType pool_type) {
293 return GetSocketPoolManager(pool_type)->GetTransportSocketPool();
294}
295
296SSLClientSocketPool* HttpNetworkSession::GetSSLSocketPool(
297 SocketPoolType pool_type) {
298 return GetSocketPoolManager(pool_type)->GetSSLSocketPool();
299}
300
301SOCKSClientSocketPool* HttpNetworkSession::GetSocketPoolForSOCKSProxy(
302 SocketPoolType pool_type,
303 const HostPortPair& socks_proxy) {
304 return GetSocketPoolManager(pool_type)->GetSocketPoolForSOCKSProxy(
305 socks_proxy);
306}
307
308HttpProxyClientSocketPool* HttpNetworkSession::GetSocketPoolForHTTPProxy(
309 SocketPoolType pool_type,
310 const HostPortPair& http_proxy) {
311 return GetSocketPoolManager(pool_type)->GetSocketPoolForHTTPProxy(http_proxy);
312}
313
314SSLClientSocketPool* HttpNetworkSession::GetSocketPoolForSSLWithProxy(
315 SocketPoolType pool_type,
316 const HostPortPair& proxy_server) {
317 return GetSocketPoolManager(pool_type)->GetSocketPoolForSSLWithProxy(
318 proxy_server);
319}
320
danakj1fd259a02016-04-16 03:17:09321std::unique_ptr<base::Value> HttpNetworkSession::SocketPoolInfoToValue() const {
[email protected]cf4cae32014-05-27 00:39:10322 // TODO(yutak): Should merge values from normal pools and WebSocket pools.
323 return normal_socket_pool_manager_->SocketPoolInfoToValue();
324}
325
danakj1fd259a02016-04-16 03:17:09326std::unique_ptr<base::Value> HttpNetworkSession::SpdySessionPoolInfoToValue()
327 const {
[email protected]cf4cae32014-05-27 00:39:10328 return spdy_session_pool_.SpdySessionPoolInfoToValue();
329}
330
danakj1fd259a02016-04-16 03:17:09331std::unique_ptr<base::Value> HttpNetworkSession::QuicInfoToValue() const {
332 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
[email protected]cf4cae32014-05-27 00:39:10333 dict->Set("sessions", quic_stream_factory_.QuicStreamFactoryInfoToValue());
pmarko6ab8be242017-01-11 11:02:55334 dict->SetBoolean("quic_enabled", IsQuicEnabled());
rch53535742017-04-20 00:48:50335
Jeremy Roman0579ed62017-08-29 15:56:19336 auto connection_options(std::make_unique<base::ListValue>());
rch53535742017-04-20 00:48:50337 for (const auto& option : params_.quic_connection_options)
338 connection_options->AppendString(QuicTagToString(option));
dchengc7eeda422015-12-26 03:56:48339 dict->Set("connection_options", std::move(connection_options));
rtenneti8a2f4632016-03-21 20:26:57340
Jeremy Roman0579ed62017-08-29 15:56:19341 auto supported_versions(std::make_unique<base::ListValue>());
rch53535742017-04-20 00:48:50342 for (const auto& version : params_.quic_supported_versions)
343 supported_versions->AppendString(QuicVersionToString(version));
344 dict->Set("supported_versions", std::move(supported_versions));
345
Jeremy Roman0579ed62017-08-29 15:56:19346 auto origins_to_force_quic_on(std::make_unique<base::ListValue>());
rch53535742017-04-20 00:48:50347 for (const auto& origin : params_.origins_to_force_quic_on)
348 origins_to_force_quic_on->AppendString(origin.ToString());
rtenneti8a2f4632016-03-21 20:26:57349 dict->Set("origins_to_force_quic_on", std::move(origins_to_force_quic_on));
350
rch53535742017-04-20 00:48:50351 dict->SetInteger("max_packet_length", params_.quic_max_packet_length);
rtenneti6971c172016-01-15 20:12:10352 dict->SetInteger("max_server_configs_stored_in_properties",
353 params_.quic_max_server_configs_stored_in_properties);
rtennetif4b29d72016-01-11 19:29:39354 dict->SetInteger("idle_connection_timeout_seconds",
355 params_.quic_idle_connection_timeout_seconds);
zhongyidd1439f62016-09-02 02:02:26356 dict->SetInteger("reduced_ping_timeout_seconds",
357 params_.quic_reduced_ping_timeout_seconds);
rch53535742017-04-20 00:48:50358 dict->SetBoolean("mark_quic_broken_when_network_blackholes",
359 params_.mark_quic_broken_when_network_blackholes);
360 dict->SetBoolean("retry_without_alt_svc_on_quic_errors",
361 params_.retry_without_alt_svc_on_quic_errors);
rtennetid073dd22016-08-04 01:58:33362 dict->SetBoolean("race_cert_verification",
363 params_.quic_race_cert_verification);
rch53535742017-04-20 00:48:50364 dict->SetBoolean("disable_bidirectional_streams",
365 params_.quic_disable_bidirectional_streams);
Jana Iyengar903dec22017-11-28 00:44:23366 dict->SetBoolean("close_sessions_on_ip_change",
367 params_.quic_close_sessions_on_ip_change);
rch53535742017-04-20 00:48:50368 dict->SetBoolean("migrate_sessions_on_network_change",
369 params_.quic_migrate_sessions_on_network_change);
370 dict->SetBoolean("migrate_sessions_early",
371 params_.quic_migrate_sessions_early);
Zhongyi Shif4683a32017-12-01 00:03:28372 dict->SetBoolean("migrate_sessions_on_network_change_v2",
373 params_.quic_migrate_sessions_on_network_change_v2);
374 dict->SetBoolean("migrate_sessions_early_v2",
375 params_.quic_migrate_sessions_early_v2);
Zhongyi Shi73f23ca872017-12-13 18:37:13376 dict->SetInteger("max_time_on_non_default_network_seconds",
377 params_.quic_max_time_on_non_default_network.InSeconds());
Zhongyi Shi8b1e43f2017-12-13 20:46:30378 dict->SetInteger(
379 "max_num_migrations_to_non_default_network_on_path_degrading",
380 params_.quic_max_migrations_to_non_default_network_on_path_degrading);
rch53535742017-04-20 00:48:50381 dict->SetBoolean("allow_server_migration",
382 params_.quic_allow_server_migration);
rch53535742017-04-20 00:48:50383 dict->SetBoolean("estimate_initial_rtt", params_.quic_estimate_initial_rtt);
384 dict->SetBoolean("force_hol_blocking", params_.quic_force_hol_blocking);
zhongyif054cd02017-06-09 07:09:10385 dict->SetBoolean("server_push_cancellation",
386 params_.enable_server_push_cancellation);
rch53535742017-04-20 00:48:50387
dchengc7eeda422015-12-26 03:56:48388 return std::move(dict);
[email protected]cf4cae32014-05-27 00:39:10389}
390
391void HttpNetworkSession::CloseAllConnections() {
392 normal_socket_pool_manager_->FlushSocketPoolsWithError(ERR_ABORTED);
393 websocket_socket_pool_manager_->FlushSocketPoolsWithError(ERR_ABORTED);
394 spdy_session_pool_.CloseCurrentSessions(ERR_ABORTED);
jri7e636642016-01-14 06:57:08395 quic_stream_factory_.CloseAllSessions(ERR_ABORTED, QUIC_INTERNAL_ERROR);
[email protected]cf4cae32014-05-27 00:39:10396}
397
398void HttpNetworkSession::CloseIdleConnections() {
399 normal_socket_pool_manager_->CloseIdleSockets();
400 websocket_socket_pool_manager_->CloseIdleSockets();
401 spdy_session_pool_.CloseCurrentIdleSessions();
402}
403
bnc3472afd2016-11-17 15:27:21404bool HttpNetworkSession::IsProtocolEnabled(NextProto protocol) const {
bnc8f8225c2016-09-23 21:19:46405 switch (protocol) {
bnc3472afd2016-11-17 15:27:21406 case kProtoUnknown:
bnc8f8225c2016-09-23 21:19:46407 NOTREACHED();
408 return false;
bnc3472afd2016-11-17 15:27:21409 case kProtoHTTP11:
410 return true;
411 case kProtoHTTP2:
412 return params_.enable_http2;
413 case kProtoQUIC:
pmarko6ab8be242017-01-11 11:02:55414 return IsQuicEnabled();
bnc8f8225c2016-09-23 21:19:46415 }
416 NOTREACHED();
417 return false;
[email protected]cf4cae32014-05-27 00:39:10418}
419
zhongyiaf257542016-12-19 03:36:01420void HttpNetworkSession::SetServerPushDelegate(
421 std::unique_ptr<ServerPushDelegate> push_delegate) {
zhongyid7dd2db12017-04-14 17:01:25422 DCHECK(push_delegate);
423 if (!params_.enable_server_push_cancellation || push_delegate_)
424 return;
zhongyiaf257542016-12-19 03:36:01425
426 push_delegate_ = std::move(push_delegate);
427 spdy_session_pool_.set_server_push_delegate(push_delegate_.get());
428 quic_stream_factory_.set_server_push_delegate(push_delegate_.get());
429}
430
bnc1f295372015-10-21 23:24:22431void HttpNetworkSession::GetAlpnProtos(NextProtoVector* alpn_protos) const {
bnc927c4962016-07-21 14:45:59432 *alpn_protos = next_protos_;
bnc1f295372015-10-21 23:24:22433}
434
nharper8cdb0fb2016-04-22 21:34:59435void HttpNetworkSession::GetSSLConfig(const HttpRequestInfo& request,
436 SSLConfig* server_config,
437 SSLConfig* proxy_config) const {
438 ssl_config_service_->GetSSLConfig(server_config);
439 GetAlpnProtos(&server_config->alpn_protos);
nharper8cdb0fb2016-04-22 21:34:59440 *proxy_config = *server_config;
441 if (request.privacy_mode == PRIVACY_MODE_ENABLED) {
442 server_config->channel_id_enabled = false;
mmenke6ddfbea2017-05-31 21:48:41443 } else if (params_.enable_token_binding && context_.channel_id_service) {
nharper8cdb0fb2016-04-22 21:34:59444 server_config->token_binding_params.push_back(TB_PARAM_ECDSAP256);
445 }
446}
447
xunjieli9f8c5fb52016-12-07 22:59:33448void HttpNetworkSession::DumpMemoryStats(
449 base::trace_event::ProcessMemoryDump* pmd,
450 const std::string& parent_absolute_name) const {
xunjielid5debfc2017-02-24 15:55:49451 std::string name = base::StringPrintf("net/http_network_session_0x%" PRIxPTR,
452 reinterpret_cast<uintptr_t>(this));
xunjieli9f8c5fb52016-12-07 22:59:33453 base::trace_event::MemoryAllocatorDump* http_network_session_dump =
454 pmd->GetAllocatorDump(name);
xunjieli2a2468bd2017-01-04 21:17:33455 if (http_network_session_dump == nullptr) {
456 http_network_session_dump = pmd->CreateAllocatorDump(name);
457 normal_socket_pool_manager_->DumpMemoryStats(
458 pmd, http_network_session_dump->absolute_name());
459 spdy_session_pool_.DumpMemoryStats(
460 pmd, http_network_session_dump->absolute_name());
xunjielif5267de2017-01-20 21:18:57461 if (http_stream_factory_) {
462 http_stream_factory_->DumpMemoryStats(
463 pmd, http_network_session_dump->absolute_name());
464 }
xunjieli69720dd2017-01-30 15:36:29465 quic_stream_factory_.DumpMemoryStats(
466 pmd, http_network_session_dump->absolute_name());
xunjieli9f8c5fb52016-12-07 22:59:33467 }
xunjielid5debfc2017-02-24 15:55:49468
xunjieli2a2468bd2017-01-04 21:17:33469 // Create an empty row under parent's dump so size can be attributed correctly
470 // if |this| is shared between URLRequestContexts.
471 base::trace_event::MemoryAllocatorDump* empty_row_dump =
472 pmd->CreateAllocatorDump(base::StringPrintf(
473 "%s/http_network_session", parent_absolute_name.c_str()));
474 pmd->AddOwnershipEdge(empty_row_dump->guid(),
xunjieli9f8c5fb52016-12-07 22:59:33475 http_network_session_dump->guid());
476}
477
pmarko6ab8be242017-01-11 11:02:55478bool HttpNetworkSession::IsQuicEnabled() const {
479 return params_.enable_quic;
480}
481
482void HttpNetworkSession::DisableQuic() {
483 params_.enable_quic = false;
484}
485
[email protected]cf4cae32014-05-27 00:39:10486ClientSocketPoolManager* HttpNetworkSession::GetSocketPoolManager(
487 SocketPoolType pool_type) {
488 switch (pool_type) {
489 case NORMAL_SOCKET_POOL:
490 return normal_socket_pool_manager_.get();
491 case WEBSOCKET_SOCKET_POOL:
492 return websocket_socket_pool_manager_.get();
493 default:
494 NOTREACHED();
495 break;
496 }
497 return NULL;
498}
499
maksim.sisov0adf8592016-07-15 06:25:56500void HttpNetworkSession::OnMemoryPressure(
501 base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) {
yucliu48f235d2018-01-11 00:59:55502 DCHECK(!params_.disable_idle_sockets_close_on_memory_pressure);
503
maksim.sisov0adf8592016-07-15 06:25:56504 switch (memory_pressure_level) {
505 case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE:
yucliu9462d912017-11-22 02:41:23506 break;
yucliu48f235d2018-01-11 00:59:55507
508 case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE:
maksim.sisov0adf8592016-07-15 06:25:56509 case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL:
510 CloseIdleConnections();
511 break;
512 }
513}
514
bashi56b23f302017-02-09 01:24:57515void HttpNetworkSession::OnPurgeMemory() {
516 CloseIdleConnections();
hajimehoshi8156e7c2016-09-29 06:17:52517}
518
ttuttle859dc7a2015-04-23 19:42:29519} // namespace net