blob: 1172617af0ff41fd84b7b3b19fb545e4c56aa0fa [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éky94658bf2018-05-11 19:22:5833#include "net/spdy/spdy_session_pool.h"
Ryan Hamilton56b10c5d2018-05-11 13:40:1634#include "net/third_party/quic/core/crypto/quic_random.h"
35#include "net/third_party/quic/core/quic_packets.h"
36#include "net/third_party/quic/core/quic_tag.h"
37#include "net/third_party/quic/core/quic_utils.h"
38#include "net/third_party/quic/platform/impl/quic_chromium_clock.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
tzik74c2eb2c2017-07-25 15:26:1544base::AtomicSequenceNumber g_next_shard_id;
vitalybukabfe0e4272015-12-03 01:51:4245
Juan Jose Lopez Jaimez7fa1f002017-11-20 22:13:3346std::unique_ptr<ClientSocketPoolManager> CreateSocketPoolManager(
ttuttle859dc7a2015-04-23 19:42:2947 HttpNetworkSession::SocketPoolType pool_type,
mmenke6ddfbea2017-05-31 21:48:4148 const HttpNetworkSession::Context& context,
Bence Békyda280c62018-04-12 15:08:3749 const std::string& ssl_session_cache_shard,
50 WebSocketEndpointLockManager* websocket_endpoint_lock_manager) {
[email protected]cf4cae32014-05-27 00:39:1051 // TODO(yutak): Differentiate WebSocket pool manager and allow more
52 // simultaneous connections for WebSockets.
Juan Jose Lopez Jaimez7fa1f002017-11-20 22:13:3353 return std::make_unique<ClientSocketPoolManagerImpl>(
mmenke6ddfbea2017-05-31 21:48:4154 context.net_log,
55 context.client_socket_factory ? context.client_socket_factory
56 : ClientSocketFactory::GetDefaultFactory(),
tbansal16196a1e2017-06-09 01:50:0957 context.socket_performance_watcher_factory,
Tarun Bansaled2b20b642018-10-15 19:51:3258 context.network_quality_estimator, context.host_resolver,
mmenke6ddfbea2017-05-31 21:48:4159 context.cert_verifier, context.channel_id_service,
60 context.transport_security_state, context.cert_transparency_verifier,
61 context.ct_policy_enforcer, ssl_session_cache_shard,
Bence Békyda280c62018-04-12 15:08:3762 context.ssl_config_service, websocket_endpoint_lock_manager, pool_type);
[email protected]cf4cae32014-05-27 00:39:1063}
64
65} // unnamed namespace
66
bnc8f0f3b62015-04-08 04:37:2367// The maximum receive window sizes for HTTP/2 sessions and streams.
Avi Drissman13fc8932015-12-20 04:40:4668const int32_t kSpdySessionMaxRecvWindowSize = 15 * 1024 * 1024; // 15 MB
69const int32_t kSpdyStreamMaxRecvWindowSize = 6 * 1024 * 1024; // 6 MB
bnc8f0f3b62015-04-08 04:37:2370
bnc3171a2432016-12-28 18:40:2671namespace {
72
73// Keep all HTTP2 parameters in |http2_settings|, even the ones that are not
74// implemented, to be sent to the server.
75// Set default values for settings that |http2_settings| does not specify.
Ryan Hamilton0239aac2018-05-19 00:03:1376spdy::SettingsMap AddDefaultHttp2Settings(spdy::SettingsMap http2_settings) {
bnc3171a2432016-12-28 18:40:2677 // Set default values only if |http2_settings| does not have
78 // a value set for given setting.
jdoerrie22a91d8b92018-10-05 08:43:2679 auto it = http2_settings.find(spdy::SETTINGS_HEADER_TABLE_SIZE);
bnc3171a2432016-12-28 18:40:2680 if (it == http2_settings.end())
Ryan Hamilton0239aac2018-05-19 00:03:1381 http2_settings[spdy::SETTINGS_HEADER_TABLE_SIZE] = kSpdyMaxHeaderTableSize;
bnc3171a2432016-12-28 18:40:2682
Ryan Hamilton0239aac2018-05-19 00:03:1383 it = http2_settings.find(spdy::SETTINGS_MAX_CONCURRENT_STREAMS);
bnc3171a2432016-12-28 18:40:2684 if (it == http2_settings.end())
Ryan Hamilton0239aac2018-05-19 00:03:1385 http2_settings[spdy::SETTINGS_MAX_CONCURRENT_STREAMS] =
bnc3171a2432016-12-28 18:40:2686 kSpdyMaxConcurrentPushedStreams;
87
Ryan Hamilton0239aac2018-05-19 00:03:1388 it = http2_settings.find(spdy::SETTINGS_INITIAL_WINDOW_SIZE);
bnc3171a2432016-12-28 18:40:2689 if (it == http2_settings.end())
Ryan Hamilton0239aac2018-05-19 00:03:1390 http2_settings[spdy::SETTINGS_INITIAL_WINDOW_SIZE] =
91 kSpdyStreamMaxRecvWindowSize;
bnc3171a2432016-12-28 18:40:2692
93 return http2_settings;
94}
95
96} // unnamed namespace
97
[email protected]cf4cae32014-05-27 00:39:1098HttpNetworkSession::Params::Params()
mmenke6ddfbea2017-05-31 21:48:4199 : enable_server_push_cancellation(false),
[email protected]cf4cae32014-05-27 00:39:10100 ignore_certificate_errors(false),
101 testing_fixed_http_port(0),
102 testing_fixed_https_port(0),
rch1546ccd2017-04-20 02:14:23103 enable_user_alternate_protocol_ports(false),
[email protected]cf4cae32014-05-27 00:39:10104 enable_spdy_ping_based_connection_checking(true),
bncefcd9652016-02-03 18:00:32105 enable_http2(true),
bnc8f0f3b62015-04-08 04:37:23106 spdy_session_max_recv_window_size(kSpdySessionMaxRecvWindowSize),
[email protected]cf4cae32014-05-27 00:39:10107 time_func(&base::TimeTicks::Now),
bnca86731e2017-04-17 12:31:28108 enable_http2_alternative_service(false),
Bence Béky8bfacd42018-02-23 13:05:13109 enable_websocket_over_http2(false),
[email protected]cf4cae32014-05-27 00:39:10110 enable_quic(false),
Ryan Hamilton4cbcbf12018-12-15 05:16:14111 enable_quic_proxies_for_https_urls(false),
Ryan Hamilton8d9ee76e2018-05-29 23:52:52112 quic_max_packet_length(quic::kDefaultMaxPacketSize),
rch1546ccd2017-04-20 02:14:23113 quic_max_server_configs_stored_in_properties(0u),
kapishnikov7f8dd1e2018-01-24 06:10:49114 quic_enable_socket_recv_optimization(false),
rch1546ccd2017-04-20 02:14:23115 mark_quic_broken_when_network_blackholes(false),
Ryan Hamiltonb3827e882018-03-27 03:07:48116 retry_without_alt_svc_on_quic_errors(true),
Yixin Wanga9afead2017-10-19 20:23:10117 support_ietf_format_quic_altsvc(false),
Jana Iyengar903dec22017-11-28 00:44:23118 quic_close_sessions_on_ip_change(false),
Zhongyi Shi63574b72018-06-01 20:22:25119 quic_goaway_sessions_on_ip_change(false),
rtenneti41c09992015-11-30 18:24:01120 quic_idle_connection_timeout_seconds(kIdleConnectionTimeoutSeconds),
Ryan Hamilton8d9ee76e2018-05-29 23:52:52121 quic_reduced_ping_timeout_seconds(quic::kPingTimeoutSecs),
Yixin Wang469da562017-11-15 21:34:58122 quic_max_time_before_crypto_handshake_seconds(
Ryan Hamilton8d9ee76e2018-05-29 23:52:52123 quic::kMaxTimeForCryptoHandshakeSecs),
Yixin Wang469da562017-11-15 21:34:58124 quic_max_idle_time_before_crypto_handshake_seconds(
Ryan Hamilton8d9ee76e2018-05-29 23:52:52125 quic::kInitialIdleTimeoutSecs),
Zhongyi Shif4683a32017-12-01 00:03:28126 quic_migrate_sessions_on_network_change_v2(false),
127 quic_migrate_sessions_early_v2(false),
Zhongyi Shi8de43832018-08-15 23:40:00128 quic_retry_on_alternate_network_before_handshake(false),
Renjiea0cb4a2c2018-09-26 23:37:30129 quic_race_stale_dns_on_connection(false),
Renjiea5722ccf2018-08-10 00:18:49130 quic_go_away_on_path_degrading(false),
Zhongyi Shi73f23ca872017-12-13 18:37:13131 quic_max_time_on_non_default_network(
132 base::TimeDelta::FromSeconds(kMaxTimeOnNonDefaultNetworkSecs)),
Zhongyi Shiee760762018-08-01 00:54:29133 quic_max_migrations_to_non_default_network_on_write_error(
134 kMaxMigrationsToNonDefaultNetworkOnWriteError),
Zhongyi Shi8b1e43f2017-12-13 20:46:30135 quic_max_migrations_to_non_default_network_on_path_degrading(
136 kMaxMigrationsToNonDefaultNetworkOnPathDegrading),
jri217455a12016-07-13 20:15:09137 quic_allow_server_migration(false),
Ryan Hamilton0d326362018-01-30 06:05:10138 quic_allow_remote_alt_svc(true),
xunjieli888c29922016-03-18 21:05:09139 quic_disable_bidirectional_streams(false),
ckrasicda193a82016-07-09 00:39:36140 quic_force_hol_blocking(false),
rtennetid073dd22016-08-04 01:58:33141 quic_race_cert_verification(false),
rchd6163f32017-01-30 23:50:38142 quic_estimate_initial_rtt(false),
Yixin Wang079ad542018-01-11 04:06:05143 quic_headers_include_h2_stream_dependency(false),
Nick Harper1e5757d42018-05-02 23:08:57144 enable_channel_id(false),
yucliu48f235d2018-01-11 00:59:55145 http_09_on_non_default_ports_enabled(false),
146 disable_idle_sockets_close_on_memory_pressure(false) {
Ryan Hamilton8d9ee76e2018-05-29 23:52:52147 quic_supported_versions.push_back(quic::QUIC_VERSION_43);
[email protected]cf4cae32014-05-27 00:39:10148}
149
vmpstracd23b72016-02-26 21:08:55150HttpNetworkSession::Params::Params(const Params& other) = default;
151
Chris Watkins7a41d3552017-12-01 02:13:27152HttpNetworkSession::Params::~Params() = default;
[email protected]cf4cae32014-05-27 00:39:10153
mmenke6ddfbea2017-05-31 21:48:41154HttpNetworkSession::Context::Context()
155 : client_socket_factory(nullptr),
156 host_resolver(nullptr),
157 cert_verifier(nullptr),
158 channel_id_service(nullptr),
159 transport_security_state(nullptr),
160 cert_transparency_verifier(nullptr),
161 ct_policy_enforcer(nullptr),
Lily Houghton8c2f97d2018-01-22 05:06:59162 proxy_resolution_service(nullptr),
mmenke6ddfbea2017-05-31 21:48:41163 ssl_config_service(nullptr),
164 http_auth_handler_factory(nullptr),
165 net_log(nullptr),
166 socket_performance_watcher_factory(nullptr),
Tarun Bansaled2b20b642018-10-15 19:51:32167 network_quality_estimator(nullptr),
Douglas Creager3cb042052018-11-06 23:08:52168#if BUILDFLAG(ENABLE_REPORTING)
Douglas Creager134b52e2018-11-09 18:00:14169 reporting_service(nullptr),
Douglas Creager3cb042052018-11-06 23:08:52170 network_error_logging_service(nullptr),
171#endif
mmenke6ddfbea2017-05-31 21:48:41172 quic_clock(nullptr),
173 quic_random(nullptr),
174 quic_crypto_client_stream_factory(
Douglas Creager3cb042052018-11-06 23:08:52175 QuicCryptoClientStreamFactory::GetDefaultFactory()) {
176}
mmenke6ddfbea2017-05-31 21:48:41177
178HttpNetworkSession::Context::Context(const Context& other) = default;
179
Chris Watkins7a41d3552017-12-01 02:13:27180HttpNetworkSession::Context::~Context() = default;
mmenke6ddfbea2017-05-31 21:48:41181
[email protected]cf4cae32014-05-27 00:39:10182// TODO(mbelshe): Move the socket factories into HttpStreamFactory.
mmenke6ddfbea2017-05-31 21:48:41183HttpNetworkSession::HttpNetworkSession(const Params& params,
184 const Context& context)
185 : net_log_(context.net_log),
186 http_server_properties_(context.http_server_properties),
187 cert_verifier_(context.cert_verifier),
188 http_auth_handler_factory_(context.http_auth_handler_factory),
Douglas Creager3cb042052018-11-06 23:08:52189#if BUILDFLAG(ENABLE_REPORTING)
Douglas Creager134b52e2018-11-09 18:00:14190 reporting_service_(context.reporting_service),
Douglas Creager3cb042052018-11-06 23:08:52191 network_error_logging_service_(context.network_error_logging_service),
192#endif
Lily Houghton8c2f97d2018-01-22 05:06:59193 proxy_resolution_service_(context.proxy_resolution_service),
mmenke6ddfbea2017-05-31 21:48:41194 ssl_config_service_(context.ssl_config_service),
zhongyiaf257542016-12-19 03:36:01195 push_delegate_(nullptr),
jri2b966f22014-09-02 22:25:36196 quic_stream_factory_(
mmenke6ddfbea2017-05-31 21:48:41197 context.net_log,
198 context.host_resolver,
199 context.ssl_config_service,
200 context.client_socket_factory
201 ? context.client_socket_factory
ttuttle859dc7a2015-04-23 19:42:29202 : ClientSocketFactory::GetDefaultFactory(),
mmenke6ddfbea2017-05-31 21:48:41203 context.http_server_properties,
204 context.cert_verifier,
205 context.ct_policy_enforcer,
mmenke6ddfbea2017-05-31 21:48:41206 context.transport_security_state,
207 context.cert_transparency_verifier,
208 context.socket_performance_watcher_factory,
209 context.quic_crypto_client_stream_factory,
Ryan Hamilton8d9ee76e2018-05-29 23:52:52210 context.quic_random ? context.quic_random
211 : quic::QuicRandom::GetInstance(),
mmenke6ddfbea2017-05-31 21:48:41212 context.quic_clock ? context.quic_clock
Ryan Hamilton8d9ee76e2018-05-29 23:52:52213 : quic::QuicChromiumClock::GetInstance(),
jri2b966f22014-09-02 22:25:36214 params.quic_max_packet_length,
215 params.quic_user_agent_id,
rch431dd4452017-04-19 15:22:35216 params.quic_max_server_configs_stored_in_properties > 0,
Jana Iyengar903dec22017-11-28 00:44:23217 params.quic_close_sessions_on_ip_change,
Zhongyi Shi63574b72018-06-01 20:22:25218 params.quic_goaway_sessions_on_ip_change,
rch9ecde09b2017-04-08 00:18:23219 params.mark_quic_broken_when_network_blackholes,
rtenneti41c09992015-11-30 18:24:01220 params.quic_idle_connection_timeout_seconds,
zhongyidd1439f62016-09-02 02:02:26221 params.quic_reduced_ping_timeout_seconds,
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,
Renjiea0cb4a2c2018-09-26 23:37:30227 params.quic_race_stale_dns_on_connection,
Renjiea5722ccf2018-08-10 00:18:49228 params.quic_go_away_on_path_degrading,
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,
rtennetid073dd22016-08-04 01:58:33233 params.quic_race_cert_verification,
rchd6163f32017-01-30 23:50:38234 params.quic_estimate_initial_rtt,
Yixin Wang079ad542018-01-11 04:06:05235 params.quic_headers_include_h2_stream_dependency,
nharperd5cddca2016-02-27 03:37:52236 params.quic_connection_options,
Yixin Wang46a425f2017-08-10 23:02:20237 params.quic_client_connection_options,
kapishnikov7f8dd1e2018-01-24 06:10:49238 params.quic_enable_socket_recv_optimization),
mmenke6ddfbea2017-05-31 21:48:41239 spdy_session_pool_(context.host_resolver,
240 context.ssl_config_service,
241 context.http_server_properties,
242 context.transport_security_state,
zhongyi8ac630d2017-06-26 19:46:33243 params.quic_supported_versions,
[email protected]cf4cae32014-05-27 00:39:10244 params.enable_spdy_ping_based_connection_checking,
Yixin Wanga9afead2017-10-19 20:23:10245 params.support_ietf_format_quic_altsvc,
bnc8f0f3b62015-04-08 04:37:23246 params.spdy_session_max_recv_window_size,
bnc3171a2432016-12-28 18:40:26247 AddDefaultHttp2Settings(params.http2_settings),
Bence Béky6a070bcd2018-09-06 15:02:43248 params.greased_http2_frame,
Tarun Bansal647b30d2018-10-19 21:21:47249 params.time_func,
250 context.network_quality_estimator),
Xida Chen9bfe0b62018-04-24 19:52:21251 http_stream_factory_(std::make_unique<HttpStreamFactory>(this)),
mmenke6ddfbea2017-05-31 21:48:41252 params_(params),
253 context_(context) {
Lily Houghton8c2f97d2018-01-22 05:06:59254 DCHECK(proxy_resolution_service_);
Ryan Sleevib8449e02018-07-15 04:31:07255 DCHECK(ssl_config_service_);
[email protected]cf4cae32014-05-27 00:39:10256 CHECK(http_server_properties_);
257
vitalybukabfe0e4272015-12-03 01:51:42258 const std::string ssl_session_cache_shard =
259 "http_network_session/" + base::IntToString(g_next_shard_id.GetNext());
Juan Jose Lopez Jaimez7fa1f002017-11-20 22:13:33260 normal_socket_pool_manager_ = CreateSocketPoolManager(
Bence Békyda280c62018-04-12 15:08:37261 NORMAL_SOCKET_POOL, context, ssl_session_cache_shard,
Bence Béky33a4e432018-12-03 16:17:23262 &websocket_endpoint_lock_manager_);
Juan Jose Lopez Jaimez7fa1f002017-11-20 22:13:33263 websocket_socket_pool_manager_ = CreateSocketPoolManager(
Bence Békyda280c62018-04-12 15:08:37264 WEBSOCKET_SOCKET_POOL, context, ssl_session_cache_shard,
Bence Béky33a4e432018-12-03 16:17:23265 &websocket_endpoint_lock_manager_);
vitalybukabfe0e4272015-12-03 01:51:42266
bnc3f0118e2016-02-02 15:42:22267 if (params_.enable_http2) {
268 next_protos_.push_back(kProtoHTTP2);
bnc3f0118e2016-02-02 15:42:22269 }
270
271 next_protos_.push_back(kProtoHTTP11);
272
rtenneti6971c172016-01-15 20:12:10273 http_server_properties_->SetMaxServerConfigsStoredInProperties(
274 params.quic_max_server_configs_stored_in_properties);
maksim.sisov0adf8592016-07-15 06:25:56275
yucliu48f235d2018-01-11 00:59:55276 if (!params_.disable_idle_sockets_close_on_memory_pressure) {
277 memory_pressure_listener_.reset(
278 new base::MemoryPressureListener(base::BindRepeating(
279 &HttpNetworkSession::OnMemoryPressure, base::Unretained(this))));
280 }
[email protected]cf4cae32014-05-27 00:39:10281}
282
283HttpNetworkSession::~HttpNetworkSession() {
gab47aa7da2017-06-02 16:09:43284 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
avifceb32f62016-10-07 16:30:52285 response_drainers_.clear();
Bence Béky3ba8c332017-12-11 20:19:24286 // TODO(bnc): CloseAllSessions() is also called in SpdySessionPool destructor,
287 // one of the two calls should be removed.
[email protected]cf4cae32014-05-27 00:39:10288 spdy_session_pool_.CloseAllSessions();
289}
290
avifceb32f62016-10-07 16:30:52291void HttpNetworkSession::AddResponseDrainer(
292 std::unique_ptr<HttpResponseBodyDrainer> drainer) {
293 DCHECK(!base::ContainsKey(response_drainers_, drainer.get()));
294 HttpResponseBodyDrainer* drainer_ptr = drainer.get();
295 response_drainers_[drainer_ptr] = std::move(drainer);
[email protected]cf4cae32014-05-27 00:39:10296}
297
298void HttpNetworkSession::RemoveResponseDrainer(
299 HttpResponseBodyDrainer* drainer) {
skyostilb8f60ca2016-08-12 12:34:43300 DCHECK(base::ContainsKey(response_drainers_, drainer));
avifceb32f62016-10-07 16:30:52301 response_drainers_[drainer].release();
[email protected]cf4cae32014-05-27 00:39:10302 response_drainers_.erase(drainer);
303}
304
305TransportClientSocketPool* HttpNetworkSession::GetTransportSocketPool(
306 SocketPoolType pool_type) {
307 return GetSocketPoolManager(pool_type)->GetTransportSocketPool();
308}
309
310SSLClientSocketPool* HttpNetworkSession::GetSSLSocketPool(
311 SocketPoolType pool_type) {
312 return GetSocketPoolManager(pool_type)->GetSSLSocketPool();
313}
314
315SOCKSClientSocketPool* HttpNetworkSession::GetSocketPoolForSOCKSProxy(
316 SocketPoolType pool_type,
317 const HostPortPair& socks_proxy) {
318 return GetSocketPoolManager(pool_type)->GetSocketPoolForSOCKSProxy(
319 socks_proxy);
320}
321
322HttpProxyClientSocketPool* HttpNetworkSession::GetSocketPoolForHTTPProxy(
323 SocketPoolType pool_type,
324 const HostPortPair& http_proxy) {
325 return GetSocketPoolManager(pool_type)->GetSocketPoolForHTTPProxy(http_proxy);
326}
327
328SSLClientSocketPool* HttpNetworkSession::GetSocketPoolForSSLWithProxy(
329 SocketPoolType pool_type,
330 const HostPortPair& proxy_server) {
331 return GetSocketPoolManager(pool_type)->GetSocketPoolForSSLWithProxy(
332 proxy_server);
333}
334
danakj1fd259a02016-04-16 03:17:09335std::unique_ptr<base::Value> HttpNetworkSession::SocketPoolInfoToValue() const {
[email protected]cf4cae32014-05-27 00:39:10336 // TODO(yutak): Should merge values from normal pools and WebSocket pools.
337 return normal_socket_pool_manager_->SocketPoolInfoToValue();
338}
339
danakj1fd259a02016-04-16 03:17:09340std::unique_ptr<base::Value> HttpNetworkSession::SpdySessionPoolInfoToValue()
341 const {
[email protected]cf4cae32014-05-27 00:39:10342 return spdy_session_pool_.SpdySessionPoolInfoToValue();
343}
344
danakj1fd259a02016-04-16 03:17:09345std::unique_ptr<base::Value> HttpNetworkSession::QuicInfoToValue() const {
346 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
[email protected]cf4cae32014-05-27 00:39:10347 dict->Set("sessions", quic_stream_factory_.QuicStreamFactoryInfoToValue());
pmarko6ab8be242017-01-11 11:02:55348 dict->SetBoolean("quic_enabled", IsQuicEnabled());
rch53535742017-04-20 00:48:50349
Jeremy Roman0579ed62017-08-29 15:56:19350 auto connection_options(std::make_unique<base::ListValue>());
rch53535742017-04-20 00:48:50351 for (const auto& option : params_.quic_connection_options)
Ryan Hamilton8d9ee76e2018-05-29 23:52:52352 connection_options->AppendString(quic::QuicTagToString(option));
dchengc7eeda422015-12-26 03:56:48353 dict->Set("connection_options", std::move(connection_options));
rtenneti8a2f4632016-03-21 20:26:57354
Jeremy Roman0579ed62017-08-29 15:56:19355 auto supported_versions(std::make_unique<base::ListValue>());
rch53535742017-04-20 00:48:50356 for (const auto& version : params_.quic_supported_versions)
357 supported_versions->AppendString(QuicVersionToString(version));
358 dict->Set("supported_versions", std::move(supported_versions));
359
Jeremy Roman0579ed62017-08-29 15:56:19360 auto origins_to_force_quic_on(std::make_unique<base::ListValue>());
rch53535742017-04-20 00:48:50361 for (const auto& origin : params_.origins_to_force_quic_on)
362 origins_to_force_quic_on->AppendString(origin.ToString());
rtenneti8a2f4632016-03-21 20:26:57363 dict->Set("origins_to_force_quic_on", std::move(origins_to_force_quic_on));
364
rch53535742017-04-20 00:48:50365 dict->SetInteger("max_packet_length", params_.quic_max_packet_length);
rtenneti6971c172016-01-15 20:12:10366 dict->SetInteger("max_server_configs_stored_in_properties",
367 params_.quic_max_server_configs_stored_in_properties);
rtennetif4b29d72016-01-11 19:29:39368 dict->SetInteger("idle_connection_timeout_seconds",
369 params_.quic_idle_connection_timeout_seconds);
zhongyidd1439f62016-09-02 02:02:26370 dict->SetInteger("reduced_ping_timeout_seconds",
371 params_.quic_reduced_ping_timeout_seconds);
rch53535742017-04-20 00:48:50372 dict->SetBoolean("mark_quic_broken_when_network_blackholes",
373 params_.mark_quic_broken_when_network_blackholes);
374 dict->SetBoolean("retry_without_alt_svc_on_quic_errors",
375 params_.retry_without_alt_svc_on_quic_errors);
rtennetid073dd22016-08-04 01:58:33376 dict->SetBoolean("race_cert_verification",
377 params_.quic_race_cert_verification);
rch53535742017-04-20 00:48:50378 dict->SetBoolean("disable_bidirectional_streams",
379 params_.quic_disable_bidirectional_streams);
Jana Iyengar903dec22017-11-28 00:44:23380 dict->SetBoolean("close_sessions_on_ip_change",
381 params_.quic_close_sessions_on_ip_change);
Zhongyi Shi63574b72018-06-01 20:22:25382 dict->SetBoolean("goaway_sessions_on_ip_change",
383 params_.quic_goaway_sessions_on_ip_change);
Zhongyi Shif4683a32017-12-01 00:03:28384 dict->SetBoolean("migrate_sessions_on_network_change_v2",
385 params_.quic_migrate_sessions_on_network_change_v2);
386 dict->SetBoolean("migrate_sessions_early_v2",
387 params_.quic_migrate_sessions_early_v2);
Zhongyi Shi8de43832018-08-15 23:40:00388 dict->SetBoolean("retry_on_alternate_network_before_handshake",
389 params_.quic_retry_on_alternate_network_before_handshake);
Renjiea0cb4a2c2018-09-26 23:37:30390 dict->SetBoolean("race_stale_dns_on_connection",
391 params_.quic_race_stale_dns_on_connection);
Renjiea5722ccf2018-08-10 00:18:49392 dict->SetBoolean("go_away_on_path_degrading",
393 params_.quic_go_away_on_path_degrading);
Zhongyi Shi73f23ca872017-12-13 18:37:13394 dict->SetInteger("max_time_on_non_default_network_seconds",
395 params_.quic_max_time_on_non_default_network.InSeconds());
Zhongyi Shi8b1e43f2017-12-13 20:46:30396 dict->SetInteger(
Zhongyi Shiee760762018-08-01 00:54:29397 "max_num_migrations_to_non_default_network_on_write_error",
398 params_.quic_max_migrations_to_non_default_network_on_write_error);
399 dict->SetInteger(
Zhongyi Shi8b1e43f2017-12-13 20:46:30400 "max_num_migrations_to_non_default_network_on_path_degrading",
401 params_.quic_max_migrations_to_non_default_network_on_path_degrading);
rch53535742017-04-20 00:48:50402 dict->SetBoolean("allow_server_migration",
403 params_.quic_allow_server_migration);
rch53535742017-04-20 00:48:50404 dict->SetBoolean("estimate_initial_rtt", params_.quic_estimate_initial_rtt);
405 dict->SetBoolean("force_hol_blocking", params_.quic_force_hol_blocking);
zhongyif054cd02017-06-09 07:09:10406 dict->SetBoolean("server_push_cancellation",
407 params_.enable_server_push_cancellation);
rch53535742017-04-20 00:48:50408
dchengc7eeda422015-12-26 03:56:48409 return std::move(dict);
[email protected]cf4cae32014-05-27 00:39:10410}
411
412void HttpNetworkSession::CloseAllConnections() {
413 normal_socket_pool_manager_->FlushSocketPoolsWithError(ERR_ABORTED);
414 websocket_socket_pool_manager_->FlushSocketPoolsWithError(ERR_ABORTED);
415 spdy_session_pool_.CloseCurrentSessions(ERR_ABORTED);
Ryan Hamilton8d9ee76e2018-05-29 23:52:52416 quic_stream_factory_.CloseAllSessions(ERR_ABORTED, quic::QUIC_INTERNAL_ERROR);
[email protected]cf4cae32014-05-27 00:39:10417}
418
419void HttpNetworkSession::CloseIdleConnections() {
420 normal_socket_pool_manager_->CloseIdleSockets();
421 websocket_socket_pool_manager_->CloseIdleSockets();
422 spdy_session_pool_.CloseCurrentIdleSessions();
423}
424
bnc3472afd2016-11-17 15:27:21425bool HttpNetworkSession::IsProtocolEnabled(NextProto protocol) const {
bnc8f8225c2016-09-23 21:19:46426 switch (protocol) {
bnc3472afd2016-11-17 15:27:21427 case kProtoUnknown:
bnc8f8225c2016-09-23 21:19:46428 NOTREACHED();
429 return false;
bnc3472afd2016-11-17 15:27:21430 case kProtoHTTP11:
431 return true;
432 case kProtoHTTP2:
433 return params_.enable_http2;
434 case kProtoQUIC:
pmarko6ab8be242017-01-11 11:02:55435 return IsQuicEnabled();
bnc8f8225c2016-09-23 21:19:46436 }
437 NOTREACHED();
438 return false;
[email protected]cf4cae32014-05-27 00:39:10439}
440
zhongyiaf257542016-12-19 03:36:01441void HttpNetworkSession::SetServerPushDelegate(
442 std::unique_ptr<ServerPushDelegate> push_delegate) {
zhongyid7dd2db12017-04-14 17:01:25443 DCHECK(push_delegate);
444 if (!params_.enable_server_push_cancellation || push_delegate_)
445 return;
zhongyiaf257542016-12-19 03:36:01446
447 push_delegate_ = std::move(push_delegate);
448 spdy_session_pool_.set_server_push_delegate(push_delegate_.get());
449 quic_stream_factory_.set_server_push_delegate(push_delegate_.get());
450}
451
bnc1f295372015-10-21 23:24:22452void HttpNetworkSession::GetAlpnProtos(NextProtoVector* alpn_protos) const {
bnc927c4962016-07-21 14:45:59453 *alpn_protos = next_protos_;
bnc1f295372015-10-21 23:24:22454}
455
nharper8cdb0fb2016-04-22 21:34:59456void HttpNetworkSession::GetSSLConfig(const HttpRequestInfo& request,
457 SSLConfig* server_config,
458 SSLConfig* proxy_config) const {
459 ssl_config_service_->GetSSLConfig(server_config);
460 GetAlpnProtos(&server_config->alpn_protos);
Jesse Seloverdaf87902018-12-03 20:44:30461 server_config->ignore_certificate_errors = params_.ignore_certificate_errors;
nharper8cdb0fb2016-04-22 21:34:59462 *proxy_config = *server_config;
463 if (request.privacy_mode == PRIVACY_MODE_ENABLED) {
464 server_config->channel_id_enabled = false;
Nick Harper1e5757d42018-05-02 23:08:57465 } else {
466 server_config->channel_id_enabled = params_.enable_channel_id;
Nick Harper25a0c4b2018-06-07 23:40:01467 proxy_config->channel_id_enabled = params_.enable_channel_id;
nharper8cdb0fb2016-04-22 21:34:59468 }
469}
470
xunjieli9f8c5fb52016-12-07 22:59:33471void HttpNetworkSession::DumpMemoryStats(
472 base::trace_event::ProcessMemoryDump* pmd,
473 const std::string& parent_absolute_name) const {
xunjielid5debfc2017-02-24 15:55:49474 std::string name = base::StringPrintf("net/http_network_session_0x%" PRIxPTR,
475 reinterpret_cast<uintptr_t>(this));
xunjieli9f8c5fb52016-12-07 22:59:33476 base::trace_event::MemoryAllocatorDump* http_network_session_dump =
477 pmd->GetAllocatorDump(name);
xunjieli2a2468bd2017-01-04 21:17:33478 if (http_network_session_dump == nullptr) {
479 http_network_session_dump = pmd->CreateAllocatorDump(name);
480 normal_socket_pool_manager_->DumpMemoryStats(
481 pmd, http_network_session_dump->absolute_name());
482 spdy_session_pool_.DumpMemoryStats(
483 pmd, http_network_session_dump->absolute_name());
xunjielif5267de2017-01-20 21:18:57484 if (http_stream_factory_) {
485 http_stream_factory_->DumpMemoryStats(
486 pmd, http_network_session_dump->absolute_name());
487 }
xunjieli69720dd2017-01-30 15:36:29488 quic_stream_factory_.DumpMemoryStats(
489 pmd, http_network_session_dump->absolute_name());
xunjieli9f8c5fb52016-12-07 22:59:33490 }
xunjielid5debfc2017-02-24 15:55:49491
xunjieli2a2468bd2017-01-04 21:17:33492 // Create an empty row under parent's dump so size can be attributed correctly
493 // if |this| is shared between URLRequestContexts.
494 base::trace_event::MemoryAllocatorDump* empty_row_dump =
495 pmd->CreateAllocatorDump(base::StringPrintf(
496 "%s/http_network_session", parent_absolute_name.c_str()));
497 pmd->AddOwnershipEdge(empty_row_dump->guid(),
xunjieli9f8c5fb52016-12-07 22:59:33498 http_network_session_dump->guid());
499}
500
pmarko6ab8be242017-01-11 11:02:55501bool HttpNetworkSession::IsQuicEnabled() const {
502 return params_.enable_quic;
503}
504
505void HttpNetworkSession::DisableQuic() {
506 params_.enable_quic = false;
507}
508
[email protected]cf4cae32014-05-27 00:39:10509ClientSocketPoolManager* HttpNetworkSession::GetSocketPoolManager(
510 SocketPoolType pool_type) {
511 switch (pool_type) {
512 case NORMAL_SOCKET_POOL:
513 return normal_socket_pool_manager_.get();
514 case WEBSOCKET_SOCKET_POOL:
515 return websocket_socket_pool_manager_.get();
516 default:
517 NOTREACHED();
518 break;
519 }
520 return NULL;
521}
522
maksim.sisov0adf8592016-07-15 06:25:56523void HttpNetworkSession::OnMemoryPressure(
524 base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) {
yucliu48f235d2018-01-11 00:59:55525 DCHECK(!params_.disable_idle_sockets_close_on_memory_pressure);
526
maksim.sisov0adf8592016-07-15 06:25:56527 switch (memory_pressure_level) {
528 case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE:
yucliu9462d912017-11-22 02:41:23529 break;
yucliu48f235d2018-01-11 00:59:55530
531 case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE:
maksim.sisov0adf8592016-07-15 06:25:56532 case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL:
533 CloseIdleConnections();
534 break;
535 }
536}
537
ttuttle859dc7a2015-04-23 19:42:29538} // namespace net