blob: 6b0db6c0df7a1940f27bf55d5a4644f37410335d [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"
[email protected]cf4cae32014-05-27 00:39:1013#include "base/logging.h"
vitalybukabfe0e4272015-12-03 01:51:4214#include "base/strings/string_number_conversions.h"
[email protected]cf4cae32014-05-27 00:39:1015#include "base/strings/string_util.h"
xunjieli9f8c5fb52016-12-07 22:59:3316#include "base/strings/stringprintf.h"
17#include "base/trace_event/memory_allocator_dump.h"
xunjielif5267de2017-01-20 21:18:5718#include "base/trace_event/memory_dump_request_args.h"
xunjieli9f8c5fb52016-12-07 22:59:3319#include "base/trace_event/process_memory_dump.h"
[email protected]cf4cae32014-05-27 00:39:1020#include "base/values.h"
Eric Orthbe2efac2019-03-06 01:11:1121#include "net/dns/host_resolver.h"
[email protected]cf4cae32014-05-27 00:39:1022#include "net/http/http_auth_handler_factory.h"
23#include "net/http/http_response_body_drainer.h"
Xida Chen9bfe0b62018-04-24 19:52:2124#include "net/http/http_stream_factory.h"
[email protected]cf4cae32014-05-27 00:39:1025#include "net/http/url_security_manager.h"
Lily Houghtonffe89daa02018-03-09 18:30:0326#include "net/proxy_resolution/proxy_resolution_service.h"
Victor Vasiliev6bb59d22019-03-08 21:34:5127#include "net/quic/platform/impl/quic_chromium_clock.h"
Ryan Hamiltona3ee93a72018-08-01 22:03:0828#include "net/quic/quic_crypto_client_stream_factory.h"
29#include "net/quic/quic_stream_factory.h"
[email protected]cf4cae32014-05-27 00:39:1030#include "net/socket/client_socket_factory.h"
31#include "net/socket/client_socket_pool_manager_impl.h"
32#include "net/socket/next_proto.h"
bnc1e757502014-12-13 02:20:1633#include "net/socket/ssl_client_socket.h"
Bence Béky94658bf2018-05-11 19:22:5834#include "net/spdy/spdy_session_pool.h"
Victor Vasiliev6bb59d22019-03-08 21:34:5135#include "net/third_party/quiche/src/quic/core/crypto/quic_random.h"
36#include "net/third_party/quiche/src/quic/core/quic_packets.h"
37#include "net/third_party/quiche/src/quic/core/quic_tag.h"
38#include "net/third_party/quiche/src/quic/core/quic_utils.h"
[email protected]cf4cae32014-05-27 00:39:1039
ttuttle859dc7a2015-04-23 19:42:2940namespace net {
41
[email protected]cf4cae32014-05-27 00:39:1042namespace {
43
Juan Jose Lopez Jaimez7fa1f002017-11-20 22:13:3344std::unique_ptr<ClientSocketPoolManager> CreateSocketPoolManager(
ttuttle859dc7a2015-04-23 19:42:2945 HttpNetworkSession::SocketPoolType pool_type,
mmenke6ddfbea2017-05-31 21:48:4146 const HttpNetworkSession::Context& context,
Daniel McArdle3a663d62019-01-31 00:48:4747 SSLClientSessionCache* ssl_client_session_cache,
Daniel McArdleda3fa942019-02-15 16:41:2148 SSLClientSessionCache* ssl_client_session_cache_privacy_mode,
Bence Békyda280c62018-04-12 15:08:3749 WebSocketEndpointLockManager* websocket_endpoint_lock_manager) {
[email protected]cf4cae32014-05-27 00:39:1050 // TODO(yutak): Differentiate WebSocket pool manager and allow more
51 // simultaneous connections for WebSockets.
Juan Jose Lopez Jaimez7fa1f002017-11-20 22:13:3352 return std::make_unique<ClientSocketPoolManagerImpl>(
mmenke6ddfbea2017-05-31 21:48:4153 context.net_log,
54 context.client_socket_factory ? context.client_socket_factory
55 : ClientSocketFactory::GetDefaultFactory(),
tbansal16196a1e2017-06-09 01:50:0956 context.socket_performance_watcher_factory,
Tarun Bansaled2b20b642018-10-15 19:51:3257 context.network_quality_estimator, context.host_resolver,
mmenke6ddfbea2017-05-31 21:48:4158 context.cert_verifier, context.channel_id_service,
59 context.transport_security_state, context.cert_transparency_verifier,
Daniel McArdle3a663d62019-01-31 00:48:4760 context.ct_policy_enforcer, ssl_client_session_cache,
Daniel McArdleda3fa942019-02-15 16:41:2161 ssl_client_session_cache_privacy_mode, context.ssl_config_service,
Matt Menked732ea42019-03-08 12:05:0062 websocket_endpoint_lock_manager, context.proxy_delegate,
63 context.http_user_agent_settings, 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.
Ryan Hamilton0239aac2018-05-19 00:03:1377spdy::SettingsMap AddDefaultHttp2Settings(spdy::SettingsMap http2_settings) {
bnc3171a2432016-12-28 18:40:2678 // Set default values only if |http2_settings| does not have
79 // a value set for given setting.
jdoerrie22a91d8b92018-10-05 08:43:2680 auto it = http2_settings.find(spdy::SETTINGS_HEADER_TABLE_SIZE);
bnc3171a2432016-12-28 18:40:2681 if (it == http2_settings.end())
Ryan Hamilton0239aac2018-05-19 00:03:1382 http2_settings[spdy::SETTINGS_HEADER_TABLE_SIZE] = kSpdyMaxHeaderTableSize;
bnc3171a2432016-12-28 18:40:2683
Ryan Hamilton0239aac2018-05-19 00:03:1384 it = http2_settings.find(spdy::SETTINGS_MAX_CONCURRENT_STREAMS);
bnc3171a2432016-12-28 18:40:2685 if (it == http2_settings.end())
Ryan Hamilton0239aac2018-05-19 00:03:1386 http2_settings[spdy::SETTINGS_MAX_CONCURRENT_STREAMS] =
bnc3171a2432016-12-28 18:40:2687 kSpdyMaxConcurrentPushedStreams;
88
Ryan Hamilton0239aac2018-05-19 00:03:1389 it = http2_settings.find(spdy::SETTINGS_INITIAL_WINDOW_SIZE);
bnc3171a2432016-12-28 18:40:2690 if (it == http2_settings.end())
Ryan Hamilton0239aac2018-05-19 00:03:1391 http2_settings[spdy::SETTINGS_INITIAL_WINDOW_SIZE] =
92 kSpdyStreamMaxRecvWindowSize;
bnc3171a2432016-12-28 18:40:2693
94 return http2_settings;
95}
96
97} // unnamed namespace
98
[email protected]cf4cae32014-05-27 00:39:1099HttpNetworkSession::Params::Params()
mmenke6ddfbea2017-05-31 21:48:41100 : enable_server_push_cancellation(false),
[email protected]cf4cae32014-05-27 00:39:10101 ignore_certificate_errors(false),
102 testing_fixed_http_port(0),
103 testing_fixed_https_port(0),
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),
Bence Béky8bfacd42018-02-23 13:05:13110 enable_websocket_over_http2(false),
[email protected]cf4cae32014-05-27 00:39:10111 enable_quic(false),
Ryan Hamilton4cbcbf12018-12-15 05:16:14112 enable_quic_proxies_for_https_urls(false),
Ryan Hamilton8d9ee76e2018-05-29 23:52:52113 quic_max_packet_length(quic::kDefaultMaxPacketSize),
rch1546ccd2017-04-20 02:14:23114 quic_max_server_configs_stored_in_properties(0u),
kapishnikov7f8dd1e2018-01-24 06:10:49115 quic_enable_socket_recv_optimization(false),
rch1546ccd2017-04-20 02:14:23116 mark_quic_broken_when_network_blackholes(false),
Ryan Hamiltonb3827e882018-03-27 03:07:48117 retry_without_alt_svc_on_quic_errors(true),
Yixin Wanga9afead2017-10-19 20:23:10118 support_ietf_format_quic_altsvc(false),
Jana Iyengar903dec22017-11-28 00:44:23119 quic_close_sessions_on_ip_change(false),
Zhongyi Shi63574b72018-06-01 20:22:25120 quic_goaway_sessions_on_ip_change(false),
rtenneti41c09992015-11-30 18:24:01121 quic_idle_connection_timeout_seconds(kIdleConnectionTimeoutSeconds),
Ryan Hamilton8d9ee76e2018-05-29 23:52:52122 quic_reduced_ping_timeout_seconds(quic::kPingTimeoutSecs),
Zhongyi Shie01f2db2019-02-22 19:53:23123 quic_retransmittable_on_wire_timeout_milliseconds(
124 kDefaultRetransmittableOnWireTimeoutMillisecs),
Yixin Wang469da562017-11-15 21:34:58125 quic_max_time_before_crypto_handshake_seconds(
Ryan Hamilton8d9ee76e2018-05-29 23:52:52126 quic::kMaxTimeForCryptoHandshakeSecs),
Yixin Wang469da562017-11-15 21:34:58127 quic_max_idle_time_before_crypto_handshake_seconds(
Ryan Hamilton8d9ee76e2018-05-29 23:52:52128 quic::kInitialIdleTimeoutSecs),
Zhongyi Shif4683a32017-12-01 00:03:28129 quic_migrate_sessions_on_network_change_v2(false),
130 quic_migrate_sessions_early_v2(false),
Zhongyi Shi8de43832018-08-15 23:40:00131 quic_retry_on_alternate_network_before_handshake(false),
Zhongyi Shi32fe14d42019-02-28 00:25:36132 quic_migrate_idle_sessions(false),
Zhongyi Shic16b4102019-02-12 00:37:40133 quic_idle_session_migration_period(base::TimeDelta::FromSeconds(
134 kDefaultIdleSessionMigrationPeriodSeconds)),
Zhongyi Shi73f23ca872017-12-13 18:37:13135 quic_max_time_on_non_default_network(
136 base::TimeDelta::FromSeconds(kMaxTimeOnNonDefaultNetworkSecs)),
Zhongyi Shiee760762018-08-01 00:54:29137 quic_max_migrations_to_non_default_network_on_write_error(
138 kMaxMigrationsToNonDefaultNetworkOnWriteError),
Zhongyi Shi8b1e43f2017-12-13 20:46:30139 quic_max_migrations_to_non_default_network_on_path_degrading(
140 kMaxMigrationsToNonDefaultNetworkOnPathDegrading),
jri217455a12016-07-13 20:15:09141 quic_allow_server_migration(false),
Ryan Hamilton0d326362018-01-30 06:05:10142 quic_allow_remote_alt_svc(true),
Zhongyi Shidbce7f412019-02-01 23:16:29143 quic_race_stale_dns_on_connection(false),
144 quic_go_away_on_path_degrading(false),
xunjieli888c29922016-03-18 21:05:09145 quic_disable_bidirectional_streams(false),
rtennetid073dd22016-08-04 01:58:33146 quic_race_cert_verification(false),
rchd6163f32017-01-30 23:50:38147 quic_estimate_initial_rtt(false),
Yixin Wang079ad542018-01-11 04:06:05148 quic_headers_include_h2_stream_dependency(false),
Nick Harper1e5757d42018-05-02 23:08:57149 enable_channel_id(false),
yucliu48f235d2018-01-11 00:59:55150 http_09_on_non_default_ports_enabled(false),
151 disable_idle_sockets_close_on_memory_pressure(false) {
Ryan Hamilton8d9ee76e2018-05-29 23:52:52152 quic_supported_versions.push_back(quic::QUIC_VERSION_43);
[email protected]cf4cae32014-05-27 00:39:10153}
154
vmpstracd23b72016-02-26 21:08:55155HttpNetworkSession::Params::Params(const Params& other) = default;
156
Chris Watkins7a41d3552017-12-01 02:13:27157HttpNetworkSession::Params::~Params() = default;
[email protected]cf4cae32014-05-27 00:39:10158
mmenke6ddfbea2017-05-31 21:48:41159HttpNetworkSession::Context::Context()
160 : client_socket_factory(nullptr),
161 host_resolver(nullptr),
162 cert_verifier(nullptr),
163 channel_id_service(nullptr),
164 transport_security_state(nullptr),
165 cert_transparency_verifier(nullptr),
166 ct_policy_enforcer(nullptr),
Lily Houghton8c2f97d2018-01-22 05:06:59167 proxy_resolution_service(nullptr),
Wojciech Dzierżanowski1f823562019-01-18 11:26:00168 proxy_delegate(nullptr),
Matt Menked732ea42019-03-08 12:05:00169 http_user_agent_settings(nullptr),
mmenke6ddfbea2017-05-31 21:48:41170 ssl_config_service(nullptr),
171 http_auth_handler_factory(nullptr),
172 net_log(nullptr),
173 socket_performance_watcher_factory(nullptr),
Tarun Bansaled2b20b642018-10-15 19:51:32174 network_quality_estimator(nullptr),
Douglas Creager3cb042052018-11-06 23:08:52175#if BUILDFLAG(ENABLE_REPORTING)
Douglas Creager134b52e2018-11-09 18:00:14176 reporting_service(nullptr),
Douglas Creager3cb042052018-11-06 23:08:52177 network_error_logging_service(nullptr),
178#endif
mmenke6ddfbea2017-05-31 21:48:41179 quic_clock(nullptr),
180 quic_random(nullptr),
181 quic_crypto_client_stream_factory(
Douglas Creager3cb042052018-11-06 23:08:52182 QuicCryptoClientStreamFactory::GetDefaultFactory()) {
183}
mmenke6ddfbea2017-05-31 21:48:41184
185HttpNetworkSession::Context::Context(const Context& other) = default;
186
Chris Watkins7a41d3552017-12-01 02:13:27187HttpNetworkSession::Context::~Context() = default;
mmenke6ddfbea2017-05-31 21:48:41188
[email protected]cf4cae32014-05-27 00:39:10189// TODO(mbelshe): Move the socket factories into HttpStreamFactory.
mmenke6ddfbea2017-05-31 21:48:41190HttpNetworkSession::HttpNetworkSession(const Params& params,
191 const Context& context)
192 : net_log_(context.net_log),
193 http_server_properties_(context.http_server_properties),
194 cert_verifier_(context.cert_verifier),
195 http_auth_handler_factory_(context.http_auth_handler_factory),
Eric Orthbe2efac2019-03-06 01:11:11196 host_resolver_(context.host_resolver),
Douglas Creager3cb042052018-11-06 23:08:52197#if BUILDFLAG(ENABLE_REPORTING)
Douglas Creager134b52e2018-11-09 18:00:14198 reporting_service_(context.reporting_service),
Douglas Creager3cb042052018-11-06 23:08:52199 network_error_logging_service_(context.network_error_logging_service),
200#endif
Lily Houghton8c2f97d2018-01-22 05:06:59201 proxy_resolution_service_(context.proxy_resolution_service),
mmenke6ddfbea2017-05-31 21:48:41202 ssl_config_service_(context.ssl_config_service),
Daniel McArdle3a663d62019-01-31 00:48:47203 ssl_client_session_cache_(SSLClientSessionCache::Config()),
Daniel McArdleda3fa942019-02-15 16:41:21204 ssl_client_session_cache_privacy_mode_(SSLClientSessionCache::Config()),
zhongyiaf257542016-12-19 03:36:01205 push_delegate_(nullptr),
jri2b966f22014-09-02 22:25:36206 quic_stream_factory_(
mmenke6ddfbea2017-05-31 21:48:41207 context.net_log,
208 context.host_resolver,
209 context.ssl_config_service,
210 context.client_socket_factory
211 ? context.client_socket_factory
ttuttle859dc7a2015-04-23 19:42:29212 : ClientSocketFactory::GetDefaultFactory(),
mmenke6ddfbea2017-05-31 21:48:41213 context.http_server_properties,
214 context.cert_verifier,
215 context.ct_policy_enforcer,
mmenke6ddfbea2017-05-31 21:48:41216 context.transport_security_state,
217 context.cert_transparency_verifier,
218 context.socket_performance_watcher_factory,
219 context.quic_crypto_client_stream_factory,
Ryan Hamilton8d9ee76e2018-05-29 23:52:52220 context.quic_random ? context.quic_random
221 : quic::QuicRandom::GetInstance(),
mmenke6ddfbea2017-05-31 21:48:41222 context.quic_clock ? context.quic_clock
Ryan Hamilton8d9ee76e2018-05-29 23:52:52223 : quic::QuicChromiumClock::GetInstance(),
jri2b966f22014-09-02 22:25:36224 params.quic_max_packet_length,
225 params.quic_user_agent_id,
rch431dd4452017-04-19 15:22:35226 params.quic_max_server_configs_stored_in_properties > 0,
Jana Iyengar903dec22017-11-28 00:44:23227 params.quic_close_sessions_on_ip_change,
Zhongyi Shi63574b72018-06-01 20:22:25228 params.quic_goaway_sessions_on_ip_change,
rch9ecde09b2017-04-08 00:18:23229 params.mark_quic_broken_when_network_blackholes,
rtenneti41c09992015-11-30 18:24:01230 params.quic_idle_connection_timeout_seconds,
zhongyidd1439f62016-09-02 02:02:26231 params.quic_reduced_ping_timeout_seconds,
Zhongyi Shie01f2db2019-02-22 19:53:23232 params.quic_retransmittable_on_wire_timeout_milliseconds,
Yixin Wang469da562017-11-15 21:34:58233 params.quic_max_time_before_crypto_handshake_seconds,
234 params.quic_max_idle_time_before_crypto_handshake_seconds,
Zhongyi Shif4683a32017-12-01 00:03:28235 params.quic_migrate_sessions_on_network_change_v2,
236 params.quic_migrate_sessions_early_v2,
Zhongyi Shi8de43832018-08-15 23:40:00237 params.quic_retry_on_alternate_network_before_handshake,
Zhongyi Shi32fe14d42019-02-28 00:25:36238 params.quic_migrate_idle_sessions,
Zhongyi Shic16b4102019-02-12 00:37:40239 params.quic_idle_session_migration_period,
Zhongyi Shi73f23ca872017-12-13 18:37:13240 params.quic_max_time_on_non_default_network,
Zhongyi Shiee760762018-08-01 00:54:29241 params.quic_max_migrations_to_non_default_network_on_write_error,
Zhongyi Shi8b1e43f2017-12-13 20:46:30242 params.quic_max_migrations_to_non_default_network_on_path_degrading,
jri217455a12016-07-13 20:15:09243 params.quic_allow_server_migration,
Zhongyi Shidbce7f412019-02-01 23:16:29244 params.quic_race_stale_dns_on_connection,
245 params.quic_go_away_on_path_degrading,
rtennetid073dd22016-08-04 01:58:33246 params.quic_race_cert_verification,
rchd6163f32017-01-30 23:50:38247 params.quic_estimate_initial_rtt,
Yixin Wang079ad542018-01-11 04:06:05248 params.quic_headers_include_h2_stream_dependency,
nharperd5cddca2016-02-27 03:37:52249 params.quic_connection_options,
Yixin Wang46a425f2017-08-10 23:02:20250 params.quic_client_connection_options,
kapishnikov7f8dd1e2018-01-24 06:10:49251 params.quic_enable_socket_recv_optimization),
mmenke6ddfbea2017-05-31 21:48:41252 spdy_session_pool_(context.host_resolver,
253 context.ssl_config_service,
254 context.http_server_properties,
255 context.transport_security_state,
zhongyi8ac630d2017-06-26 19:46:33256 params.quic_supported_versions,
[email protected]cf4cae32014-05-27 00:39:10257 params.enable_spdy_ping_based_connection_checking,
Yixin Wanga9afead2017-10-19 20:23:10258 params.support_ietf_format_quic_altsvc,
bnc8f0f3b62015-04-08 04:37:23259 params.spdy_session_max_recv_window_size,
bnc3171a2432016-12-28 18:40:26260 AddDefaultHttp2Settings(params.http2_settings),
Bence Béky6a070bcd2018-09-06 15:02:43261 params.greased_http2_frame,
Tarun Bansal647b30d2018-10-19 21:21:47262 params.time_func,
263 context.network_quality_estimator),
Xida Chen9bfe0b62018-04-24 19:52:21264 http_stream_factory_(std::make_unique<HttpStreamFactory>(this)),
mmenke6ddfbea2017-05-31 21:48:41265 params_(params),
266 context_(context) {
Lily Houghton8c2f97d2018-01-22 05:06:59267 DCHECK(proxy_resolution_service_);
Ryan Sleevib8449e02018-07-15 04:31:07268 DCHECK(ssl_config_service_);
[email protected]cf4cae32014-05-27 00:39:10269 CHECK(http_server_properties_);
270
Juan Jose Lopez Jaimez7fa1f002017-11-20 22:13:33271 normal_socket_pool_manager_ = CreateSocketPoolManager(
Daniel McArdle3a663d62019-01-31 00:48:47272 NORMAL_SOCKET_POOL, context, &ssl_client_session_cache_,
Daniel McArdleda3fa942019-02-15 16:41:21273 &ssl_client_session_cache_privacy_mode_,
Bence Béky33a4e432018-12-03 16:17:23274 &websocket_endpoint_lock_manager_);
Juan Jose Lopez Jaimez7fa1f002017-11-20 22:13:33275 websocket_socket_pool_manager_ = CreateSocketPoolManager(
Daniel McArdle3a663d62019-01-31 00:48:47276 WEBSOCKET_SOCKET_POOL, context, &ssl_client_session_cache_,
Daniel McArdleda3fa942019-02-15 16:41:21277 &ssl_client_session_cache_privacy_mode_,
Bence Béky33a4e432018-12-03 16:17:23278 &websocket_endpoint_lock_manager_);
vitalybukabfe0e4272015-12-03 01:51:42279
bnc3f0118e2016-02-02 15:42:22280 if (params_.enable_http2) {
281 next_protos_.push_back(kProtoHTTP2);
bnc3f0118e2016-02-02 15:42:22282 }
283
284 next_protos_.push_back(kProtoHTTP11);
285
rtenneti6971c172016-01-15 20:12:10286 http_server_properties_->SetMaxServerConfigsStoredInProperties(
287 params.quic_max_server_configs_stored_in_properties);
maksim.sisov0adf8592016-07-15 06:25:56288
yucliu48f235d2018-01-11 00:59:55289 if (!params_.disable_idle_sockets_close_on_memory_pressure) {
290 memory_pressure_listener_.reset(
291 new base::MemoryPressureListener(base::BindRepeating(
292 &HttpNetworkSession::OnMemoryPressure, base::Unretained(this))));
293 }
[email protected]cf4cae32014-05-27 00:39:10294}
295
296HttpNetworkSession::~HttpNetworkSession() {
gab47aa7da2017-06-02 16:09:43297 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
avifceb32f62016-10-07 16:30:52298 response_drainers_.clear();
Bence Béky3ba8c332017-12-11 20:19:24299 // TODO(bnc): CloseAllSessions() is also called in SpdySessionPool destructor,
300 // one of the two calls should be removed.
[email protected]cf4cae32014-05-27 00:39:10301 spdy_session_pool_.CloseAllSessions();
302}
303
avifceb32f62016-10-07 16:30:52304void HttpNetworkSession::AddResponseDrainer(
305 std::unique_ptr<HttpResponseBodyDrainer> drainer) {
306 DCHECK(!base::ContainsKey(response_drainers_, drainer.get()));
307 HttpResponseBodyDrainer* drainer_ptr = drainer.get();
308 response_drainers_[drainer_ptr] = std::move(drainer);
[email protected]cf4cae32014-05-27 00:39:10309}
310
311void HttpNetworkSession::RemoveResponseDrainer(
312 HttpResponseBodyDrainer* drainer) {
skyostilb8f60ca2016-08-12 12:34:43313 DCHECK(base::ContainsKey(response_drainers_, drainer));
avifceb32f62016-10-07 16:30:52314 response_drainers_[drainer].release();
[email protected]cf4cae32014-05-27 00:39:10315 response_drainers_.erase(drainer);
316}
317
Matt Menked23ab952019-03-06 00:24:40318TransportClientSocketPool* HttpNetworkSession::GetSocketPool(
[email protected]cf4cae32014-05-27 00:39:10319 SocketPoolType pool_type,
Matt Menked23ab952019-03-06 00:24:40320 const ProxyServer& proxy_server) {
321 return GetSocketPoolManager(pool_type)->GetSocketPool(proxy_server);
[email protected]cf4cae32014-05-27 00:39:10322}
323
danakj1fd259a02016-04-16 03:17:09324std::unique_ptr<base::Value> HttpNetworkSession::SocketPoolInfoToValue() const {
[email protected]cf4cae32014-05-27 00:39:10325 // TODO(yutak): Should merge values from normal pools and WebSocket pools.
326 return normal_socket_pool_manager_->SocketPoolInfoToValue();
327}
328
danakj1fd259a02016-04-16 03:17:09329std::unique_ptr<base::Value> HttpNetworkSession::SpdySessionPoolInfoToValue()
330 const {
[email protected]cf4cae32014-05-27 00:39:10331 return spdy_session_pool_.SpdySessionPoolInfoToValue();
332}
333
danakj1fd259a02016-04-16 03:17:09334std::unique_ptr<base::Value> HttpNetworkSession::QuicInfoToValue() const {
335 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
[email protected]cf4cae32014-05-27 00:39:10336 dict->Set("sessions", quic_stream_factory_.QuicStreamFactoryInfoToValue());
pmarko6ab8be242017-01-11 11:02:55337 dict->SetBoolean("quic_enabled", IsQuicEnabled());
rch53535742017-04-20 00:48:50338
Jeremy Roman0579ed62017-08-29 15:56:19339 auto connection_options(std::make_unique<base::ListValue>());
rch53535742017-04-20 00:48:50340 for (const auto& option : params_.quic_connection_options)
Ryan Hamilton8d9ee76e2018-05-29 23:52:52341 connection_options->AppendString(quic::QuicTagToString(option));
dchengc7eeda422015-12-26 03:56:48342 dict->Set("connection_options", std::move(connection_options));
rtenneti8a2f4632016-03-21 20:26:57343
Jeremy Roman0579ed62017-08-29 15:56:19344 auto supported_versions(std::make_unique<base::ListValue>());
rch53535742017-04-20 00:48:50345 for (const auto& version : params_.quic_supported_versions)
346 supported_versions->AppendString(QuicVersionToString(version));
347 dict->Set("supported_versions", std::move(supported_versions));
348
Jeremy Roman0579ed62017-08-29 15:56:19349 auto origins_to_force_quic_on(std::make_unique<base::ListValue>());
rch53535742017-04-20 00:48:50350 for (const auto& origin : params_.origins_to_force_quic_on)
351 origins_to_force_quic_on->AppendString(origin.ToString());
rtenneti8a2f4632016-03-21 20:26:57352 dict->Set("origins_to_force_quic_on", std::move(origins_to_force_quic_on));
353
rch53535742017-04-20 00:48:50354 dict->SetInteger("max_packet_length", params_.quic_max_packet_length);
rtenneti6971c172016-01-15 20:12:10355 dict->SetInteger("max_server_configs_stored_in_properties",
356 params_.quic_max_server_configs_stored_in_properties);
rtennetif4b29d72016-01-11 19:29:39357 dict->SetInteger("idle_connection_timeout_seconds",
358 params_.quic_idle_connection_timeout_seconds);
zhongyidd1439f62016-09-02 02:02:26359 dict->SetInteger("reduced_ping_timeout_seconds",
360 params_.quic_reduced_ping_timeout_seconds);
rch53535742017-04-20 00:48:50361 dict->SetBoolean("mark_quic_broken_when_network_blackholes",
362 params_.mark_quic_broken_when_network_blackholes);
363 dict->SetBoolean("retry_without_alt_svc_on_quic_errors",
364 params_.retry_without_alt_svc_on_quic_errors);
rtennetid073dd22016-08-04 01:58:33365 dict->SetBoolean("race_cert_verification",
366 params_.quic_race_cert_verification);
rch53535742017-04-20 00:48:50367 dict->SetBoolean("disable_bidirectional_streams",
368 params_.quic_disable_bidirectional_streams);
Jana Iyengar903dec22017-11-28 00:44:23369 dict->SetBoolean("close_sessions_on_ip_change",
370 params_.quic_close_sessions_on_ip_change);
Zhongyi Shi63574b72018-06-01 20:22:25371 dict->SetBoolean("goaway_sessions_on_ip_change",
372 params_.quic_goaway_sessions_on_ip_change);
Zhongyi Shif4683a32017-12-01 00:03:28373 dict->SetBoolean("migrate_sessions_on_network_change_v2",
374 params_.quic_migrate_sessions_on_network_change_v2);
375 dict->SetBoolean("migrate_sessions_early_v2",
376 params_.quic_migrate_sessions_early_v2);
Zhongyi Shie01f2db2019-02-22 19:53:23377 dict->SetInteger("retransmittable_on_wire_timeout_milliseconds",
378 params_.quic_retransmittable_on_wire_timeout_milliseconds);
Zhongyi Shi8de43832018-08-15 23:40:00379 dict->SetBoolean("retry_on_alternate_network_before_handshake",
380 params_.quic_retry_on_alternate_network_before_handshake);
Zhongyi Shi32fe14d42019-02-28 00:25:36381 dict->SetBoolean("migrate_idle_sessions", params_.quic_migrate_idle_sessions);
Zhongyi Shic16b4102019-02-12 00:37:40382 dict->SetInteger("idle_session_migration_period_seconds",
383 params_.quic_idle_session_migration_period.InSeconds());
Zhongyi Shi73f23ca872017-12-13 18:37:13384 dict->SetInteger("max_time_on_non_default_network_seconds",
385 params_.quic_max_time_on_non_default_network.InSeconds());
Zhongyi Shi8b1e43f2017-12-13 20:46:30386 dict->SetInteger(
Zhongyi Shiee760762018-08-01 00:54:29387 "max_num_migrations_to_non_default_network_on_write_error",
388 params_.quic_max_migrations_to_non_default_network_on_write_error);
389 dict->SetInteger(
Zhongyi Shi8b1e43f2017-12-13 20:46:30390 "max_num_migrations_to_non_default_network_on_path_degrading",
391 params_.quic_max_migrations_to_non_default_network_on_path_degrading);
rch53535742017-04-20 00:48:50392 dict->SetBoolean("allow_server_migration",
393 params_.quic_allow_server_migration);
Zhongyi Shidbce7f412019-02-01 23:16:29394 dict->SetBoolean("race_stale_dns_on_connection",
395 params_.quic_race_stale_dns_on_connection);
396 dict->SetBoolean("go_away_on_path_degrading",
397 params_.quic_go_away_on_path_degrading);
rch53535742017-04-20 00:48:50398 dict->SetBoolean("estimate_initial_rtt", params_.quic_estimate_initial_rtt);
zhongyif054cd02017-06-09 07:09:10399 dict->SetBoolean("server_push_cancellation",
400 params_.enable_server_push_cancellation);
rch53535742017-04-20 00:48:50401
dchengc7eeda422015-12-26 03:56:48402 return std::move(dict);
[email protected]cf4cae32014-05-27 00:39:10403}
404
405void HttpNetworkSession::CloseAllConnections() {
406 normal_socket_pool_manager_->FlushSocketPoolsWithError(ERR_ABORTED);
407 websocket_socket_pool_manager_->FlushSocketPoolsWithError(ERR_ABORTED);
408 spdy_session_pool_.CloseCurrentSessions(ERR_ABORTED);
Ryan Hamilton8d9ee76e2018-05-29 23:52:52409 quic_stream_factory_.CloseAllSessions(ERR_ABORTED, quic::QUIC_INTERNAL_ERROR);
[email protected]cf4cae32014-05-27 00:39:10410}
411
412void HttpNetworkSession::CloseIdleConnections() {
413 normal_socket_pool_manager_->CloseIdleSockets();
414 websocket_socket_pool_manager_->CloseIdleSockets();
415 spdy_session_pool_.CloseCurrentIdleSessions();
416}
417
bnc3472afd2016-11-17 15:27:21418bool HttpNetworkSession::IsProtocolEnabled(NextProto protocol) const {
bnc8f8225c2016-09-23 21:19:46419 switch (protocol) {
bnc3472afd2016-11-17 15:27:21420 case kProtoUnknown:
bnc8f8225c2016-09-23 21:19:46421 NOTREACHED();
422 return false;
bnc3472afd2016-11-17 15:27:21423 case kProtoHTTP11:
424 return true;
425 case kProtoHTTP2:
426 return params_.enable_http2;
427 case kProtoQUIC:
pmarko6ab8be242017-01-11 11:02:55428 return IsQuicEnabled();
bnc8f8225c2016-09-23 21:19:46429 }
430 NOTREACHED();
431 return false;
[email protected]cf4cae32014-05-27 00:39:10432}
433
zhongyiaf257542016-12-19 03:36:01434void HttpNetworkSession::SetServerPushDelegate(
435 std::unique_ptr<ServerPushDelegate> push_delegate) {
zhongyid7dd2db12017-04-14 17:01:25436 DCHECK(push_delegate);
437 if (!params_.enable_server_push_cancellation || push_delegate_)
438 return;
zhongyiaf257542016-12-19 03:36:01439
440 push_delegate_ = std::move(push_delegate);
441 spdy_session_pool_.set_server_push_delegate(push_delegate_.get());
442 quic_stream_factory_.set_server_push_delegate(push_delegate_.get());
443}
444
bnc1f295372015-10-21 23:24:22445void HttpNetworkSession::GetAlpnProtos(NextProtoVector* alpn_protos) const {
bnc927c4962016-07-21 14:45:59446 *alpn_protos = next_protos_;
bnc1f295372015-10-21 23:24:22447}
448
nharper8cdb0fb2016-04-22 21:34:59449void HttpNetworkSession::GetSSLConfig(const HttpRequestInfo& request,
450 SSLConfig* server_config,
451 SSLConfig* proxy_config) const {
452 ssl_config_service_->GetSSLConfig(server_config);
453 GetAlpnProtos(&server_config->alpn_protos);
Jesse Seloverdaf87902018-12-03 20:44:30454 server_config->ignore_certificate_errors = params_.ignore_certificate_errors;
nharper8cdb0fb2016-04-22 21:34:59455 *proxy_config = *server_config;
456 if (request.privacy_mode == PRIVACY_MODE_ENABLED) {
457 server_config->channel_id_enabled = false;
Nick Harper1e5757d42018-05-02 23:08:57458 } else {
459 server_config->channel_id_enabled = params_.enable_channel_id;
Nick Harper25a0c4b2018-06-07 23:40:01460 proxy_config->channel_id_enabled = params_.enable_channel_id;
nharper8cdb0fb2016-04-22 21:34:59461 }
462}
463
xunjieli9f8c5fb52016-12-07 22:59:33464void HttpNetworkSession::DumpMemoryStats(
465 base::trace_event::ProcessMemoryDump* pmd,
466 const std::string& parent_absolute_name) const {
xunjielid5debfc2017-02-24 15:55:49467 std::string name = base::StringPrintf("net/http_network_session_0x%" PRIxPTR,
468 reinterpret_cast<uintptr_t>(this));
xunjieli9f8c5fb52016-12-07 22:59:33469 base::trace_event::MemoryAllocatorDump* http_network_session_dump =
470 pmd->GetAllocatorDump(name);
xunjieli2a2468bd2017-01-04 21:17:33471 if (http_network_session_dump == nullptr) {
472 http_network_session_dump = pmd->CreateAllocatorDump(name);
473 normal_socket_pool_manager_->DumpMemoryStats(
474 pmd, http_network_session_dump->absolute_name());
475 spdy_session_pool_.DumpMemoryStats(
476 pmd, http_network_session_dump->absolute_name());
xunjielif5267de2017-01-20 21:18:57477 if (http_stream_factory_) {
478 http_stream_factory_->DumpMemoryStats(
479 pmd, http_network_session_dump->absolute_name());
480 }
xunjieli69720dd2017-01-30 15:36:29481 quic_stream_factory_.DumpMemoryStats(
482 pmd, http_network_session_dump->absolute_name());
Daniel McArdle3a663d62019-01-31 00:48:47483 ssl_client_session_cache_.DumpMemoryStats(pmd, name);
xunjieli9f8c5fb52016-12-07 22:59:33484 }
xunjielid5debfc2017-02-24 15:55:49485
xunjieli2a2468bd2017-01-04 21:17:33486 // Create an empty row under parent's dump so size can be attributed correctly
487 // if |this| is shared between URLRequestContexts.
488 base::trace_event::MemoryAllocatorDump* empty_row_dump =
489 pmd->CreateAllocatorDump(base::StringPrintf(
490 "%s/http_network_session", parent_absolute_name.c_str()));
491 pmd->AddOwnershipEdge(empty_row_dump->guid(),
xunjieli9f8c5fb52016-12-07 22:59:33492 http_network_session_dump->guid());
493}
494
pmarko6ab8be242017-01-11 11:02:55495bool HttpNetworkSession::IsQuicEnabled() const {
496 return params_.enable_quic;
497}
498
499void HttpNetworkSession::DisableQuic() {
500 params_.enable_quic = false;
501}
502
Daniel McArdle3a663d62019-01-31 00:48:47503void HttpNetworkSession::ClearSSLSessionCache() {
504 ssl_client_session_cache_.Flush();
Daniel McArdleda3fa942019-02-15 16:41:21505 ssl_client_session_cache_privacy_mode_.Flush();
Daniel McArdle3a663d62019-01-31 00:48:47506}
507
[email protected]cf4cae32014-05-27 00:39:10508ClientSocketPoolManager* HttpNetworkSession::GetSocketPoolManager(
509 SocketPoolType pool_type) {
510 switch (pool_type) {
511 case NORMAL_SOCKET_POOL:
512 return normal_socket_pool_manager_.get();
513 case WEBSOCKET_SOCKET_POOL:
514 return websocket_socket_pool_manager_.get();
515 default:
516 NOTREACHED();
517 break;
518 }
519 return NULL;
520}
521
maksim.sisov0adf8592016-07-15 06:25:56522void HttpNetworkSession::OnMemoryPressure(
523 base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) {
yucliu48f235d2018-01-11 00:59:55524 DCHECK(!params_.disable_idle_sockets_close_on_memory_pressure);
525
maksim.sisov0adf8592016-07-15 06:25:56526 switch (memory_pressure_level) {
527 case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE:
yucliu9462d912017-11-22 02:41:23528 break;
yucliu48f235d2018-01-11 00:59:55529
530 case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE:
maksim.sisov0adf8592016-07-15 06:25:56531 case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL:
532 CloseIdleConnections();
533 break;
534 }
535}
536
ttuttle859dc7a2015-04-23 19:42:29537} // namespace net