blob: 11845335e186ee3e8e9c76a7957f75d1716ba1ae [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"
vitalybukabfe0e4272015-12-03 01:51:4215#include "base/strings/string_number_conversions.h"
[email protected]cf4cae32014-05-27 00:39:1016#include "base/strings/string_util.h"
xunjieli9f8c5fb52016-12-07 22:59:3317#include "base/strings/stringprintf.h"
18#include "base/trace_event/memory_allocator_dump.h"
xunjielif5267de2017-01-20 21:18:5719#include "base/trace_event/memory_dump_request_args.h"
xunjieli9f8c5fb52016-12-07 22:59:3320#include "base/trace_event/process_memory_dump.h"
[email protected]cf4cae32014-05-27 00:39:1021#include "base/values.h"
22#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"
Ryan Hamiltona3ee93a72018-08-01 22:03:0827#include "net/quic/quic_crypto_client_stream_factory.h"
28#include "net/quic/quic_stream_factory.h"
[email protected]cf4cae32014-05-27 00:39:1029#include "net/socket/client_socket_factory.h"
30#include "net/socket/client_socket_pool_manager_impl.h"
31#include "net/socket/next_proto.h"
bnc1e757502014-12-13 02:20:1632#include "net/socket/ssl_client_socket.h"
Bence Békyda280c62018-04-12 15:08:3733#include "net/socket/websocket_endpoint_lock_manager.h"
Bence Béky94658bf2018-05-11 19:22:5834#include "net/spdy/spdy_session_pool.h"
Ryan Hamilton56b10c5d2018-05-11 13:40:1635#include "net/third_party/quic/core/crypto/quic_random.h"
36#include "net/third_party/quic/core/quic_packets.h"
37#include "net/third_party/quic/core/quic_tag.h"
38#include "net/third_party/quic/core/quic_utils.h"
39#include "net/third_party/quic/platform/impl/quic_chromium_clock.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
tzik74c2eb2c2017-07-25 15:26:1545base::AtomicSequenceNumber g_next_shard_id;
vitalybukabfe0e4272015-12-03 01:51:4246
Juan Jose Lopez Jaimez7fa1f002017-11-20 22:13:3347std::unique_ptr<ClientSocketPoolManager> CreateSocketPoolManager(
ttuttle859dc7a2015-04-23 19:42:2948 HttpNetworkSession::SocketPoolType pool_type,
mmenke6ddfbea2017-05-31 21:48:4149 const HttpNetworkSession::Context& context,
Bence Békyda280c62018-04-12 15:08:3750 const std::string& ssl_session_cache_shard,
51 WebSocketEndpointLockManager* websocket_endpoint_lock_manager) {
[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,
Bence Békyda280c62018-04-12 15:08:3763 context.ssl_config_service, websocket_endpoint_lock_manager, 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),
Matt Menke53c59762017-09-14 16:38:12104 tcp_fast_open_mode(TcpFastOpenMode::DISABLED),
rch1546ccd2017-04-20 02:14:23105 enable_user_alternate_protocol_ports(false),
[email protected]cf4cae32014-05-27 00:39:10106 enable_spdy_ping_based_connection_checking(true),
bncefcd9652016-02-03 18:00:32107 enable_http2(true),
bnc8f0f3b62015-04-08 04:37:23108 spdy_session_max_recv_window_size(kSpdySessionMaxRecvWindowSize),
[email protected]cf4cae32014-05-27 00:39:10109 time_func(&base::TimeTicks::Now),
bnca86731e2017-04-17 12:31:28110 enable_http2_alternative_service(false),
Bence Béky8bfacd42018-02-23 13:05:13111 enable_websocket_over_http2(false),
[email protected]cf4cae32014-05-27 00:39:10112 enable_quic(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),
Yixin Wang469da562017-11-15 21:34:58123 quic_max_time_before_crypto_handshake_seconds(
Ryan Hamilton8d9ee76e2018-05-29 23:52:52124 quic::kMaxTimeForCryptoHandshakeSecs),
Yixin Wang469da562017-11-15 21:34:58125 quic_max_idle_time_before_crypto_handshake_seconds(
Ryan Hamilton8d9ee76e2018-05-29 23:52:52126 quic::kInitialIdleTimeoutSecs),
Zhongyi Shif4683a32017-12-01 00:03:28127 quic_migrate_sessions_on_network_change_v2(false),
128 quic_migrate_sessions_early_v2(false),
Zhongyi Shi8de43832018-08-15 23:40:00129 quic_retry_on_alternate_network_before_handshake(false),
Renjiea0cb4a2c2018-09-26 23:37:30130 quic_race_stale_dns_on_connection(false),
Renjiea5722ccf2018-08-10 00:18:49131 quic_go_away_on_path_degrading(false),
Zhongyi Shi73f23ca872017-12-13 18:37:13132 quic_max_time_on_non_default_network(
133 base::TimeDelta::FromSeconds(kMaxTimeOnNonDefaultNetworkSecs)),
Zhongyi Shiee760762018-08-01 00:54:29134 quic_max_migrations_to_non_default_network_on_write_error(
135 kMaxMigrationsToNonDefaultNetworkOnWriteError),
Zhongyi Shi8b1e43f2017-12-13 20:46:30136 quic_max_migrations_to_non_default_network_on_path_degrading(
137 kMaxMigrationsToNonDefaultNetworkOnPathDegrading),
jri217455a12016-07-13 20:15:09138 quic_allow_server_migration(false),
Ryan Hamilton0d326362018-01-30 06:05:10139 quic_allow_remote_alt_svc(true),
xunjieli888c29922016-03-18 21:05:09140 quic_disable_bidirectional_streams(false),
ckrasicda193a82016-07-09 00:39:36141 quic_force_hol_blocking(false),
rtennetid073dd22016-08-04 01:58:33142 quic_race_cert_verification(false),
rchd6163f32017-01-30 23:50:38143 quic_estimate_initial_rtt(false),
Yixin Wang079ad542018-01-11 04:06:05144 quic_headers_include_h2_stream_dependency(false),
Nick Harper1e5757d42018-05-02 23:08:57145 enable_channel_id(false),
yucliu48f235d2018-01-11 00:59:55146 http_09_on_non_default_ports_enabled(false),
147 disable_idle_sockets_close_on_memory_pressure(false) {
Ryan Hamilton8d9ee76e2018-05-29 23:52:52148 quic_supported_versions.push_back(quic::QUIC_VERSION_43);
[email protected]cf4cae32014-05-27 00:39:10149}
150
vmpstracd23b72016-02-26 21:08:55151HttpNetworkSession::Params::Params(const Params& other) = default;
152
Chris Watkins7a41d3552017-12-01 02:13:27153HttpNetworkSession::Params::~Params() = default;
[email protected]cf4cae32014-05-27 00:39:10154
mmenke6ddfbea2017-05-31 21:48:41155HttpNetworkSession::Context::Context()
156 : client_socket_factory(nullptr),
157 host_resolver(nullptr),
158 cert_verifier(nullptr),
159 channel_id_service(nullptr),
160 transport_security_state(nullptr),
161 cert_transparency_verifier(nullptr),
162 ct_policy_enforcer(nullptr),
Lily Houghton8c2f97d2018-01-22 05:06:59163 proxy_resolution_service(nullptr),
mmenke6ddfbea2017-05-31 21:48:41164 ssl_config_service(nullptr),
165 http_auth_handler_factory(nullptr),
166 net_log(nullptr),
167 socket_performance_watcher_factory(nullptr),
tbansal16196a1e2017-06-09 01:50:09168 network_quality_provider(nullptr),
mmenke6ddfbea2017-05-31 21:48:41169 quic_clock(nullptr),
170 quic_random(nullptr),
171 quic_crypto_client_stream_factory(
Eric Roman3d8546a2018-09-10 17:00:52172 QuicCryptoClientStreamFactory::GetDefaultFactory()) {}
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),
Lily Houghton8c2f97d2018-01-22 05:06:59185 proxy_resolution_service_(context.proxy_resolution_service),
mmenke6ddfbea2017-05-31 21:48:41186 ssl_config_service_(context.ssl_config_service),
Bence Békyda280c62018-04-12 15:08:37187 websocket_endpoint_lock_manager_(
188 std::make_unique<WebSocketEndpointLockManager>()),
zhongyiaf257542016-12-19 03:36:01189 push_delegate_(nullptr),
jri2b966f22014-09-02 22:25:36190 quic_stream_factory_(
mmenke6ddfbea2017-05-31 21:48:41191 context.net_log,
192 context.host_resolver,
193 context.ssl_config_service,
194 context.client_socket_factory
195 ? context.client_socket_factory
ttuttle859dc7a2015-04-23 19:42:29196 : ClientSocketFactory::GetDefaultFactory(),
mmenke6ddfbea2017-05-31 21:48:41197 context.http_server_properties,
198 context.cert_verifier,
199 context.ct_policy_enforcer,
200 context.channel_id_service,
201 context.transport_security_state,
202 context.cert_transparency_verifier,
203 context.socket_performance_watcher_factory,
204 context.quic_crypto_client_stream_factory,
Ryan Hamilton8d9ee76e2018-05-29 23:52:52205 context.quic_random ? context.quic_random
206 : quic::QuicRandom::GetInstance(),
mmenke6ddfbea2017-05-31 21:48:41207 context.quic_clock ? context.quic_clock
Ryan Hamilton8d9ee76e2018-05-29 23:52:52208 : quic::QuicChromiumClock::GetInstance(),
jri2b966f22014-09-02 22:25:36209 params.quic_max_packet_length,
210 params.quic_user_agent_id,
rch431dd4452017-04-19 15:22:35211 params.quic_max_server_configs_stored_in_properties > 0,
Jana Iyengar903dec22017-11-28 00:44:23212 params.quic_close_sessions_on_ip_change,
Zhongyi Shi63574b72018-06-01 20:22:25213 params.quic_goaway_sessions_on_ip_change,
rch9ecde09b2017-04-08 00:18:23214 params.mark_quic_broken_when_network_blackholes,
rtenneti41c09992015-11-30 18:24:01215 params.quic_idle_connection_timeout_seconds,
zhongyidd1439f62016-09-02 02:02:26216 params.quic_reduced_ping_timeout_seconds,
Yixin Wang469da562017-11-15 21:34:58217 params.quic_max_time_before_crypto_handshake_seconds,
218 params.quic_max_idle_time_before_crypto_handshake_seconds,
Zhongyi Shif4683a32017-12-01 00:03:28219 params.quic_migrate_sessions_on_network_change_v2,
220 params.quic_migrate_sessions_early_v2,
Zhongyi Shi8de43832018-08-15 23:40:00221 params.quic_retry_on_alternate_network_before_handshake,
Renjiea0cb4a2c2018-09-26 23:37:30222 params.quic_race_stale_dns_on_connection,
Renjiea5722ccf2018-08-10 00:18:49223 params.quic_go_away_on_path_degrading,
Zhongyi Shi73f23ca872017-12-13 18:37:13224 params.quic_max_time_on_non_default_network,
Zhongyi Shiee760762018-08-01 00:54:29225 params.quic_max_migrations_to_non_default_network_on_write_error,
Zhongyi Shi8b1e43f2017-12-13 20:46:30226 params.quic_max_migrations_to_non_default_network_on_path_degrading,
jri217455a12016-07-13 20:15:09227 params.quic_allow_server_migration,
rtennetid073dd22016-08-04 01:58:33228 params.quic_race_cert_verification,
rchd6163f32017-01-30 23:50:38229 params.quic_estimate_initial_rtt,
Yixin Wang079ad542018-01-11 04:06:05230 params.quic_headers_include_h2_stream_dependency,
nharperd5cddca2016-02-27 03:37:52231 params.quic_connection_options,
Yixin Wang46a425f2017-08-10 23:02:20232 params.quic_client_connection_options,
Nick Harper1e5757d42018-05-02 23:08:57233 params.enable_channel_id,
kapishnikov7f8dd1e2018-01-24 06:10:49234 params.quic_enable_socket_recv_optimization),
mmenke6ddfbea2017-05-31 21:48:41235 spdy_session_pool_(context.host_resolver,
236 context.ssl_config_service,
237 context.http_server_properties,
238 context.transport_security_state,
zhongyi8ac630d2017-06-26 19:46:33239 params.quic_supported_versions,
[email protected]cf4cae32014-05-27 00:39:10240 params.enable_spdy_ping_based_connection_checking,
Yixin Wanga9afead2017-10-19 20:23:10241 params.support_ietf_format_quic_altsvc,
bnc8f0f3b62015-04-08 04:37:23242 params.spdy_session_max_recv_window_size,
bnc3171a2432016-12-28 18:40:26243 AddDefaultHttp2Settings(params.http2_settings),
Bence Béky6a070bcd2018-09-06 15:02:43244 params.greased_http2_frame,
Reilly Grantf29015e72018-01-24 21:47:26245 params.time_func),
Xida Chen9bfe0b62018-04-24 19:52:21246 http_stream_factory_(std::make_unique<HttpStreamFactory>(this)),
mmenke6ddfbea2017-05-31 21:48:41247 params_(params),
248 context_(context) {
Lily Houghton8c2f97d2018-01-22 05:06:59249 DCHECK(proxy_resolution_service_);
Ryan Sleevib8449e02018-07-15 04:31:07250 DCHECK(ssl_config_service_);
[email protected]cf4cae32014-05-27 00:39:10251 CHECK(http_server_properties_);
252
vitalybukabfe0e4272015-12-03 01:51:42253 const std::string ssl_session_cache_shard =
254 "http_network_session/" + base::IntToString(g_next_shard_id.GetNext());
Juan Jose Lopez Jaimez7fa1f002017-11-20 22:13:33255 normal_socket_pool_manager_ = CreateSocketPoolManager(
Bence Békyda280c62018-04-12 15:08:37256 NORMAL_SOCKET_POOL, context, ssl_session_cache_shard,
257 websocket_endpoint_lock_manager_.get());
Juan Jose Lopez Jaimez7fa1f002017-11-20 22:13:33258 websocket_socket_pool_manager_ = CreateSocketPoolManager(
Bence Békyda280c62018-04-12 15:08:37259 WEBSOCKET_SOCKET_POOL, context, ssl_session_cache_shard,
260 websocket_endpoint_lock_manager_.get());
vitalybukabfe0e4272015-12-03 01:51:42261
bnc3f0118e2016-02-02 15:42:22262 if (params_.enable_http2) {
263 next_protos_.push_back(kProtoHTTP2);
bnc3f0118e2016-02-02 15:42:22264 }
265
266 next_protos_.push_back(kProtoHTTP11);
267
rtenneti6971c172016-01-15 20:12:10268 http_server_properties_->SetMaxServerConfigsStoredInProperties(
269 params.quic_max_server_configs_stored_in_properties);
maksim.sisov0adf8592016-07-15 06:25:56270
yucliu48f235d2018-01-11 00:59:55271 if (!params_.disable_idle_sockets_close_on_memory_pressure) {
272 memory_pressure_listener_.reset(
273 new base::MemoryPressureListener(base::BindRepeating(
274 &HttpNetworkSession::OnMemoryPressure, base::Unretained(this))));
275 }
[email protected]cf4cae32014-05-27 00:39:10276}
277
278HttpNetworkSession::~HttpNetworkSession() {
gab47aa7da2017-06-02 16:09:43279 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
avifceb32f62016-10-07 16:30:52280 response_drainers_.clear();
Bence Béky3ba8c332017-12-11 20:19:24281 // TODO(bnc): CloseAllSessions() is also called in SpdySessionPool destructor,
282 // one of the two calls should be removed.
[email protected]cf4cae32014-05-27 00:39:10283 spdy_session_pool_.CloseAllSessions();
[email protected]cf4cae32014-05-27 00:39:10284}
285
avifceb32f62016-10-07 16:30:52286void HttpNetworkSession::AddResponseDrainer(
287 std::unique_ptr<HttpResponseBodyDrainer> drainer) {
288 DCHECK(!base::ContainsKey(response_drainers_, drainer.get()));
289 HttpResponseBodyDrainer* drainer_ptr = drainer.get();
290 response_drainers_[drainer_ptr] = std::move(drainer);
[email protected]cf4cae32014-05-27 00:39:10291}
292
293void HttpNetworkSession::RemoveResponseDrainer(
294 HttpResponseBodyDrainer* drainer) {
skyostilb8f60ca2016-08-12 12:34:43295 DCHECK(base::ContainsKey(response_drainers_, drainer));
avifceb32f62016-10-07 16:30:52296 response_drainers_[drainer].release();
[email protected]cf4cae32014-05-27 00:39:10297 response_drainers_.erase(drainer);
298}
299
300TransportClientSocketPool* HttpNetworkSession::GetTransportSocketPool(
301 SocketPoolType pool_type) {
302 return GetSocketPoolManager(pool_type)->GetTransportSocketPool();
303}
304
305SSLClientSocketPool* HttpNetworkSession::GetSSLSocketPool(
306 SocketPoolType pool_type) {
307 return GetSocketPoolManager(pool_type)->GetSSLSocketPool();
308}
309
310SOCKSClientSocketPool* HttpNetworkSession::GetSocketPoolForSOCKSProxy(
311 SocketPoolType pool_type,
312 const HostPortPair& socks_proxy) {
313 return GetSocketPoolManager(pool_type)->GetSocketPoolForSOCKSProxy(
314 socks_proxy);
315}
316
317HttpProxyClientSocketPool* HttpNetworkSession::GetSocketPoolForHTTPProxy(
318 SocketPoolType pool_type,
319 const HostPortPair& http_proxy) {
320 return GetSocketPoolManager(pool_type)->GetSocketPoolForHTTPProxy(http_proxy);
321}
322
323SSLClientSocketPool* HttpNetworkSession::GetSocketPoolForSSLWithProxy(
324 SocketPoolType pool_type,
325 const HostPortPair& proxy_server) {
326 return GetSocketPoolManager(pool_type)->GetSocketPoolForSSLWithProxy(
327 proxy_server);
328}
329
danakj1fd259a02016-04-16 03:17:09330std::unique_ptr<base::Value> HttpNetworkSession::SocketPoolInfoToValue() const {
[email protected]cf4cae32014-05-27 00:39:10331 // TODO(yutak): Should merge values from normal pools and WebSocket pools.
332 return normal_socket_pool_manager_->SocketPoolInfoToValue();
333}
334
danakj1fd259a02016-04-16 03:17:09335std::unique_ptr<base::Value> HttpNetworkSession::SpdySessionPoolInfoToValue()
336 const {
[email protected]cf4cae32014-05-27 00:39:10337 return spdy_session_pool_.SpdySessionPoolInfoToValue();
338}
339
danakj1fd259a02016-04-16 03:17:09340std::unique_ptr<base::Value> HttpNetworkSession::QuicInfoToValue() const {
341 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
[email protected]cf4cae32014-05-27 00:39:10342 dict->Set("sessions", quic_stream_factory_.QuicStreamFactoryInfoToValue());
pmarko6ab8be242017-01-11 11:02:55343 dict->SetBoolean("quic_enabled", IsQuicEnabled());
rch53535742017-04-20 00:48:50344
Jeremy Roman0579ed62017-08-29 15:56:19345 auto connection_options(std::make_unique<base::ListValue>());
rch53535742017-04-20 00:48:50346 for (const auto& option : params_.quic_connection_options)
Ryan Hamilton8d9ee76e2018-05-29 23:52:52347 connection_options->AppendString(quic::QuicTagToString(option));
dchengc7eeda422015-12-26 03:56:48348 dict->Set("connection_options", std::move(connection_options));
rtenneti8a2f4632016-03-21 20:26:57349
Jeremy Roman0579ed62017-08-29 15:56:19350 auto supported_versions(std::make_unique<base::ListValue>());
rch53535742017-04-20 00:48:50351 for (const auto& version : params_.quic_supported_versions)
352 supported_versions->AppendString(QuicVersionToString(version));
353 dict->Set("supported_versions", std::move(supported_versions));
354
Jeremy Roman0579ed62017-08-29 15:56:19355 auto origins_to_force_quic_on(std::make_unique<base::ListValue>());
rch53535742017-04-20 00:48:50356 for (const auto& origin : params_.origins_to_force_quic_on)
357 origins_to_force_quic_on->AppendString(origin.ToString());
rtenneti8a2f4632016-03-21 20:26:57358 dict->Set("origins_to_force_quic_on", std::move(origins_to_force_quic_on));
359
rch53535742017-04-20 00:48:50360 dict->SetInteger("max_packet_length", params_.quic_max_packet_length);
rtenneti6971c172016-01-15 20:12:10361 dict->SetInteger("max_server_configs_stored_in_properties",
362 params_.quic_max_server_configs_stored_in_properties);
rtennetif4b29d72016-01-11 19:29:39363 dict->SetInteger("idle_connection_timeout_seconds",
364 params_.quic_idle_connection_timeout_seconds);
zhongyidd1439f62016-09-02 02:02:26365 dict->SetInteger("reduced_ping_timeout_seconds",
366 params_.quic_reduced_ping_timeout_seconds);
rch53535742017-04-20 00:48:50367 dict->SetBoolean("mark_quic_broken_when_network_blackholes",
368 params_.mark_quic_broken_when_network_blackholes);
369 dict->SetBoolean("retry_without_alt_svc_on_quic_errors",
370 params_.retry_without_alt_svc_on_quic_errors);
rtennetid073dd22016-08-04 01:58:33371 dict->SetBoolean("race_cert_verification",
372 params_.quic_race_cert_verification);
rch53535742017-04-20 00:48:50373 dict->SetBoolean("disable_bidirectional_streams",
374 params_.quic_disable_bidirectional_streams);
Jana Iyengar903dec22017-11-28 00:44:23375 dict->SetBoolean("close_sessions_on_ip_change",
376 params_.quic_close_sessions_on_ip_change);
Zhongyi Shi63574b72018-06-01 20:22:25377 dict->SetBoolean("goaway_sessions_on_ip_change",
378 params_.quic_goaway_sessions_on_ip_change);
Zhongyi Shif4683a32017-12-01 00:03:28379 dict->SetBoolean("migrate_sessions_on_network_change_v2",
380 params_.quic_migrate_sessions_on_network_change_v2);
381 dict->SetBoolean("migrate_sessions_early_v2",
382 params_.quic_migrate_sessions_early_v2);
Zhongyi Shi8de43832018-08-15 23:40:00383 dict->SetBoolean("retry_on_alternate_network_before_handshake",
384 params_.quic_retry_on_alternate_network_before_handshake);
Renjiea0cb4a2c2018-09-26 23:37:30385 dict->SetBoolean("race_stale_dns_on_connection",
386 params_.quic_race_stale_dns_on_connection);
Renjiea5722ccf2018-08-10 00:18:49387 dict->SetBoolean("go_away_on_path_degrading",
388 params_.quic_go_away_on_path_degrading);
Zhongyi Shi73f23ca872017-12-13 18:37:13389 dict->SetInteger("max_time_on_non_default_network_seconds",
390 params_.quic_max_time_on_non_default_network.InSeconds());
Zhongyi Shi8b1e43f2017-12-13 20:46:30391 dict->SetInteger(
Zhongyi Shiee760762018-08-01 00:54:29392 "max_num_migrations_to_non_default_network_on_write_error",
393 params_.quic_max_migrations_to_non_default_network_on_write_error);
394 dict->SetInteger(
Zhongyi Shi8b1e43f2017-12-13 20:46:30395 "max_num_migrations_to_non_default_network_on_path_degrading",
396 params_.quic_max_migrations_to_non_default_network_on_path_degrading);
rch53535742017-04-20 00:48:50397 dict->SetBoolean("allow_server_migration",
398 params_.quic_allow_server_migration);
rch53535742017-04-20 00:48:50399 dict->SetBoolean("estimate_initial_rtt", params_.quic_estimate_initial_rtt);
400 dict->SetBoolean("force_hol_blocking", params_.quic_force_hol_blocking);
zhongyif054cd02017-06-09 07:09:10401 dict->SetBoolean("server_push_cancellation",
402 params_.enable_server_push_cancellation);
rch53535742017-04-20 00:48:50403
dchengc7eeda422015-12-26 03:56:48404 return std::move(dict);
[email protected]cf4cae32014-05-27 00:39:10405}
406
407void HttpNetworkSession::CloseAllConnections() {
408 normal_socket_pool_manager_->FlushSocketPoolsWithError(ERR_ABORTED);
409 websocket_socket_pool_manager_->FlushSocketPoolsWithError(ERR_ABORTED);
410 spdy_session_pool_.CloseCurrentSessions(ERR_ABORTED);
Ryan Hamilton8d9ee76e2018-05-29 23:52:52411 quic_stream_factory_.CloseAllSessions(ERR_ABORTED, quic::QUIC_INTERNAL_ERROR);
[email protected]cf4cae32014-05-27 00:39:10412}
413
414void HttpNetworkSession::CloseIdleConnections() {
415 normal_socket_pool_manager_->CloseIdleSockets();
416 websocket_socket_pool_manager_->CloseIdleSockets();
417 spdy_session_pool_.CloseCurrentIdleSessions();
418}
419
bnc3472afd2016-11-17 15:27:21420bool HttpNetworkSession::IsProtocolEnabled(NextProto protocol) const {
bnc8f8225c2016-09-23 21:19:46421 switch (protocol) {
bnc3472afd2016-11-17 15:27:21422 case kProtoUnknown:
bnc8f8225c2016-09-23 21:19:46423 NOTREACHED();
424 return false;
bnc3472afd2016-11-17 15:27:21425 case kProtoHTTP11:
426 return true;
427 case kProtoHTTP2:
428 return params_.enable_http2;
429 case kProtoQUIC:
pmarko6ab8be242017-01-11 11:02:55430 return IsQuicEnabled();
bnc8f8225c2016-09-23 21:19:46431 }
432 NOTREACHED();
433 return false;
[email protected]cf4cae32014-05-27 00:39:10434}
435
zhongyiaf257542016-12-19 03:36:01436void HttpNetworkSession::SetServerPushDelegate(
437 std::unique_ptr<ServerPushDelegate> push_delegate) {
zhongyid7dd2db12017-04-14 17:01:25438 DCHECK(push_delegate);
439 if (!params_.enable_server_push_cancellation || push_delegate_)
440 return;
zhongyiaf257542016-12-19 03:36:01441
442 push_delegate_ = std::move(push_delegate);
443 spdy_session_pool_.set_server_push_delegate(push_delegate_.get());
444 quic_stream_factory_.set_server_push_delegate(push_delegate_.get());
445}
446
bnc1f295372015-10-21 23:24:22447void HttpNetworkSession::GetAlpnProtos(NextProtoVector* alpn_protos) const {
bnc927c4962016-07-21 14:45:59448 *alpn_protos = next_protos_;
bnc1f295372015-10-21 23:24:22449}
450
nharper8cdb0fb2016-04-22 21:34:59451void HttpNetworkSession::GetSSLConfig(const HttpRequestInfo& request,
452 SSLConfig* server_config,
453 SSLConfig* proxy_config) const {
454 ssl_config_service_->GetSSLConfig(server_config);
455 GetAlpnProtos(&server_config->alpn_protos);
nharper8cdb0fb2016-04-22 21:34:59456 *proxy_config = *server_config;
457 if (request.privacy_mode == PRIVACY_MODE_ENABLED) {
458 server_config->channel_id_enabled = false;
Nick Harper1e5757d42018-05-02 23:08:57459 } else {
460 server_config->channel_id_enabled = params_.enable_channel_id;
Nick Harper25a0c4b2018-06-07 23:40:01461 proxy_config->channel_id_enabled = params_.enable_channel_id;
nharper8cdb0fb2016-04-22 21:34:59462 }
463}
464
xunjieli9f8c5fb52016-12-07 22:59:33465void HttpNetworkSession::DumpMemoryStats(
466 base::trace_event::ProcessMemoryDump* pmd,
467 const std::string& parent_absolute_name) const {
xunjielid5debfc2017-02-24 15:55:49468 std::string name = base::StringPrintf("net/http_network_session_0x%" PRIxPTR,
469 reinterpret_cast<uintptr_t>(this));
xunjieli9f8c5fb52016-12-07 22:59:33470 base::trace_event::MemoryAllocatorDump* http_network_session_dump =
471 pmd->GetAllocatorDump(name);
xunjieli2a2468bd2017-01-04 21:17:33472 if (http_network_session_dump == nullptr) {
473 http_network_session_dump = pmd->CreateAllocatorDump(name);
474 normal_socket_pool_manager_->DumpMemoryStats(
475 pmd, http_network_session_dump->absolute_name());
476 spdy_session_pool_.DumpMemoryStats(
477 pmd, http_network_session_dump->absolute_name());
xunjielif5267de2017-01-20 21:18:57478 if (http_stream_factory_) {
479 http_stream_factory_->DumpMemoryStats(
480 pmd, http_network_session_dump->absolute_name());
481 }
xunjieli69720dd2017-01-30 15:36:29482 quic_stream_factory_.DumpMemoryStats(
483 pmd, http_network_session_dump->absolute_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
[email protected]cf4cae32014-05-27 00:39:10503ClientSocketPoolManager* HttpNetworkSession::GetSocketPoolManager(
504 SocketPoolType pool_type) {
505 switch (pool_type) {
506 case NORMAL_SOCKET_POOL:
507 return normal_socket_pool_manager_.get();
508 case WEBSOCKET_SOCKET_POOL:
509 return websocket_socket_pool_manager_.get();
510 default:
511 NOTREACHED();
512 break;
513 }
514 return NULL;
515}
516
maksim.sisov0adf8592016-07-15 06:25:56517void HttpNetworkSession::OnMemoryPressure(
518 base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) {
yucliu48f235d2018-01-11 00:59:55519 DCHECK(!params_.disable_idle_sockets_close_on_memory_pressure);
520
maksim.sisov0adf8592016-07-15 06:25:56521 switch (memory_pressure_level) {
522 case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE:
yucliu9462d912017-11-22 02:41:23523 break;
yucliu48f235d2018-01-11 00:59:55524
525 case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE:
maksim.sisov0adf8592016-07-15 06:25:56526 case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL:
527 CloseIdleConnections();
528 break;
529 }
530}
531
ttuttle859dc7a2015-04-23 19:42:29532} // namespace net