blob: 41b9d3dae90e17dc86e205702693edefe9e4dc8b [file] [log] [blame]
[email protected]cf4cae32014-05-27 00:39:101// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/http/http_network_session.h"
6
xunjielid5debfc2017-02-24 15:55:497#include <inttypes.h>
Bence Béky8cae04e2018-01-15 18:37:068
[email protected]cf4cae32014-05-27 00:39:109#include <utility>
10
vitalybukabfe0e4272015-12-03 01:51:4211#include "base/atomic_sequence_num.h"
[email protected]cf4cae32014-05-27 00:39:1012#include "base/compiler_specific.h"
13#include "base/debug/stack_trace.h"
14#include "base/logging.h"
hajimehoshi8156e7c2016-09-29 06:17:5215#include "base/memory/memory_coordinator_client_registry.h"
vitalybukabfe0e4272015-12-03 01:51:4216#include "base/strings/string_number_conversions.h"
[email protected]cf4cae32014-05-27 00:39:1017#include "base/strings/string_util.h"
xunjieli9f8c5fb52016-12-07 22:59:3318#include "base/strings/stringprintf.h"
19#include "base/trace_event/memory_allocator_dump.h"
xunjielif5267de2017-01-20 21:18:5720#include "base/trace_event/memory_dump_request_args.h"
xunjieli9f8c5fb52016-12-07 22:59:3321#include "base/trace_event/process_memory_dump.h"
[email protected]cf4cae32014-05-27 00:39:1022#include "base/values.h"
23#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"
Ryan Hamiltona3ee93a72018-08-01 22:03:0828#include "net/quic/quic_crypto_client_stream_factory.h"
29#include "net/quic/quic_stream_factory.h"
[email protected]cf4cae32014-05-27 00:39:1030#include "net/socket/client_socket_factory.h"
31#include "net/socket/client_socket_pool_manager_impl.h"
32#include "net/socket/next_proto.h"
bnc1e757502014-12-13 02:20:1633#include "net/socket/ssl_client_socket.h"
Bence Békyda280c62018-04-12 15:08:3734#include "net/socket/websocket_endpoint_lock_manager.h"
Bence Béky94658bf2018-05-11 19:22:5835#include "net/spdy/spdy_session_pool.h"
Ryan Hamilton56b10c5d2018-05-11 13:40:1636#include "net/third_party/quic/core/crypto/quic_random.h"
37#include "net/third_party/quic/core/quic_packets.h"
38#include "net/third_party/quic/core/quic_tag.h"
39#include "net/third_party/quic/core/quic_utils.h"
40#include "net/third_party/quic/platform/impl/quic_chromium_clock.h"
[email protected]cf4cae32014-05-27 00:39:1041
ttuttle859dc7a2015-04-23 19:42:2942namespace net {
43
[email protected]cf4cae32014-05-27 00:39:1044namespace {
45
tzik74c2eb2c2017-07-25 15:26:1546base::AtomicSequenceNumber g_next_shard_id;
vitalybukabfe0e4272015-12-03 01:51:4247
Juan Jose Lopez Jaimez7fa1f002017-11-20 22:13:3348std::unique_ptr<ClientSocketPoolManager> CreateSocketPoolManager(
ttuttle859dc7a2015-04-23 19:42:2949 HttpNetworkSession::SocketPoolType pool_type,
mmenke6ddfbea2017-05-31 21:48:4150 const HttpNetworkSession::Context& context,
Bence Békyda280c62018-04-12 15:08:3751 const std::string& ssl_session_cache_shard,
52 WebSocketEndpointLockManager* websocket_endpoint_lock_manager) {
[email protected]cf4cae32014-05-27 00:39:1053 // TODO(yutak): Differentiate WebSocket pool manager and allow more
54 // simultaneous connections for WebSockets.
Juan Jose Lopez Jaimez7fa1f002017-11-20 22:13:3355 return std::make_unique<ClientSocketPoolManagerImpl>(
mmenke6ddfbea2017-05-31 21:48:4156 context.net_log,
57 context.client_socket_factory ? context.client_socket_factory
58 : ClientSocketFactory::GetDefaultFactory(),
tbansal16196a1e2017-06-09 01:50:0959 context.socket_performance_watcher_factory,
60 context.network_quality_provider, context.host_resolver,
mmenke6ddfbea2017-05-31 21:48:4161 context.cert_verifier, context.channel_id_service,
62 context.transport_security_state, context.cert_transparency_verifier,
63 context.ct_policy_enforcer, ssl_session_cache_shard,
Bence Békyda280c62018-04-12 15:08:3764 context.ssl_config_service, websocket_endpoint_lock_manager, pool_type);
[email protected]cf4cae32014-05-27 00:39:1065}
66
67} // unnamed namespace
68
bnc8f0f3b62015-04-08 04:37:2369// The maximum receive window sizes for HTTP/2 sessions and streams.
Avi Drissman13fc8932015-12-20 04:40:4670const int32_t kSpdySessionMaxRecvWindowSize = 15 * 1024 * 1024; // 15 MB
71const int32_t kSpdyStreamMaxRecvWindowSize = 6 * 1024 * 1024; // 6 MB
bnc8f0f3b62015-04-08 04:37:2372
bnc3171a2432016-12-28 18:40:2673namespace {
74
75// Keep all HTTP2 parameters in |http2_settings|, even the ones that are not
76// implemented, to be sent to the server.
77// Set default values for settings that |http2_settings| does not specify.
Ryan Hamilton0239aac2018-05-19 00:03:1378spdy::SettingsMap AddDefaultHttp2Settings(spdy::SettingsMap http2_settings) {
bnc3171a2432016-12-28 18:40:2679 // Set default values only if |http2_settings| does not have
80 // a value set for given setting.
Ryan Hamilton0239aac2018-05-19 00:03:1381 spdy::SettingsMap::iterator it =
82 http2_settings.find(spdy::SETTINGS_HEADER_TABLE_SIZE);
bnc3171a2432016-12-28 18:40:2683 if (it == http2_settings.end())
Ryan Hamilton0239aac2018-05-19 00:03:1384 http2_settings[spdy::SETTINGS_HEADER_TABLE_SIZE] = kSpdyMaxHeaderTableSize;
bnc3171a2432016-12-28 18:40:2685
Ryan Hamilton0239aac2018-05-19 00:03:1386 it = http2_settings.find(spdy::SETTINGS_MAX_CONCURRENT_STREAMS);
bnc3171a2432016-12-28 18:40:2687 if (it == http2_settings.end())
Ryan Hamilton0239aac2018-05-19 00:03:1388 http2_settings[spdy::SETTINGS_MAX_CONCURRENT_STREAMS] =
bnc3171a2432016-12-28 18:40:2689 kSpdyMaxConcurrentPushedStreams;
90
Ryan Hamilton0239aac2018-05-19 00:03:1391 it = http2_settings.find(spdy::SETTINGS_INITIAL_WINDOW_SIZE);
bnc3171a2432016-12-28 18:40:2692 if (it == http2_settings.end())
Ryan Hamilton0239aac2018-05-19 00:03:1393 http2_settings[spdy::SETTINGS_INITIAL_WINDOW_SIZE] =
94 kSpdyStreamMaxRecvWindowSize;
bnc3171a2432016-12-28 18:40:2695
96 return http2_settings;
97}
98
99} // unnamed namespace
100
[email protected]cf4cae32014-05-27 00:39:10101HttpNetworkSession::Params::Params()
mmenke6ddfbea2017-05-31 21:48:41102 : enable_server_push_cancellation(false),
[email protected]cf4cae32014-05-27 00:39:10103 ignore_certificate_errors(false),
104 testing_fixed_http_port(0),
105 testing_fixed_https_port(0),
Matt Menke53c59762017-09-14 16:38:12106 tcp_fast_open_mode(TcpFastOpenMode::DISABLED),
rch1546ccd2017-04-20 02:14:23107 enable_user_alternate_protocol_ports(false),
[email protected]cf4cae32014-05-27 00:39:10108 enable_spdy_ping_based_connection_checking(true),
bncefcd9652016-02-03 18:00:32109 enable_http2(true),
bnc8f0f3b62015-04-08 04:37:23110 spdy_session_max_recv_window_size(kSpdySessionMaxRecvWindowSize),
[email protected]cf4cae32014-05-27 00:39:10111 time_func(&base::TimeTicks::Now),
bnca86731e2017-04-17 12:31:28112 enable_http2_alternative_service(false),
Bence Béky8bfacd42018-02-23 13:05:13113 enable_websocket_over_http2(false),
[email protected]cf4cae32014-05-27 00:39:10114 enable_quic(false),
Ryan Hamilton8d9ee76e2018-05-29 23:52:52115 quic_max_packet_length(quic::kDefaultMaxPacketSize),
rch1546ccd2017-04-20 02:14:23116 quic_max_server_configs_stored_in_properties(0u),
kapishnikov7f8dd1e2018-01-24 06:10:49117 quic_enable_socket_recv_optimization(false),
rch1546ccd2017-04-20 02:14:23118 mark_quic_broken_when_network_blackholes(false),
Ryan Hamiltonb3827e882018-03-27 03:07:48119 retry_without_alt_svc_on_quic_errors(true),
Yixin Wanga9afead2017-10-19 20:23:10120 support_ietf_format_quic_altsvc(false),
Jana Iyengar903dec22017-11-28 00:44:23121 quic_close_sessions_on_ip_change(false),
Zhongyi Shi63574b72018-06-01 20:22:25122 quic_goaway_sessions_on_ip_change(false),
rtenneti41c09992015-11-30 18:24:01123 quic_idle_connection_timeout_seconds(kIdleConnectionTimeoutSeconds),
Ryan Hamilton8d9ee76e2018-05-29 23:52:52124 quic_reduced_ping_timeout_seconds(quic::kPingTimeoutSecs),
Yixin Wang469da562017-11-15 21:34:58125 quic_max_time_before_crypto_handshake_seconds(
Ryan Hamilton8d9ee76e2018-05-29 23:52:52126 quic::kMaxTimeForCryptoHandshakeSecs),
Yixin Wang469da562017-11-15 21:34:58127 quic_max_idle_time_before_crypto_handshake_seconds(
Ryan Hamilton8d9ee76e2018-05-29 23:52:52128 quic::kInitialIdleTimeoutSecs),
Zhongyi Shif4683a32017-12-01 00:03:28129 quic_migrate_sessions_on_network_change_v2(false),
130 quic_migrate_sessions_early_v2(false),
Zhongyi Shi8de43832018-08-15 23:40:00131 quic_retry_on_alternate_network_before_handshake(false),
Renjiea5722ccf2018-08-10 00:18:49132 quic_go_away_on_path_degrading(false),
Zhongyi Shi73f23ca872017-12-13 18:37:13133 quic_max_time_on_non_default_network(
134 base::TimeDelta::FromSeconds(kMaxTimeOnNonDefaultNetworkSecs)),
Zhongyi Shiee760762018-08-01 00:54:29135 quic_max_migrations_to_non_default_network_on_write_error(
136 kMaxMigrationsToNonDefaultNetworkOnWriteError),
Zhongyi Shi8b1e43f2017-12-13 20:46:30137 quic_max_migrations_to_non_default_network_on_path_degrading(
138 kMaxMigrationsToNonDefaultNetworkOnPathDegrading),
jri217455a12016-07-13 20:15:09139 quic_allow_server_migration(false),
Ryan Hamilton0d326362018-01-30 06:05:10140 quic_allow_remote_alt_svc(true),
xunjieli888c29922016-03-18 21:05:09141 quic_disable_bidirectional_streams(false),
ckrasicda193a82016-07-09 00:39:36142 quic_force_hol_blocking(false),
rtennetid073dd22016-08-04 01:58:33143 quic_race_cert_verification(false),
rchd6163f32017-01-30 23:50:38144 quic_estimate_initial_rtt(false),
Yixin Wang079ad542018-01-11 04:06:05145 quic_headers_include_h2_stream_dependency(false),
mmenkea7da6da2016-09-01 21:56:52146 enable_token_binding(false),
Nick Harper1e5757d42018-05-02 23:08:57147 enable_channel_id(false),
yucliu48f235d2018-01-11 00:59:55148 http_09_on_non_default_ports_enabled(false),
149 disable_idle_sockets_close_on_memory_pressure(false) {
Ryan Hamilton8d9ee76e2018-05-29 23:52:52150 quic_supported_versions.push_back(quic::QUIC_VERSION_43);
[email protected]cf4cae32014-05-27 00:39:10151}
152
vmpstracd23b72016-02-26 21:08:55153HttpNetworkSession::Params::Params(const Params& other) = default;
154
Chris Watkins7a41d3552017-12-01 02:13:27155HttpNetworkSession::Params::~Params() = default;
[email protected]cf4cae32014-05-27 00:39:10156
mmenke6ddfbea2017-05-31 21:48:41157HttpNetworkSession::Context::Context()
158 : client_socket_factory(nullptr),
159 host_resolver(nullptr),
160 cert_verifier(nullptr),
161 channel_id_service(nullptr),
162 transport_security_state(nullptr),
163 cert_transparency_verifier(nullptr),
164 ct_policy_enforcer(nullptr),
Lily Houghton8c2f97d2018-01-22 05:06:59165 proxy_resolution_service(nullptr),
mmenke6ddfbea2017-05-31 21:48:41166 ssl_config_service(nullptr),
167 http_auth_handler_factory(nullptr),
168 net_log(nullptr),
169 socket_performance_watcher_factory(nullptr),
tbansal16196a1e2017-06-09 01:50:09170 network_quality_provider(nullptr),
mmenke6ddfbea2017-05-31 21:48:41171 quic_clock(nullptr),
172 quic_random(nullptr),
173 quic_crypto_client_stream_factory(
Eric Roman3d8546a2018-09-10 17:00:52174 QuicCryptoClientStreamFactory::GetDefaultFactory()) {}
mmenke6ddfbea2017-05-31 21:48:41175
176HttpNetworkSession::Context::Context(const Context& other) = default;
177
Chris Watkins7a41d3552017-12-01 02:13:27178HttpNetworkSession::Context::~Context() = default;
mmenke6ddfbea2017-05-31 21:48:41179
[email protected]cf4cae32014-05-27 00:39:10180// TODO(mbelshe): Move the socket factories into HttpStreamFactory.
mmenke6ddfbea2017-05-31 21:48:41181HttpNetworkSession::HttpNetworkSession(const Params& params,
182 const Context& context)
183 : net_log_(context.net_log),
184 http_server_properties_(context.http_server_properties),
185 cert_verifier_(context.cert_verifier),
186 http_auth_handler_factory_(context.http_auth_handler_factory),
Lily Houghton8c2f97d2018-01-22 05:06:59187 proxy_resolution_service_(context.proxy_resolution_service),
mmenke6ddfbea2017-05-31 21:48:41188 ssl_config_service_(context.ssl_config_service),
Bence Békyda280c62018-04-12 15:08:37189 websocket_endpoint_lock_manager_(
190 std::make_unique<WebSocketEndpointLockManager>()),
zhongyiaf257542016-12-19 03:36:01191 push_delegate_(nullptr),
jri2b966f22014-09-02 22:25:36192 quic_stream_factory_(
mmenke6ddfbea2017-05-31 21:48:41193 context.net_log,
194 context.host_resolver,
195 context.ssl_config_service,
196 context.client_socket_factory
197 ? context.client_socket_factory
ttuttle859dc7a2015-04-23 19:42:29198 : ClientSocketFactory::GetDefaultFactory(),
mmenke6ddfbea2017-05-31 21:48:41199 context.http_server_properties,
200 context.cert_verifier,
201 context.ct_policy_enforcer,
202 context.channel_id_service,
203 context.transport_security_state,
204 context.cert_transparency_verifier,
205 context.socket_performance_watcher_factory,
206 context.quic_crypto_client_stream_factory,
Ryan Hamilton8d9ee76e2018-05-29 23:52:52207 context.quic_random ? context.quic_random
208 : quic::QuicRandom::GetInstance(),
mmenke6ddfbea2017-05-31 21:48:41209 context.quic_clock ? context.quic_clock
Ryan Hamilton8d9ee76e2018-05-29 23:52:52210 : quic::QuicChromiumClock::GetInstance(),
jri2b966f22014-09-02 22:25:36211 params.quic_max_packet_length,
212 params.quic_user_agent_id,
rch431dd4452017-04-19 15:22:35213 params.quic_max_server_configs_stored_in_properties > 0,
Jana Iyengar903dec22017-11-28 00:44:23214 params.quic_close_sessions_on_ip_change,
Zhongyi Shi63574b72018-06-01 20:22:25215 params.quic_goaway_sessions_on_ip_change,
rch9ecde09b2017-04-08 00:18:23216 params.mark_quic_broken_when_network_blackholes,
rtenneti41c09992015-11-30 18:24:01217 params.quic_idle_connection_timeout_seconds,
zhongyidd1439f62016-09-02 02:02:26218 params.quic_reduced_ping_timeout_seconds,
Yixin Wang469da562017-11-15 21:34:58219 params.quic_max_time_before_crypto_handshake_seconds,
220 params.quic_max_idle_time_before_crypto_handshake_seconds,
Zhongyi Shif4683a32017-12-01 00:03:28221 params.quic_migrate_sessions_on_network_change_v2,
222 params.quic_migrate_sessions_early_v2,
Zhongyi Shi8de43832018-08-15 23:40:00223 params.quic_retry_on_alternate_network_before_handshake,
Renjiea5722ccf2018-08-10 00:18:49224 params.quic_go_away_on_path_degrading,
Zhongyi Shi73f23ca872017-12-13 18:37:13225 params.quic_max_time_on_non_default_network,
Zhongyi Shiee760762018-08-01 00:54:29226 params.quic_max_migrations_to_non_default_network_on_write_error,
Zhongyi Shi8b1e43f2017-12-13 20:46:30227 params.quic_max_migrations_to_non_default_network_on_path_degrading,
jri217455a12016-07-13 20:15:09228 params.quic_allow_server_migration,
rtennetid073dd22016-08-04 01:58:33229 params.quic_race_cert_verification,
rchd6163f32017-01-30 23:50:38230 params.quic_estimate_initial_rtt,
Yixin Wang079ad542018-01-11 04:06:05231 params.quic_headers_include_h2_stream_dependency,
nharperd5cddca2016-02-27 03:37:52232 params.quic_connection_options,
Yixin Wang46a425f2017-08-10 23:02:20233 params.quic_client_connection_options,
kapishnikov7f8dd1e2018-01-24 06:10:49234 params.enable_token_binding,
Nick Harper1e5757d42018-05-02 23:08:57235 params.enable_channel_id,
kapishnikov7f8dd1e2018-01-24 06:10:49236 params.quic_enable_socket_recv_optimization),
mmenke6ddfbea2017-05-31 21:48:41237 spdy_session_pool_(context.host_resolver,
238 context.ssl_config_service,
239 context.http_server_properties,
240 context.transport_security_state,
zhongyi8ac630d2017-06-26 19:46:33241 params.quic_supported_versions,
[email protected]cf4cae32014-05-27 00:39:10242 params.enable_spdy_ping_based_connection_checking,
Yixin Wanga9afead2017-10-19 20:23:10243 params.support_ietf_format_quic_altsvc,
bnc8f0f3b62015-04-08 04:37:23244 params.spdy_session_max_recv_window_size,
bnc3171a2432016-12-28 18:40:26245 AddDefaultHttp2Settings(params.http2_settings),
Bence Béky6a070bcd2018-09-06 15:02:43246 params.greased_http2_frame,
Reilly Grantf29015e72018-01-24 21:47:26247 params.time_func),
Xida Chen9bfe0b62018-04-24 19:52:21248 http_stream_factory_(std::make_unique<HttpStreamFactory>(this)),
mmenke6ddfbea2017-05-31 21:48:41249 params_(params),
250 context_(context) {
Lily Houghton8c2f97d2018-01-22 05:06:59251 DCHECK(proxy_resolution_service_);
Ryan Sleevib8449e02018-07-15 04:31:07252 DCHECK(ssl_config_service_);
[email protected]cf4cae32014-05-27 00:39:10253 CHECK(http_server_properties_);
254
vitalybukabfe0e4272015-12-03 01:51:42255 const std::string ssl_session_cache_shard =
256 "http_network_session/" + base::IntToString(g_next_shard_id.GetNext());
Juan Jose Lopez Jaimez7fa1f002017-11-20 22:13:33257 normal_socket_pool_manager_ = CreateSocketPoolManager(
Bence Békyda280c62018-04-12 15:08:37258 NORMAL_SOCKET_POOL, context, ssl_session_cache_shard,
259 websocket_endpoint_lock_manager_.get());
Juan Jose Lopez Jaimez7fa1f002017-11-20 22:13:33260 websocket_socket_pool_manager_ = CreateSocketPoolManager(
Bence Békyda280c62018-04-12 15:08:37261 WEBSOCKET_SOCKET_POOL, context, ssl_session_cache_shard,
262 websocket_endpoint_lock_manager_.get());
vitalybukabfe0e4272015-12-03 01:51:42263
bnc3f0118e2016-02-02 15:42:22264 if (params_.enable_http2) {
265 next_protos_.push_back(kProtoHTTP2);
bnc3f0118e2016-02-02 15:42:22266 }
267
268 next_protos_.push_back(kProtoHTTP11);
269
rtenneti6971c172016-01-15 20:12:10270 http_server_properties_->SetMaxServerConfigsStoredInProperties(
271 params.quic_max_server_configs_stored_in_properties);
maksim.sisov0adf8592016-07-15 06:25:56272
yucliu48f235d2018-01-11 00:59:55273 if (!params_.disable_idle_sockets_close_on_memory_pressure) {
274 memory_pressure_listener_.reset(
275 new base::MemoryPressureListener(base::BindRepeating(
276 &HttpNetworkSession::OnMemoryPressure, base::Unretained(this))));
277 }
278
hajimehoshi8156e7c2016-09-29 06:17:52279 base::MemoryCoordinatorClientRegistry::GetInstance()->Register(this);
[email protected]cf4cae32014-05-27 00:39:10280}
281
282HttpNetworkSession::~HttpNetworkSession() {
gab47aa7da2017-06-02 16:09:43283 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
avifceb32f62016-10-07 16:30:52284 response_drainers_.clear();
Bence Béky3ba8c332017-12-11 20:19:24285 // TODO(bnc): CloseAllSessions() is also called in SpdySessionPool destructor,
286 // one of the two calls should be removed.
[email protected]cf4cae32014-05-27 00:39:10287 spdy_session_pool_.CloseAllSessions();
hajimehoshi8156e7c2016-09-29 06:17:52288 base::MemoryCoordinatorClientRegistry::GetInstance()->Unregister(this);
[email protected]cf4cae32014-05-27 00:39:10289}
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);
Renjiea5722ccf2018-08-10 00:18:49390 dict->SetBoolean("go_away_on_path_degrading",
391 params_.quic_go_away_on_path_degrading);
Zhongyi Shi73f23ca872017-12-13 18:37:13392 dict->SetInteger("max_time_on_non_default_network_seconds",
393 params_.quic_max_time_on_non_default_network.InSeconds());
Zhongyi Shi8b1e43f2017-12-13 20:46:30394 dict->SetInteger(
Zhongyi Shiee760762018-08-01 00:54:29395 "max_num_migrations_to_non_default_network_on_write_error",
396 params_.quic_max_migrations_to_non_default_network_on_write_error);
397 dict->SetInteger(
Zhongyi Shi8b1e43f2017-12-13 20:46:30398 "max_num_migrations_to_non_default_network_on_path_degrading",
399 params_.quic_max_migrations_to_non_default_network_on_path_degrading);
rch53535742017-04-20 00:48:50400 dict->SetBoolean("allow_server_migration",
401 params_.quic_allow_server_migration);
rch53535742017-04-20 00:48:50402 dict->SetBoolean("estimate_initial_rtt", params_.quic_estimate_initial_rtt);
403 dict->SetBoolean("force_hol_blocking", params_.quic_force_hol_blocking);
zhongyif054cd02017-06-09 07:09:10404 dict->SetBoolean("server_push_cancellation",
405 params_.enable_server_push_cancellation);
rch53535742017-04-20 00:48:50406
dchengc7eeda422015-12-26 03:56:48407 return std::move(dict);
[email protected]cf4cae32014-05-27 00:39:10408}
409
410void HttpNetworkSession::CloseAllConnections() {
411 normal_socket_pool_manager_->FlushSocketPoolsWithError(ERR_ABORTED);
412 websocket_socket_pool_manager_->FlushSocketPoolsWithError(ERR_ABORTED);
413 spdy_session_pool_.CloseCurrentSessions(ERR_ABORTED);
Ryan Hamilton8d9ee76e2018-05-29 23:52:52414 quic_stream_factory_.CloseAllSessions(ERR_ABORTED, quic::QUIC_INTERNAL_ERROR);
[email protected]cf4cae32014-05-27 00:39:10415}
416
417void HttpNetworkSession::CloseIdleConnections() {
418 normal_socket_pool_manager_->CloseIdleSockets();
419 websocket_socket_pool_manager_->CloseIdleSockets();
420 spdy_session_pool_.CloseCurrentIdleSessions();
421}
422
bnc3472afd2016-11-17 15:27:21423bool HttpNetworkSession::IsProtocolEnabled(NextProto protocol) const {
bnc8f8225c2016-09-23 21:19:46424 switch (protocol) {
bnc3472afd2016-11-17 15:27:21425 case kProtoUnknown:
bnc8f8225c2016-09-23 21:19:46426 NOTREACHED();
427 return false;
bnc3472afd2016-11-17 15:27:21428 case kProtoHTTP11:
429 return true;
430 case kProtoHTTP2:
431 return params_.enable_http2;
432 case kProtoQUIC:
pmarko6ab8be242017-01-11 11:02:55433 return IsQuicEnabled();
bnc8f8225c2016-09-23 21:19:46434 }
435 NOTREACHED();
436 return false;
[email protected]cf4cae32014-05-27 00:39:10437}
438
zhongyiaf257542016-12-19 03:36:01439void HttpNetworkSession::SetServerPushDelegate(
440 std::unique_ptr<ServerPushDelegate> push_delegate) {
zhongyid7dd2db12017-04-14 17:01:25441 DCHECK(push_delegate);
442 if (!params_.enable_server_push_cancellation || push_delegate_)
443 return;
zhongyiaf257542016-12-19 03:36:01444
445 push_delegate_ = std::move(push_delegate);
446 spdy_session_pool_.set_server_push_delegate(push_delegate_.get());
447 quic_stream_factory_.set_server_push_delegate(push_delegate_.get());
448}
449
bnc1f295372015-10-21 23:24:22450void HttpNetworkSession::GetAlpnProtos(NextProtoVector* alpn_protos) const {
bnc927c4962016-07-21 14:45:59451 *alpn_protos = next_protos_;
bnc1f295372015-10-21 23:24:22452}
453
nharper8cdb0fb2016-04-22 21:34:59454void HttpNetworkSession::GetSSLConfig(const HttpRequestInfo& request,
455 SSLConfig* server_config,
456 SSLConfig* proxy_config) const {
457 ssl_config_service_->GetSSLConfig(server_config);
458 GetAlpnProtos(&server_config->alpn_protos);
nharper8cdb0fb2016-04-22 21:34:59459 *proxy_config = *server_config;
460 if (request.privacy_mode == PRIVACY_MODE_ENABLED) {
461 server_config->channel_id_enabled = false;
Nick Harper1e5757d42018-05-02 23:08:57462 } else {
463 server_config->channel_id_enabled = params_.enable_channel_id;
Nick Harper25a0c4b2018-06-07 23:40:01464 proxy_config->channel_id_enabled = params_.enable_channel_id;
Nick Harper1e5757d42018-05-02 23:08:57465 if (params_.enable_token_binding && context_.channel_id_service) {
466 server_config->token_binding_params.push_back(TB_PARAM_ECDSAP256);
467 }
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
bashi56b23f302017-02-09 01:24:57538void HttpNetworkSession::OnPurgeMemory() {
539 CloseIdleConnections();
hajimehoshi8156e7c2016-09-29 06:17:52540}
541
ttuttle859dc7a2015-04-23 19:42:29542} // namespace net