blob: 40d175519ac33c7c5fe69aaa2858056c5f7f717b [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"
Steven Valdez89a44ea92019-05-01 15:18:4921#include "net/base/features.h"
Eric Orthbe2efac2019-03-06 01:11:1122#include "net/dns/host_resolver.h"
[email protected]cf4cae32014-05-27 00:39:1023#include "net/http/http_auth_handler_factory.h"
24#include "net/http/http_response_body_drainer.h"
Xida Chen9bfe0b62018-04-24 19:52:2125#include "net/http/http_stream_factory.h"
[email protected]cf4cae32014-05-27 00:39:1026#include "net/http/url_security_manager.h"
Lily Houghtonffe89daa02018-03-09 18:30:0327#include "net/proxy_resolution/proxy_resolution_service.h"
Victor Vasiliev6bb59d22019-03-08 21:34:5128#include "net/quic/platform/impl/quic_chromium_clock.h"
Ryan Hamiltona3ee93a72018-08-01 22:03:0829#include "net/quic/quic_crypto_client_stream_factory.h"
30#include "net/quic/quic_stream_factory.h"
[email protected]cf4cae32014-05-27 00:39:1031#include "net/socket/client_socket_factory.h"
32#include "net/socket/client_socket_pool_manager_impl.h"
33#include "net/socket/next_proto.h"
bnc1e757502014-12-13 02:20:1634#include "net/socket/ssl_client_socket.h"
Bence Béky94658bf2018-05-11 19:22:5835#include "net/spdy/spdy_session_pool.h"
Victor Vasiliev6bb59d22019-03-08 21:34:5136#include "net/third_party/quiche/src/quic/core/crypto/quic_random.h"
37#include "net/third_party/quiche/src/quic/core/quic_packets.h"
38#include "net/third_party/quiche/src/quic/core/quic_tag.h"
39#include "net/third_party/quiche/src/quic/core/quic_utils.h"
[email protected]cf4cae32014-05-27 00:39:1040
ttuttle859dc7a2015-04-23 19:42:2941namespace net {
42
[email protected]cf4cae32014-05-27 00:39:1043namespace {
44
Matt Menked6fd2a52019-03-20 06:14:3645SSLClientSocketContext CreateClientSocketContext(
mmenke6ddfbea2017-05-31 21:48:4146 const HttpNetworkSession::Context& context,
Matt Menked6fd2a52019-03-20 06:14:3647 SSLClientSessionCache* ssl_client_session_cache) {
48 return SSLClientSocketContext(
David Benjamin0f5fd352019-03-21 20:02:5349 context.cert_verifier, context.transport_security_state,
50 context.cert_transparency_verifier, context.ct_policy_enforcer,
51 ssl_client_session_cache);
[email protected]cf4cae32014-05-27 00:39:1052}
53
54} // unnamed namespace
55
bnc8f0f3b62015-04-08 04:37:2356// The maximum receive window sizes for HTTP/2 sessions and streams.
Avi Drissman13fc8932015-12-20 04:40:4657const int32_t kSpdySessionMaxRecvWindowSize = 15 * 1024 * 1024; // 15 MB
58const int32_t kSpdyStreamMaxRecvWindowSize = 6 * 1024 * 1024; // 6 MB
bnc8f0f3b62015-04-08 04:37:2359
bnc3171a2432016-12-28 18:40:2660namespace {
61
62// Keep all HTTP2 parameters in |http2_settings|, even the ones that are not
63// implemented, to be sent to the server.
64// Set default values for settings that |http2_settings| does not specify.
Ryan Hamilton0239aac2018-05-19 00:03:1365spdy::SettingsMap AddDefaultHttp2Settings(spdy::SettingsMap http2_settings) {
bnc3171a2432016-12-28 18:40:2666 // Set default values only if |http2_settings| does not have
67 // a value set for given setting.
jdoerrie22a91d8b92018-10-05 08:43:2668 auto it = http2_settings.find(spdy::SETTINGS_HEADER_TABLE_SIZE);
bnc3171a2432016-12-28 18:40:2669 if (it == http2_settings.end())
Ryan Hamilton0239aac2018-05-19 00:03:1370 http2_settings[spdy::SETTINGS_HEADER_TABLE_SIZE] = kSpdyMaxHeaderTableSize;
bnc3171a2432016-12-28 18:40:2671
Ryan Hamilton0239aac2018-05-19 00:03:1372 it = http2_settings.find(spdy::SETTINGS_MAX_CONCURRENT_STREAMS);
bnc3171a2432016-12-28 18:40:2673 if (it == http2_settings.end())
Ryan Hamilton0239aac2018-05-19 00:03:1374 http2_settings[spdy::SETTINGS_MAX_CONCURRENT_STREAMS] =
bnc3171a2432016-12-28 18:40:2675 kSpdyMaxConcurrentPushedStreams;
76
Ryan Hamilton0239aac2018-05-19 00:03:1377 it = http2_settings.find(spdy::SETTINGS_INITIAL_WINDOW_SIZE);
bnc3171a2432016-12-28 18:40:2678 if (it == http2_settings.end())
Ryan Hamilton0239aac2018-05-19 00:03:1379 http2_settings[spdy::SETTINGS_INITIAL_WINDOW_SIZE] =
80 kSpdyStreamMaxRecvWindowSize;
bnc3171a2432016-12-28 18:40:2681
82 return http2_settings;
83}
84
85} // unnamed namespace
86
[email protected]cf4cae32014-05-27 00:39:1087HttpNetworkSession::Params::Params()
mmenke6ddfbea2017-05-31 21:48:4188 : enable_server_push_cancellation(false),
[email protected]cf4cae32014-05-27 00:39:1089 ignore_certificate_errors(false),
90 testing_fixed_http_port(0),
91 testing_fixed_https_port(0),
rch1546ccd2017-04-20 02:14:2392 enable_user_alternate_protocol_ports(false),
[email protected]cf4cae32014-05-27 00:39:1093 enable_spdy_ping_based_connection_checking(true),
bncefcd9652016-02-03 18:00:3294 enable_http2(true),
bnc8f0f3b62015-04-08 04:37:2395 spdy_session_max_recv_window_size(kSpdySessionMaxRecvWindowSize),
[email protected]cf4cae32014-05-27 00:39:1096 time_func(&base::TimeTicks::Now),
bnca86731e2017-04-17 12:31:2897 enable_http2_alternative_service(false),
Bence Béky8bfacd42018-02-23 13:05:1398 enable_websocket_over_http2(false),
[email protected]cf4cae32014-05-27 00:39:1099 enable_quic(false),
Ryan Hamilton4cbcbf12018-12-15 05:16:14100 enable_quic_proxies_for_https_urls(false),
Ryan Hamilton8d9ee76e2018-05-29 23:52:52101 quic_max_packet_length(quic::kDefaultMaxPacketSize),
rch1546ccd2017-04-20 02:14:23102 quic_max_server_configs_stored_in_properties(0u),
kapishnikov7f8dd1e2018-01-24 06:10:49103 quic_enable_socket_recv_optimization(false),
rch1546ccd2017-04-20 02:14:23104 mark_quic_broken_when_network_blackholes(false),
Ryan Hamiltonb3827e882018-03-27 03:07:48105 retry_without_alt_svc_on_quic_errors(true),
Yixin Wanga9afead2017-10-19 20:23:10106 support_ietf_format_quic_altsvc(false),
Jana Iyengar903dec22017-11-28 00:44:23107 quic_close_sessions_on_ip_change(false),
Zhongyi Shi63574b72018-06-01 20:22:25108 quic_goaway_sessions_on_ip_change(false),
rtenneti41c09992015-11-30 18:24:01109 quic_idle_connection_timeout_seconds(kIdleConnectionTimeoutSeconds),
Ryan Hamilton8d9ee76e2018-05-29 23:52:52110 quic_reduced_ping_timeout_seconds(quic::kPingTimeoutSecs),
Zhongyi Shi99d0cdd2019-05-21 01:18:42111 quic_retransmittable_on_wire_timeout_milliseconds(0),
Yixin Wang469da562017-11-15 21:34:58112 quic_max_time_before_crypto_handshake_seconds(
Ryan Hamilton8d9ee76e2018-05-29 23:52:52113 quic::kMaxTimeForCryptoHandshakeSecs),
Yixin Wang469da562017-11-15 21:34:58114 quic_max_idle_time_before_crypto_handshake_seconds(
Ryan Hamilton8d9ee76e2018-05-29 23:52:52115 quic::kInitialIdleTimeoutSecs),
Zhongyi Shif4683a32017-12-01 00:03:28116 quic_migrate_sessions_on_network_change_v2(false),
117 quic_migrate_sessions_early_v2(false),
Zhongyi Shi8de43832018-08-15 23:40:00118 quic_retry_on_alternate_network_before_handshake(false),
Zhongyi Shi32fe14d42019-02-28 00:25:36119 quic_migrate_idle_sessions(false),
Zhongyi Shic16b4102019-02-12 00:37:40120 quic_idle_session_migration_period(base::TimeDelta::FromSeconds(
121 kDefaultIdleSessionMigrationPeriodSeconds)),
Zhongyi Shi73f23ca872017-12-13 18:37:13122 quic_max_time_on_non_default_network(
123 base::TimeDelta::FromSeconds(kMaxTimeOnNonDefaultNetworkSecs)),
Zhongyi Shiee760762018-08-01 00:54:29124 quic_max_migrations_to_non_default_network_on_write_error(
125 kMaxMigrationsToNonDefaultNetworkOnWriteError),
Zhongyi Shi8b1e43f2017-12-13 20:46:30126 quic_max_migrations_to_non_default_network_on_path_degrading(
127 kMaxMigrationsToNonDefaultNetworkOnPathDegrading),
jri217455a12016-07-13 20:15:09128 quic_allow_server_migration(false),
Ryan Hamilton0d326362018-01-30 06:05:10129 quic_allow_remote_alt_svc(true),
Zhongyi Shidbce7f412019-02-01 23:16:29130 quic_race_stale_dns_on_connection(false),
131 quic_go_away_on_path_degrading(false),
xunjieli888c29922016-03-18 21:05:09132 quic_disable_bidirectional_streams(false),
rtennetid073dd22016-08-04 01:58:33133 quic_race_cert_verification(false),
rchd6163f32017-01-30 23:50:38134 quic_estimate_initial_rtt(false),
Yixin Wang079ad542018-01-11 04:06:05135 quic_headers_include_h2_stream_dependency(false),
Renjiea0522f062019-04-29 18:52:21136 quic_initial_rtt_for_handshake_milliseconds(0),
yucliu48f235d2018-01-11 00:59:55137 http_09_on_non_default_ports_enabled(false),
138 disable_idle_sockets_close_on_memory_pressure(false) {
Nick Harper23290b82019-05-02 00:02:56139 quic_supported_versions.push_back(quic::ParsedQuicVersion(
Ryan Hamilton3cbc5632019-05-20 17:16:29140 quic::PROTOCOL_QUIC_CRYPTO, quic::QUIC_VERSION_46));
Steven Valdez89a44ea92019-05-01 15:18:49141 enable_early_data =
142 base::FeatureList::IsEnabled(features::kEnableTLS13EarlyData);
[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),
mmenke6ddfbea2017-05-31 21:48:41153 transport_security_state(nullptr),
154 cert_transparency_verifier(nullptr),
155 ct_policy_enforcer(nullptr),
Lily Houghton8c2f97d2018-01-22 05:06:59156 proxy_resolution_service(nullptr),
Wojciech Dzierżanowski1f823562019-01-18 11:26:00157 proxy_delegate(nullptr),
Matt Menked732ea42019-03-08 12:05:00158 http_user_agent_settings(nullptr),
mmenke6ddfbea2017-05-31 21:48:41159 ssl_config_service(nullptr),
160 http_auth_handler_factory(nullptr),
161 net_log(nullptr),
162 socket_performance_watcher_factory(nullptr),
Tarun Bansaled2b20b642018-10-15 19:51:32163 network_quality_estimator(nullptr),
Douglas Creager3cb042052018-11-06 23:08:52164#if BUILDFLAG(ENABLE_REPORTING)
Douglas Creager134b52e2018-11-09 18:00:14165 reporting_service(nullptr),
Douglas Creager3cb042052018-11-06 23:08:52166 network_error_logging_service(nullptr),
167#endif
mmenke6ddfbea2017-05-31 21:48:41168 quic_clock(nullptr),
169 quic_random(nullptr),
170 quic_crypto_client_stream_factory(
Douglas Creager3cb042052018-11-06 23:08:52171 QuicCryptoClientStreamFactory::GetDefaultFactory()) {
172}
mmenke6ddfbea2017-05-31 21:48:41173
174HttpNetworkSession::Context::Context(const Context& other) = default;
175
Chris Watkins7a41d3552017-12-01 02:13:27176HttpNetworkSession::Context::~Context() = default;
mmenke6ddfbea2017-05-31 21:48:41177
[email protected]cf4cae32014-05-27 00:39:10178// TODO(mbelshe): Move the socket factories into HttpStreamFactory.
mmenke6ddfbea2017-05-31 21:48:41179HttpNetworkSession::HttpNetworkSession(const Params& params,
180 const Context& context)
181 : net_log_(context.net_log),
182 http_server_properties_(context.http_server_properties),
183 cert_verifier_(context.cert_verifier),
184 http_auth_handler_factory_(context.http_auth_handler_factory),
Eric Orthbe2efac2019-03-06 01:11:11185 host_resolver_(context.host_resolver),
Douglas Creager3cb042052018-11-06 23:08:52186#if BUILDFLAG(ENABLE_REPORTING)
Douglas Creager134b52e2018-11-09 18:00:14187 reporting_service_(context.reporting_service),
Douglas Creager3cb042052018-11-06 23:08:52188 network_error_logging_service_(context.network_error_logging_service),
189#endif
Lily Houghton8c2f97d2018-01-22 05:06:59190 proxy_resolution_service_(context.proxy_resolution_service),
mmenke6ddfbea2017-05-31 21:48:41191 ssl_config_service_(context.ssl_config_service),
Daniel McArdle3a663d62019-01-31 00:48:47192 ssl_client_session_cache_(SSLClientSessionCache::Config()),
Daniel McArdleda3fa942019-02-15 16:41:21193 ssl_client_session_cache_privacy_mode_(SSLClientSessionCache::Config()),
zhongyiaf257542016-12-19 03:36:01194 push_delegate_(nullptr),
jri2b966f22014-09-02 22:25:36195 quic_stream_factory_(
mmenke6ddfbea2017-05-31 21:48:41196 context.net_log,
197 context.host_resolver,
198 context.ssl_config_service,
199 context.client_socket_factory
200 ? context.client_socket_factory
ttuttle859dc7a2015-04-23 19:42:29201 : ClientSocketFactory::GetDefaultFactory(),
mmenke6ddfbea2017-05-31 21:48:41202 context.http_server_properties,
203 context.cert_verifier,
204 context.ct_policy_enforcer,
mmenke6ddfbea2017-05-31 21:48:41205 context.transport_security_state,
206 context.cert_transparency_verifier,
207 context.socket_performance_watcher_factory,
208 context.quic_crypto_client_stream_factory,
Ryan Hamilton8d9ee76e2018-05-29 23:52:52209 context.quic_random ? context.quic_random
210 : quic::QuicRandom::GetInstance(),
mmenke6ddfbea2017-05-31 21:48:41211 context.quic_clock ? context.quic_clock
Ryan Hamilton8d9ee76e2018-05-29 23:52:52212 : quic::QuicChromiumClock::GetInstance(),
jri2b966f22014-09-02 22:25:36213 params.quic_max_packet_length,
214 params.quic_user_agent_id,
rch431dd4452017-04-19 15:22:35215 params.quic_max_server_configs_stored_in_properties > 0,
Jana Iyengar903dec22017-11-28 00:44:23216 params.quic_close_sessions_on_ip_change,
Zhongyi Shi63574b72018-06-01 20:22:25217 params.quic_goaway_sessions_on_ip_change,
rch9ecde09b2017-04-08 00:18:23218 params.mark_quic_broken_when_network_blackholes,
rtenneti41c09992015-11-30 18:24:01219 params.quic_idle_connection_timeout_seconds,
zhongyidd1439f62016-09-02 02:02:26220 params.quic_reduced_ping_timeout_seconds,
Zhongyi Shie01f2db2019-02-22 19:53:23221 params.quic_retransmittable_on_wire_timeout_milliseconds,
Yixin Wang469da562017-11-15 21:34:58222 params.quic_max_time_before_crypto_handshake_seconds,
223 params.quic_max_idle_time_before_crypto_handshake_seconds,
Zhongyi Shif4683a32017-12-01 00:03:28224 params.quic_migrate_sessions_on_network_change_v2,
225 params.quic_migrate_sessions_early_v2,
Zhongyi Shi8de43832018-08-15 23:40:00226 params.quic_retry_on_alternate_network_before_handshake,
Zhongyi Shi32fe14d42019-02-28 00:25:36227 params.quic_migrate_idle_sessions,
Zhongyi Shic16b4102019-02-12 00:37:40228 params.quic_idle_session_migration_period,
Zhongyi Shi73f23ca872017-12-13 18:37:13229 params.quic_max_time_on_non_default_network,
Zhongyi Shiee760762018-08-01 00:54:29230 params.quic_max_migrations_to_non_default_network_on_write_error,
Zhongyi Shi8b1e43f2017-12-13 20:46:30231 params.quic_max_migrations_to_non_default_network_on_path_degrading,
jri217455a12016-07-13 20:15:09232 params.quic_allow_server_migration,
Zhongyi Shidbce7f412019-02-01 23:16:29233 params.quic_race_stale_dns_on_connection,
234 params.quic_go_away_on_path_degrading,
rtennetid073dd22016-08-04 01:58:33235 params.quic_race_cert_verification,
rchd6163f32017-01-30 23:50:38236 params.quic_estimate_initial_rtt,
Yixin Wang079ad542018-01-11 04:06:05237 params.quic_headers_include_h2_stream_dependency,
nharperd5cddca2016-02-27 03:37:52238 params.quic_connection_options,
Yixin Wang46a425f2017-08-10 23:02:20239 params.quic_client_connection_options,
Renjiea0522f062019-04-29 18:52:21240 params.quic_enable_socket_recv_optimization,
241 params.quic_initial_rtt_for_handshake_milliseconds),
mmenke6ddfbea2017-05-31 21:48:41242 spdy_session_pool_(context.host_resolver,
243 context.ssl_config_service,
244 context.http_server_properties,
245 context.transport_security_state,
zhongyi8ac630d2017-06-26 19:46:33246 params.quic_supported_versions,
[email protected]cf4cae32014-05-27 00:39:10247 params.enable_spdy_ping_based_connection_checking,
Yixin Wanga9afead2017-10-19 20:23:10248 params.support_ietf_format_quic_altsvc,
bnc8f0f3b62015-04-08 04:37:23249 params.spdy_session_max_recv_window_size,
bnc3171a2432016-12-28 18:40:26250 AddDefaultHttp2Settings(params.http2_settings),
Bence Béky6a070bcd2018-09-06 15:02:43251 params.greased_http2_frame,
Tarun Bansal647b30d2018-10-19 21:21:47252 params.time_func,
253 context.network_quality_estimator),
Xida Chen9bfe0b62018-04-24 19:52:21254 http_stream_factory_(std::make_unique<HttpStreamFactory>(this)),
mmenke6ddfbea2017-05-31 21:48:41255 params_(params),
256 context_(context) {
Lily Houghton8c2f97d2018-01-22 05:06:59257 DCHECK(proxy_resolution_service_);
Ryan Sleevib8449e02018-07-15 04:31:07258 DCHECK(ssl_config_service_);
[email protected]cf4cae32014-05-27 00:39:10259 CHECK(http_server_properties_);
260
Matt Menked6fd2a52019-03-20 06:14:36261 normal_socket_pool_manager_ = std::make_unique<ClientSocketPoolManagerImpl>(
262 CreateCommonConnectJobParams(false /* for_websockets */),
263 CreateCommonConnectJobParams(true /* for_websockets */),
264 context_.ssl_config_service, NORMAL_SOCKET_POOL);
265 websocket_socket_pool_manager_ =
266 std::make_unique<ClientSocketPoolManagerImpl>(
267 CreateCommonConnectJobParams(false /* for_websockets */),
268 CreateCommonConnectJobParams(true /* for_websockets */),
269 context_.ssl_config_service, WEBSOCKET_SOCKET_POOL);
vitalybukabfe0e4272015-12-03 01:51:42270
Matt Menked6fd2a52019-03-20 06:14:36271 if (params_.enable_http2)
bnc3f0118e2016-02-02 15:42:22272 next_protos_.push_back(kProtoHTTP2);
bnc3f0118e2016-02-02 15:42:22273
274 next_protos_.push_back(kProtoHTTP11);
275
rtenneti6971c172016-01-15 20:12:10276 http_server_properties_->SetMaxServerConfigsStoredInProperties(
277 params.quic_max_server_configs_stored_in_properties);
maksim.sisov0adf8592016-07-15 06:25:56278
yucliu48f235d2018-01-11 00:59:55279 if (!params_.disable_idle_sockets_close_on_memory_pressure) {
280 memory_pressure_listener_.reset(
281 new base::MemoryPressureListener(base::BindRepeating(
282 &HttpNetworkSession::OnMemoryPressure, base::Unretained(this))));
283 }
[email protected]cf4cae32014-05-27 00:39:10284}
285
286HttpNetworkSession::~HttpNetworkSession() {
gab47aa7da2017-06-02 16:09:43287 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
avifceb32f62016-10-07 16:30:52288 response_drainers_.clear();
Bence Béky3ba8c332017-12-11 20:19:24289 // TODO(bnc): CloseAllSessions() is also called in SpdySessionPool destructor,
290 // one of the two calls should be removed.
[email protected]cf4cae32014-05-27 00:39:10291 spdy_session_pool_.CloseAllSessions();
292}
293
avifceb32f62016-10-07 16:30:52294void HttpNetworkSession::AddResponseDrainer(
295 std::unique_ptr<HttpResponseBodyDrainer> drainer) {
Jan Wilken Dörrie21f9de72019-06-07 10:41:53296 DCHECK(!base::Contains(response_drainers_, drainer.get()));
avifceb32f62016-10-07 16:30:52297 HttpResponseBodyDrainer* drainer_ptr = drainer.get();
298 response_drainers_[drainer_ptr] = std::move(drainer);
[email protected]cf4cae32014-05-27 00:39:10299}
300
301void HttpNetworkSession::RemoveResponseDrainer(
302 HttpResponseBodyDrainer* drainer) {
Jan Wilken Dörrie21f9de72019-06-07 10:41:53303 DCHECK(base::Contains(response_drainers_, drainer));
avifceb32f62016-10-07 16:30:52304 response_drainers_[drainer].release();
[email protected]cf4cae32014-05-27 00:39:10305 response_drainers_.erase(drainer);
306}
307
Matt Menke12d33db92019-03-26 22:45:44308ClientSocketPool* HttpNetworkSession::GetSocketPool(
[email protected]cf4cae32014-05-27 00:39:10309 SocketPoolType pool_type,
Matt Menked23ab952019-03-06 00:24:40310 const ProxyServer& proxy_server) {
311 return GetSocketPoolManager(pool_type)->GetSocketPool(proxy_server);
[email protected]cf4cae32014-05-27 00:39:10312}
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());
rch53535742017-04-20 00:48:50328
Jeremy Roman0579ed62017-08-29 15:56:19329 auto connection_options(std::make_unique<base::ListValue>());
rch53535742017-04-20 00:48:50330 for (const auto& option : params_.quic_connection_options)
Ryan Hamilton8d9ee76e2018-05-29 23:52:52331 connection_options->AppendString(quic::QuicTagToString(option));
dchengc7eeda422015-12-26 03:56:48332 dict->Set("connection_options", std::move(connection_options));
rtenneti8a2f4632016-03-21 20:26:57333
Jeremy Roman0579ed62017-08-29 15:56:19334 auto supported_versions(std::make_unique<base::ListValue>());
rch53535742017-04-20 00:48:50335 for (const auto& version : params_.quic_supported_versions)
Nick Harper23290b82019-05-02 00:02:56336 supported_versions->AppendString(ParsedQuicVersionToString(version));
rch53535742017-04-20 00:48:50337 dict->Set("supported_versions", std::move(supported_versions));
338
Jeremy Roman0579ed62017-08-29 15:56:19339 auto origins_to_force_quic_on(std::make_unique<base::ListValue>());
rch53535742017-04-20 00:48:50340 for (const auto& origin : params_.origins_to_force_quic_on)
341 origins_to_force_quic_on->AppendString(origin.ToString());
rtenneti8a2f4632016-03-21 20:26:57342 dict->Set("origins_to_force_quic_on", std::move(origins_to_force_quic_on));
343
rch53535742017-04-20 00:48:50344 dict->SetInteger("max_packet_length", params_.quic_max_packet_length);
rtenneti6971c172016-01-15 20:12:10345 dict->SetInteger("max_server_configs_stored_in_properties",
346 params_.quic_max_server_configs_stored_in_properties);
rtennetif4b29d72016-01-11 19:29:39347 dict->SetInteger("idle_connection_timeout_seconds",
348 params_.quic_idle_connection_timeout_seconds);
zhongyidd1439f62016-09-02 02:02:26349 dict->SetInteger("reduced_ping_timeout_seconds",
350 params_.quic_reduced_ping_timeout_seconds);
rch53535742017-04-20 00:48:50351 dict->SetBoolean("mark_quic_broken_when_network_blackholes",
352 params_.mark_quic_broken_when_network_blackholes);
353 dict->SetBoolean("retry_without_alt_svc_on_quic_errors",
354 params_.retry_without_alt_svc_on_quic_errors);
rtennetid073dd22016-08-04 01:58:33355 dict->SetBoolean("race_cert_verification",
356 params_.quic_race_cert_verification);
rch53535742017-04-20 00:48:50357 dict->SetBoolean("disable_bidirectional_streams",
358 params_.quic_disable_bidirectional_streams);
Jana Iyengar903dec22017-11-28 00:44:23359 dict->SetBoolean("close_sessions_on_ip_change",
360 params_.quic_close_sessions_on_ip_change);
Zhongyi Shi63574b72018-06-01 20:22:25361 dict->SetBoolean("goaway_sessions_on_ip_change",
362 params_.quic_goaway_sessions_on_ip_change);
Zhongyi Shif4683a32017-12-01 00:03:28363 dict->SetBoolean("migrate_sessions_on_network_change_v2",
364 params_.quic_migrate_sessions_on_network_change_v2);
365 dict->SetBoolean("migrate_sessions_early_v2",
366 params_.quic_migrate_sessions_early_v2);
Zhongyi Shie01f2db2019-02-22 19:53:23367 dict->SetInteger("retransmittable_on_wire_timeout_milliseconds",
368 params_.quic_retransmittable_on_wire_timeout_milliseconds);
Zhongyi Shi8de43832018-08-15 23:40:00369 dict->SetBoolean("retry_on_alternate_network_before_handshake",
370 params_.quic_retry_on_alternate_network_before_handshake);
Zhongyi Shi32fe14d42019-02-28 00:25:36371 dict->SetBoolean("migrate_idle_sessions", params_.quic_migrate_idle_sessions);
Zhongyi Shic16b4102019-02-12 00:37:40372 dict->SetInteger("idle_session_migration_period_seconds",
373 params_.quic_idle_session_migration_period.InSeconds());
Zhongyi Shi73f23ca872017-12-13 18:37:13374 dict->SetInteger("max_time_on_non_default_network_seconds",
375 params_.quic_max_time_on_non_default_network.InSeconds());
Zhongyi Shi8b1e43f2017-12-13 20:46:30376 dict->SetInteger(
Zhongyi Shiee760762018-08-01 00:54:29377 "max_num_migrations_to_non_default_network_on_write_error",
378 params_.quic_max_migrations_to_non_default_network_on_write_error);
379 dict->SetInteger(
Zhongyi Shi8b1e43f2017-12-13 20:46:30380 "max_num_migrations_to_non_default_network_on_path_degrading",
381 params_.quic_max_migrations_to_non_default_network_on_path_degrading);
rch53535742017-04-20 00:48:50382 dict->SetBoolean("allow_server_migration",
383 params_.quic_allow_server_migration);
Zhongyi Shidbce7f412019-02-01 23:16:29384 dict->SetBoolean("race_stale_dns_on_connection",
385 params_.quic_race_stale_dns_on_connection);
386 dict->SetBoolean("go_away_on_path_degrading",
387 params_.quic_go_away_on_path_degrading);
rch53535742017-04-20 00:48:50388 dict->SetBoolean("estimate_initial_rtt", params_.quic_estimate_initial_rtt);
zhongyif054cd02017-06-09 07:09:10389 dict->SetBoolean("server_push_cancellation",
390 params_.enable_server_push_cancellation);
Renjiea0522f062019-04-29 18:52:21391 dict->SetInteger("initial_rtt_for_handshake_milliseconds",
392 params_.quic_initial_rtt_for_handshake_milliseconds);
rch53535742017-04-20 00:48:50393
dchengc7eeda422015-12-26 03:56:48394 return std::move(dict);
[email protected]cf4cae32014-05-27 00:39:10395}
396
397void HttpNetworkSession::CloseAllConnections() {
398 normal_socket_pool_manager_->FlushSocketPoolsWithError(ERR_ABORTED);
399 websocket_socket_pool_manager_->FlushSocketPoolsWithError(ERR_ABORTED);
400 spdy_session_pool_.CloseCurrentSessions(ERR_ABORTED);
Ryan Hamilton1556a722019-06-19 21:04:17401 quic_stream_factory_.CloseAllSessions(ERR_ABORTED,
402 quic::QUIC_PEER_GOING_AWAY);
[email protected]cf4cae32014-05-27 00:39:10403}
404
405void HttpNetworkSession::CloseIdleConnections() {
406 normal_socket_pool_manager_->CloseIdleSockets();
407 websocket_socket_pool_manager_->CloseIdleSockets();
408 spdy_session_pool_.CloseCurrentIdleSessions();
409}
410
bnc3472afd2016-11-17 15:27:21411bool HttpNetworkSession::IsProtocolEnabled(NextProto protocol) const {
bnc8f8225c2016-09-23 21:19:46412 switch (protocol) {
bnc3472afd2016-11-17 15:27:21413 case kProtoUnknown:
bnc8f8225c2016-09-23 21:19:46414 NOTREACHED();
415 return false;
bnc3472afd2016-11-17 15:27:21416 case kProtoHTTP11:
417 return true;
418 case kProtoHTTP2:
419 return params_.enable_http2;
420 case kProtoQUIC:
pmarko6ab8be242017-01-11 11:02:55421 return IsQuicEnabled();
bnc8f8225c2016-09-23 21:19:46422 }
423 NOTREACHED();
424 return false;
[email protected]cf4cae32014-05-27 00:39:10425}
426
zhongyiaf257542016-12-19 03:36:01427void HttpNetworkSession::SetServerPushDelegate(
428 std::unique_ptr<ServerPushDelegate> push_delegate) {
zhongyid7dd2db12017-04-14 17:01:25429 DCHECK(push_delegate);
430 if (!params_.enable_server_push_cancellation || push_delegate_)
431 return;
zhongyiaf257542016-12-19 03:36:01432
433 push_delegate_ = std::move(push_delegate);
434 spdy_session_pool_.set_server_push_delegate(push_delegate_.get());
435 quic_stream_factory_.set_server_push_delegate(push_delegate_.get());
436}
437
bnc1f295372015-10-21 23:24:22438void HttpNetworkSession::GetAlpnProtos(NextProtoVector* alpn_protos) const {
bnc927c4962016-07-21 14:45:59439 *alpn_protos = next_protos_;
bnc1f295372015-10-21 23:24:22440}
441
nharper8cdb0fb2016-04-22 21:34:59442void HttpNetworkSession::GetSSLConfig(const HttpRequestInfo& request,
443 SSLConfig* server_config,
444 SSLConfig* proxy_config) const {
445 ssl_config_service_->GetSSLConfig(server_config);
446 GetAlpnProtos(&server_config->alpn_protos);
Jesse Seloverdaf87902018-12-03 20:44:30447 server_config->ignore_certificate_errors = params_.ignore_certificate_errors;
nharper8cdb0fb2016-04-22 21:34:59448 *proxy_config = *server_config;
Steven Valdez1c1859172019-04-10 15:33:28449 server_config->early_data_enabled = params_.enable_early_data;
nharper8cdb0fb2016-04-22 21:34:59450}
451
xunjieli9f8c5fb52016-12-07 22:59:33452void HttpNetworkSession::DumpMemoryStats(
453 base::trace_event::ProcessMemoryDump* pmd,
454 const std::string& parent_absolute_name) const {
xunjielid5debfc2017-02-24 15:55:49455 std::string name = base::StringPrintf("net/http_network_session_0x%" PRIxPTR,
456 reinterpret_cast<uintptr_t>(this));
xunjieli9f8c5fb52016-12-07 22:59:33457 base::trace_event::MemoryAllocatorDump* http_network_session_dump =
458 pmd->GetAllocatorDump(name);
xunjieli2a2468bd2017-01-04 21:17:33459 if (http_network_session_dump == nullptr) {
460 http_network_session_dump = pmd->CreateAllocatorDump(name);
461 normal_socket_pool_manager_->DumpMemoryStats(
462 pmd, http_network_session_dump->absolute_name());
463 spdy_session_pool_.DumpMemoryStats(
464 pmd, http_network_session_dump->absolute_name());
xunjielif5267de2017-01-20 21:18:57465 if (http_stream_factory_) {
466 http_stream_factory_->DumpMemoryStats(
467 pmd, http_network_session_dump->absolute_name());
468 }
xunjieli69720dd2017-01-30 15:36:29469 quic_stream_factory_.DumpMemoryStats(
470 pmd, http_network_session_dump->absolute_name());
Daniel McArdle3a663d62019-01-31 00:48:47471 ssl_client_session_cache_.DumpMemoryStats(pmd, name);
xunjieli9f8c5fb52016-12-07 22:59:33472 }
xunjielid5debfc2017-02-24 15:55:49473
xunjieli2a2468bd2017-01-04 21:17:33474 // Create an empty row under parent's dump so size can be attributed correctly
475 // if |this| is shared between URLRequestContexts.
476 base::trace_event::MemoryAllocatorDump* empty_row_dump =
477 pmd->CreateAllocatorDump(base::StringPrintf(
478 "%s/http_network_session", parent_absolute_name.c_str()));
479 pmd->AddOwnershipEdge(empty_row_dump->guid(),
xunjieli9f8c5fb52016-12-07 22:59:33480 http_network_session_dump->guid());
481}
482
pmarko6ab8be242017-01-11 11:02:55483bool HttpNetworkSession::IsQuicEnabled() const {
484 return params_.enable_quic;
485}
486
487void HttpNetworkSession::DisableQuic() {
488 params_.enable_quic = false;
489}
490
Daniel McArdle3a663d62019-01-31 00:48:47491void HttpNetworkSession::ClearSSLSessionCache() {
492 ssl_client_session_cache_.Flush();
Daniel McArdleda3fa942019-02-15 16:41:21493 ssl_client_session_cache_privacy_mode_.Flush();
Daniel McArdle3a663d62019-01-31 00:48:47494}
495
Matt Menked6fd2a52019-03-20 06:14:36496CommonConnectJobParams HttpNetworkSession::CreateCommonConnectJobParams(
497 bool for_websockets) {
498 // Use null websocket_endpoint_lock_manager, which is only set for WebSockets,
499 // and only when not using a proxy.
500 return CommonConnectJobParams(
501 context_.client_socket_factory ? context_.client_socket_factory
502 : ClientSocketFactory::GetDefaultFactory(),
Matt Menkeb88837e2019-03-20 11:50:40503 context_.host_resolver, &http_auth_cache_,
504 context_.http_auth_handler_factory, &spdy_session_pool_,
Matt Menkeb5fb42b2019-03-22 17:26:13505 &params_.quic_supported_versions, &quic_stream_factory_,
506 context_.proxy_delegate, context_.http_user_agent_settings,
Matt Menked6fd2a52019-03-20 06:14:36507 CreateClientSocketContext(context_, &ssl_client_session_cache_),
508 CreateClientSocketContext(context_,
509 &ssl_client_session_cache_privacy_mode_),
510 context_.socket_performance_watcher_factory,
511 context_.network_quality_estimator, context_.net_log,
512 for_websockets ? &websocket_endpoint_lock_manager_ : nullptr);
513}
514
[email protected]cf4cae32014-05-27 00:39:10515ClientSocketPoolManager* HttpNetworkSession::GetSocketPoolManager(
516 SocketPoolType pool_type) {
517 switch (pool_type) {
518 case NORMAL_SOCKET_POOL:
519 return normal_socket_pool_manager_.get();
520 case WEBSOCKET_SOCKET_POOL:
521 return websocket_socket_pool_manager_.get();
522 default:
523 NOTREACHED();
524 break;
525 }
Raul Tambre94493c652019-03-11 17:18:35526 return nullptr;
[email protected]cf4cae32014-05-27 00:39:10527}
528
maksim.sisov0adf8592016-07-15 06:25:56529void HttpNetworkSession::OnMemoryPressure(
530 base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) {
yucliu48f235d2018-01-11 00:59:55531 DCHECK(!params_.disable_idle_sockets_close_on_memory_pressure);
532
maksim.sisov0adf8592016-07-15 06:25:56533 switch (memory_pressure_level) {
534 case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE:
yucliu9462d912017-11-22 02:41:23535 break;
yucliu48f235d2018-01-11 00:59:55536
537 case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE:
maksim.sisov0adf8592016-07-15 06:25:56538 case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL:
539 CloseIdleConnections();
540 break;
541 }
542}
543
ttuttle859dc7a2015-04-23 19:42:29544} // namespace net