blob: 53c2c42059c81d0c52f1a299bf6ea10a03531b74 [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>
Juan Jose Lopez Jaimez7fa1f002017-11-20 22:13:338#include <memory>
[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"
rdsmithbf8c3c12016-11-18 18:16:2423#include "net/base/network_throttle_manager_impl.h"
[email protected]cf4cae32014-05-27 00:39:1024#include "net/http/http_auth_handler_factory.h"
25#include "net/http/http_response_body_drainer.h"
26#include "net/http/http_stream_factory_impl.h"
27#include "net/http/url_security_manager.h"
28#include "net/proxy/proxy_service.h"
rch223465c2016-12-08 21:17:2929#include "net/quic/chromium/quic_crypto_client_stream_factory.h"
rch675757b2016-07-29 16:40:1130#include "net/quic/chromium/quic_stream_factory.h"
rchd4db7c152016-07-29 21:58:1231#include "net/quic/core/crypto/quic_random.h"
vasilvv28270e8f2016-12-01 21:38:0932#include "net/quic/core/quic_packets.h"
mpw94250b82016-11-19 18:13:3033#include "net/quic/core/quic_tag.h"
rchd4db7c152016-07-29 21:58:1234#include "net/quic/core/quic_utils.h"
rch799bbe82016-12-06 15:30:0935#include "net/quic/platform/impl/quic_chromium_clock.h"
[email protected]cf4cae32014-05-27 00:39:1036#include "net/socket/client_socket_factory.h"
37#include "net/socket/client_socket_pool_manager_impl.h"
38#include "net/socket/next_proto.h"
bnc1e757502014-12-13 02:20:1639#include "net/socket/ssl_client_socket.h"
bnc8f8f7d302017-04-24 18:08:0640#include "net/spdy/chromium/spdy_session_pool.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,
vitalybukabfe0e4272015-12-03 01:51:4251 const std::string& ssl_session_cache_shard) {
[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,
63 context.ssl_config_service, 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.
77SettingsMap AddDefaultHttp2Settings(SettingsMap http2_settings) {
78 // Set default values only if |http2_settings| does not have
79 // a value set for given setting.
80 SettingsMap::iterator it = http2_settings.find(SETTINGS_HEADER_TABLE_SIZE);
81 if (it == http2_settings.end())
82 http2_settings[SETTINGS_HEADER_TABLE_SIZE] = kSpdyMaxHeaderTableSize;
83
84 it = http2_settings.find(SETTINGS_MAX_CONCURRENT_STREAMS);
85 if (it == http2_settings.end())
86 http2_settings[SETTINGS_MAX_CONCURRENT_STREAMS] =
87 kSpdyMaxConcurrentPushedStreams;
88
89 it = http2_settings.find(SETTINGS_INITIAL_WINDOW_SIZE);
90 if (it == http2_settings.end())
91 http2_settings[SETTINGS_INITIAL_WINDOW_SIZE] = kSpdyStreamMaxRecvWindowSize;
92
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),
Matt Menke53c59762017-09-14 16:38:12103 tcp_fast_open_mode(TcpFastOpenMode::DISABLED),
rch1546ccd2017-04-20 02:14:23104 enable_user_alternate_protocol_ports(false),
[email protected]cf4cae32014-05-27 00:39:10105 enable_spdy_ping_based_connection_checking(true),
bncefcd9652016-02-03 18:00:32106 enable_http2(true),
bnc8f0f3b62015-04-08 04:37:23107 spdy_session_max_recv_window_size(kSpdySessionMaxRecvWindowSize),
[email protected]cf4cae32014-05-27 00:39:10108 time_func(&base::TimeTicks::Now),
bnca86731e2017-04-17 12:31:28109 enable_http2_alternative_service(false),
[email protected]cf4cae32014-05-27 00:39:10110 enable_quic(false),
rch1546ccd2017-04-20 02:14:23111 quic_max_packet_length(kDefaultMaxPacketSize),
rch1546ccd2017-04-20 02:14:23112 quic_max_server_configs_stored_in_properties(0u),
113 mark_quic_broken_when_network_blackholes(false),
114 retry_without_alt_svc_on_quic_errors(false),
Yixin Wanga9afead2017-10-19 20:23:10115 support_ietf_format_quic_altsvc(false),
Jana Iyengar903dec22017-11-28 00:44:23116 quic_close_sessions_on_ip_change(false),
rtenneti41c09992015-11-30 18:24:01117 quic_idle_connection_timeout_seconds(kIdleConnectionTimeoutSeconds),
zhongyidd1439f62016-09-02 02:02:26118 quic_reduced_ping_timeout_seconds(kPingTimeoutSecs),
Yixin Wang469da562017-11-15 21:34:58119 quic_max_time_before_crypto_handshake_seconds(
120 kMaxTimeForCryptoHandshakeSecs),
121 quic_max_idle_time_before_crypto_handshake_seconds(
122 kInitialIdleTimeoutSecs),
Zhongyi Shi1a605d22017-09-29 20:09:48123 quic_connect_using_default_network(false),
jri7e636642016-01-14 06:57:08124 quic_migrate_sessions_on_network_change(false),
jrid36ada62016-02-06 02:42:08125 quic_migrate_sessions_early(false),
Zhongyi Shif4683a32017-12-01 00:03:28126 quic_migrate_sessions_on_network_change_v2(false),
127 quic_migrate_sessions_early_v2(false),
Zhongyi Shi73f23ca872017-12-13 18:37:13128 quic_max_time_on_non_default_network(
129 base::TimeDelta::FromSeconds(kMaxTimeOnNonDefaultNetworkSecs)),
jri217455a12016-07-13 20:15:09130 quic_allow_server_migration(false),
Ryan Hamiltonc84473f2017-11-23 03:18:34131 quic_allow_remote_alt_svc(false),
xunjieli888c29922016-03-18 21:05:09132 quic_disable_bidirectional_streams(false),
ckrasicda193a82016-07-09 00:39:36133 quic_force_hol_blocking(false),
rtennetid073dd22016-08-04 01:58:33134 quic_race_cert_verification(false),
rchd6163f32017-01-30 23:50:38135 quic_estimate_initial_rtt(false),
mmenkea7da6da2016-09-01 21:56:52136 enable_token_binding(false),
tbansalc418f3f2017-05-01 18:08:18137 http_09_on_non_default_ports_enabled(false) {
rchd6e1cab2017-07-07 03:59:30138 quic_supported_versions.push_back(QUIC_VERSION_39);
[email protected]cf4cae32014-05-27 00:39:10139}
140
vmpstracd23b72016-02-26 21:08:55141HttpNetworkSession::Params::Params(const Params& other) = default;
142
Chris Watkins7a41d3552017-12-01 02:13:27143HttpNetworkSession::Params::~Params() = default;
[email protected]cf4cae32014-05-27 00:39:10144
mmenke6ddfbea2017-05-31 21:48:41145HttpNetworkSession::Context::Context()
146 : client_socket_factory(nullptr),
147 host_resolver(nullptr),
148 cert_verifier(nullptr),
149 channel_id_service(nullptr),
150 transport_security_state(nullptr),
151 cert_transparency_verifier(nullptr),
152 ct_policy_enforcer(nullptr),
153 proxy_service(nullptr),
154 ssl_config_service(nullptr),
155 http_auth_handler_factory(nullptr),
156 net_log(nullptr),
157 socket_performance_watcher_factory(nullptr),
tbansal16196a1e2017-06-09 01:50:09158 network_quality_provider(nullptr),
mmenke6ddfbea2017-05-31 21:48:41159 quic_clock(nullptr),
160 quic_random(nullptr),
161 quic_crypto_client_stream_factory(
162 QuicCryptoClientStreamFactory::GetDefaultFactory()),
163 proxy_delegate(nullptr) {}
164
165HttpNetworkSession::Context::Context(const Context& other) = default;
166
Chris Watkins7a41d3552017-12-01 02:13:27167HttpNetworkSession::Context::~Context() = default;
mmenke6ddfbea2017-05-31 21:48:41168
[email protected]cf4cae32014-05-27 00:39:10169// TODO(mbelshe): Move the socket factories into HttpStreamFactory.
mmenke6ddfbea2017-05-31 21:48:41170HttpNetworkSession::HttpNetworkSession(const Params& params,
171 const Context& context)
172 : net_log_(context.net_log),
173 http_server_properties_(context.http_server_properties),
174 cert_verifier_(context.cert_verifier),
175 http_auth_handler_factory_(context.http_auth_handler_factory),
176 proxy_service_(context.proxy_service),
177 ssl_config_service_(context.ssl_config_service),
zhongyiaf257542016-12-19 03:36:01178 push_delegate_(nullptr),
jri2b966f22014-09-02 22:25:36179 quic_stream_factory_(
mmenke6ddfbea2017-05-31 21:48:41180 context.net_log,
181 context.host_resolver,
182 context.ssl_config_service,
183 context.client_socket_factory
184 ? context.client_socket_factory
ttuttle859dc7a2015-04-23 19:42:29185 : ClientSocketFactory::GetDefaultFactory(),
mmenke6ddfbea2017-05-31 21:48:41186 context.http_server_properties,
187 context.cert_verifier,
188 context.ct_policy_enforcer,
189 context.channel_id_service,
190 context.transport_security_state,
191 context.cert_transparency_verifier,
192 context.socket_performance_watcher_factory,
193 context.quic_crypto_client_stream_factory,
194 context.quic_random ? context.quic_random : QuicRandom::GetInstance(),
195 context.quic_clock ? context.quic_clock
196 : QuicChromiumClock::GetInstance(),
jri2b966f22014-09-02 22:25:36197 params.quic_max_packet_length,
198 params.quic_user_agent_id,
rch431dd4452017-04-19 15:22:35199 params.quic_max_server_configs_stored_in_properties > 0,
Jana Iyengar903dec22017-11-28 00:44:23200 params.quic_close_sessions_on_ip_change,
rch9ecde09b2017-04-08 00:18:23201 params.mark_quic_broken_when_network_blackholes,
rtenneti41c09992015-11-30 18:24:01202 params.quic_idle_connection_timeout_seconds,
zhongyidd1439f62016-09-02 02:02:26203 params.quic_reduced_ping_timeout_seconds,
Yixin Wang469da562017-11-15 21:34:58204 params.quic_max_time_before_crypto_handshake_seconds,
205 params.quic_max_idle_time_before_crypto_handshake_seconds,
Zhongyi Shi1a605d22017-09-29 20:09:48206 params.quic_connect_using_default_network,
jri7e636642016-01-14 06:57:08207 params.quic_migrate_sessions_on_network_change,
jrid36ada62016-02-06 02:42:08208 params.quic_migrate_sessions_early,
Zhongyi Shif4683a32017-12-01 00:03:28209 params.quic_migrate_sessions_on_network_change_v2,
210 params.quic_migrate_sessions_early_v2,
Zhongyi Shi73f23ca872017-12-13 18:37:13211 params.quic_max_time_on_non_default_network,
jri217455a12016-07-13 20:15:09212 params.quic_allow_server_migration,
rtennetid073dd22016-08-04 01:58:33213 params.quic_race_cert_verification,
rchd6163f32017-01-30 23:50:38214 params.quic_estimate_initial_rtt,
nharperd5cddca2016-02-27 03:37:52215 params.quic_connection_options,
Yixin Wang46a425f2017-08-10 23:02:20216 params.quic_client_connection_options,
nharperd5cddca2016-02-27 03:37:52217 params.enable_token_binding),
mmenke6ddfbea2017-05-31 21:48:41218 spdy_session_pool_(context.host_resolver,
219 context.ssl_config_service,
220 context.http_server_properties,
221 context.transport_security_state,
zhongyi8ac630d2017-06-26 19:46:33222 params.quic_supported_versions,
[email protected]cf4cae32014-05-27 00:39:10223 params.enable_spdy_ping_based_connection_checking,
Yixin Wanga9afead2017-10-19 20:23:10224 params.support_ietf_format_quic_altsvc,
bnc8f0f3b62015-04-08 04:37:23225 params.spdy_session_max_recv_window_size,
bnc3171a2432016-12-28 18:40:26226 AddDefaultHttp2Settings(params.http2_settings),
[email protected]cf4cae32014-05-27 00:39:10227 params.time_func,
mmenke6ddfbea2017-05-31 21:48:41228 context.proxy_delegate),
[email protected]cf4cae32014-05-27 00:39:10229 http_stream_factory_(new HttpStreamFactoryImpl(this, false)),
jri2b966f22014-09-02 22:25:36230 http_stream_factory_for_websocket_(new HttpStreamFactoryImpl(this, true)),
rdsmithbf8c3c12016-11-18 18:16:24231 network_stream_throttler_(new NetworkThrottleManagerImpl()),
mmenke6ddfbea2017-05-31 21:48:41232 params_(params),
233 context_(context) {
[email protected]cf4cae32014-05-27 00:39:10234 DCHECK(proxy_service_);
235 DCHECK(ssl_config_service_.get());
236 CHECK(http_server_properties_);
237
vitalybukabfe0e4272015-12-03 01:51:42238 const std::string ssl_session_cache_shard =
239 "http_network_session/" + base::IntToString(g_next_shard_id.GetNext());
Juan Jose Lopez Jaimez7fa1f002017-11-20 22:13:33240 normal_socket_pool_manager_ = CreateSocketPoolManager(
241 NORMAL_SOCKET_POOL, context, ssl_session_cache_shard);
242 websocket_socket_pool_manager_ = CreateSocketPoolManager(
243 WEBSOCKET_SOCKET_POOL, context, ssl_session_cache_shard);
vitalybukabfe0e4272015-12-03 01:51:42244
bnc3f0118e2016-02-02 15:42:22245 if (params_.enable_http2) {
246 next_protos_.push_back(kProtoHTTP2);
bnc3f0118e2016-02-02 15:42:22247 }
248
249 next_protos_.push_back(kProtoHTTP11);
250
rtenneti6971c172016-01-15 20:12:10251 http_server_properties_->SetMaxServerConfigsStoredInProperties(
252 params.quic_max_server_configs_stored_in_properties);
maksim.sisov0adf8592016-07-15 06:25:56253
254 memory_pressure_listener_.reset(new base::MemoryPressureListener(base::Bind(
255 &HttpNetworkSession::OnMemoryPressure, base::Unretained(this))));
hajimehoshi8156e7c2016-09-29 06:17:52256 base::MemoryCoordinatorClientRegistry::GetInstance()->Register(this);
[email protected]cf4cae32014-05-27 00:39:10257}
258
259HttpNetworkSession::~HttpNetworkSession() {
gab47aa7da2017-06-02 16:09:43260 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
avifceb32f62016-10-07 16:30:52261 response_drainers_.clear();
Bence Béky3ba8c332017-12-11 20:19:24262 // TODO(bnc): CloseAllSessions() is also called in SpdySessionPool destructor,
263 // one of the two calls should be removed.
[email protected]cf4cae32014-05-27 00:39:10264 spdy_session_pool_.CloseAllSessions();
hajimehoshi8156e7c2016-09-29 06:17:52265 base::MemoryCoordinatorClientRegistry::GetInstance()->Unregister(this);
[email protected]cf4cae32014-05-27 00:39:10266}
267
avifceb32f62016-10-07 16:30:52268void HttpNetworkSession::AddResponseDrainer(
269 std::unique_ptr<HttpResponseBodyDrainer> drainer) {
270 DCHECK(!base::ContainsKey(response_drainers_, drainer.get()));
271 HttpResponseBodyDrainer* drainer_ptr = drainer.get();
272 response_drainers_[drainer_ptr] = std::move(drainer);
[email protected]cf4cae32014-05-27 00:39:10273}
274
275void HttpNetworkSession::RemoveResponseDrainer(
276 HttpResponseBodyDrainer* drainer) {
skyostilb8f60ca2016-08-12 12:34:43277 DCHECK(base::ContainsKey(response_drainers_, drainer));
avifceb32f62016-10-07 16:30:52278 response_drainers_[drainer].release();
[email protected]cf4cae32014-05-27 00:39:10279 response_drainers_.erase(drainer);
280}
281
282TransportClientSocketPool* HttpNetworkSession::GetTransportSocketPool(
283 SocketPoolType pool_type) {
284 return GetSocketPoolManager(pool_type)->GetTransportSocketPool();
285}
286
287SSLClientSocketPool* HttpNetworkSession::GetSSLSocketPool(
288 SocketPoolType pool_type) {
289 return GetSocketPoolManager(pool_type)->GetSSLSocketPool();
290}
291
292SOCKSClientSocketPool* HttpNetworkSession::GetSocketPoolForSOCKSProxy(
293 SocketPoolType pool_type,
294 const HostPortPair& socks_proxy) {
295 return GetSocketPoolManager(pool_type)->GetSocketPoolForSOCKSProxy(
296 socks_proxy);
297}
298
299HttpProxyClientSocketPool* HttpNetworkSession::GetSocketPoolForHTTPProxy(
300 SocketPoolType pool_type,
301 const HostPortPair& http_proxy) {
302 return GetSocketPoolManager(pool_type)->GetSocketPoolForHTTPProxy(http_proxy);
303}
304
305SSLClientSocketPool* HttpNetworkSession::GetSocketPoolForSSLWithProxy(
306 SocketPoolType pool_type,
307 const HostPortPair& proxy_server) {
308 return GetSocketPoolManager(pool_type)->GetSocketPoolForSSLWithProxy(
309 proxy_server);
310}
311
danakj1fd259a02016-04-16 03:17:09312std::unique_ptr<base::Value> HttpNetworkSession::SocketPoolInfoToValue() const {
[email protected]cf4cae32014-05-27 00:39:10313 // TODO(yutak): Should merge values from normal pools and WebSocket pools.
314 return normal_socket_pool_manager_->SocketPoolInfoToValue();
315}
316
danakj1fd259a02016-04-16 03:17:09317std::unique_ptr<base::Value> HttpNetworkSession::SpdySessionPoolInfoToValue()
318 const {
[email protected]cf4cae32014-05-27 00:39:10319 return spdy_session_pool_.SpdySessionPoolInfoToValue();
320}
321
danakj1fd259a02016-04-16 03:17:09322std::unique_ptr<base::Value> HttpNetworkSession::QuicInfoToValue() const {
323 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
[email protected]cf4cae32014-05-27 00:39:10324 dict->Set("sessions", quic_stream_factory_.QuicStreamFactoryInfoToValue());
pmarko6ab8be242017-01-11 11:02:55325 dict->SetBoolean("quic_enabled", IsQuicEnabled());
rch53535742017-04-20 00:48:50326
Jeremy Roman0579ed62017-08-29 15:56:19327 auto connection_options(std::make_unique<base::ListValue>());
rch53535742017-04-20 00:48:50328 for (const auto& option : params_.quic_connection_options)
329 connection_options->AppendString(QuicTagToString(option));
dchengc7eeda422015-12-26 03:56:48330 dict->Set("connection_options", std::move(connection_options));
rtenneti8a2f4632016-03-21 20:26:57331
Jeremy Roman0579ed62017-08-29 15:56:19332 auto supported_versions(std::make_unique<base::ListValue>());
rch53535742017-04-20 00:48:50333 for (const auto& version : params_.quic_supported_versions)
334 supported_versions->AppendString(QuicVersionToString(version));
335 dict->Set("supported_versions", std::move(supported_versions));
336
Jeremy Roman0579ed62017-08-29 15:56:19337 auto origins_to_force_quic_on(std::make_unique<base::ListValue>());
rch53535742017-04-20 00:48:50338 for (const auto& origin : params_.origins_to_force_quic_on)
339 origins_to_force_quic_on->AppendString(origin.ToString());
rtenneti8a2f4632016-03-21 20:26:57340 dict->Set("origins_to_force_quic_on", std::move(origins_to_force_quic_on));
341
rch53535742017-04-20 00:48:50342 dict->SetInteger("max_packet_length", params_.quic_max_packet_length);
rtenneti6971c172016-01-15 20:12:10343 dict->SetInteger("max_server_configs_stored_in_properties",
344 params_.quic_max_server_configs_stored_in_properties);
rtennetif4b29d72016-01-11 19:29:39345 dict->SetInteger("idle_connection_timeout_seconds",
346 params_.quic_idle_connection_timeout_seconds);
zhongyidd1439f62016-09-02 02:02:26347 dict->SetInteger("reduced_ping_timeout_seconds",
348 params_.quic_reduced_ping_timeout_seconds);
rch53535742017-04-20 00:48:50349 dict->SetBoolean("mark_quic_broken_when_network_blackholes",
350 params_.mark_quic_broken_when_network_blackholes);
351 dict->SetBoolean("retry_without_alt_svc_on_quic_errors",
352 params_.retry_without_alt_svc_on_quic_errors);
rtennetid073dd22016-08-04 01:58:33353 dict->SetBoolean("race_cert_verification",
354 params_.quic_race_cert_verification);
rch53535742017-04-20 00:48:50355 dict->SetBoolean("disable_bidirectional_streams",
356 params_.quic_disable_bidirectional_streams);
Jana Iyengar903dec22017-11-28 00:44:23357 dict->SetBoolean("close_sessions_on_ip_change",
358 params_.quic_close_sessions_on_ip_change);
rch53535742017-04-20 00:48:50359 dict->SetBoolean("migrate_sessions_on_network_change",
360 params_.quic_migrate_sessions_on_network_change);
361 dict->SetBoolean("migrate_sessions_early",
362 params_.quic_migrate_sessions_early);
Zhongyi Shif4683a32017-12-01 00:03:28363 dict->SetBoolean("migrate_sessions_on_network_change_v2",
364 params_.quic_migrate_sessions_on_network_change_v2);
365 dict->SetBoolean("migrate_sessions_early_v2",
366 params_.quic_migrate_sessions_early_v2);
Zhongyi Shi73f23ca872017-12-13 18:37:13367 dict->SetInteger("max_time_on_non_default_network_seconds",
368 params_.quic_max_time_on_non_default_network.InSeconds());
rch53535742017-04-20 00:48:50369 dict->SetBoolean("allow_server_migration",
370 params_.quic_allow_server_migration);
rch53535742017-04-20 00:48:50371 dict->SetBoolean("estimate_initial_rtt", params_.quic_estimate_initial_rtt);
372 dict->SetBoolean("force_hol_blocking", params_.quic_force_hol_blocking);
zhongyif054cd02017-06-09 07:09:10373 dict->SetBoolean("server_push_cancellation",
374 params_.enable_server_push_cancellation);
rch53535742017-04-20 00:48:50375
dchengc7eeda422015-12-26 03:56:48376 return std::move(dict);
[email protected]cf4cae32014-05-27 00:39:10377}
378
379void HttpNetworkSession::CloseAllConnections() {
380 normal_socket_pool_manager_->FlushSocketPoolsWithError(ERR_ABORTED);
381 websocket_socket_pool_manager_->FlushSocketPoolsWithError(ERR_ABORTED);
382 spdy_session_pool_.CloseCurrentSessions(ERR_ABORTED);
jri7e636642016-01-14 06:57:08383 quic_stream_factory_.CloseAllSessions(ERR_ABORTED, QUIC_INTERNAL_ERROR);
[email protected]cf4cae32014-05-27 00:39:10384}
385
386void HttpNetworkSession::CloseIdleConnections() {
387 normal_socket_pool_manager_->CloseIdleSockets();
388 websocket_socket_pool_manager_->CloseIdleSockets();
389 spdy_session_pool_.CloseCurrentIdleSessions();
390}
391
bnc3472afd2016-11-17 15:27:21392bool HttpNetworkSession::IsProtocolEnabled(NextProto protocol) const {
bnc8f8225c2016-09-23 21:19:46393 switch (protocol) {
bnc3472afd2016-11-17 15:27:21394 case kProtoUnknown:
bnc8f8225c2016-09-23 21:19:46395 NOTREACHED();
396 return false;
bnc3472afd2016-11-17 15:27:21397 case kProtoHTTP11:
398 return true;
399 case kProtoHTTP2:
400 return params_.enable_http2;
401 case kProtoQUIC:
pmarko6ab8be242017-01-11 11:02:55402 return IsQuicEnabled();
bnc8f8225c2016-09-23 21:19:46403 }
404 NOTREACHED();
405 return false;
[email protected]cf4cae32014-05-27 00:39:10406}
407
zhongyiaf257542016-12-19 03:36:01408void HttpNetworkSession::SetServerPushDelegate(
409 std::unique_ptr<ServerPushDelegate> push_delegate) {
zhongyid7dd2db12017-04-14 17:01:25410 DCHECK(push_delegate);
411 if (!params_.enable_server_push_cancellation || push_delegate_)
412 return;
zhongyiaf257542016-12-19 03:36:01413
414 push_delegate_ = std::move(push_delegate);
415 spdy_session_pool_.set_server_push_delegate(push_delegate_.get());
416 quic_stream_factory_.set_server_push_delegate(push_delegate_.get());
417}
418
bnc1f295372015-10-21 23:24:22419void HttpNetworkSession::GetAlpnProtos(NextProtoVector* alpn_protos) const {
bnc927c4962016-07-21 14:45:59420 *alpn_protos = next_protos_;
bnc1f295372015-10-21 23:24:22421}
422
nharper8cdb0fb2016-04-22 21:34:59423void HttpNetworkSession::GetSSLConfig(const HttpRequestInfo& request,
424 SSLConfig* server_config,
425 SSLConfig* proxy_config) const {
426 ssl_config_service_->GetSSLConfig(server_config);
427 GetAlpnProtos(&server_config->alpn_protos);
nharper8cdb0fb2016-04-22 21:34:59428 *proxy_config = *server_config;
429 if (request.privacy_mode == PRIVACY_MODE_ENABLED) {
430 server_config->channel_id_enabled = false;
mmenke6ddfbea2017-05-31 21:48:41431 } else if (params_.enable_token_binding && context_.channel_id_service) {
nharper8cdb0fb2016-04-22 21:34:59432 server_config->token_binding_params.push_back(TB_PARAM_ECDSAP256);
433 }
434}
435
xunjieli9f8c5fb52016-12-07 22:59:33436void HttpNetworkSession::DumpMemoryStats(
437 base::trace_event::ProcessMemoryDump* pmd,
438 const std::string& parent_absolute_name) const {
xunjielid5debfc2017-02-24 15:55:49439 std::string name = base::StringPrintf("net/http_network_session_0x%" PRIxPTR,
440 reinterpret_cast<uintptr_t>(this));
xunjieli9f8c5fb52016-12-07 22:59:33441 base::trace_event::MemoryAllocatorDump* http_network_session_dump =
442 pmd->GetAllocatorDump(name);
xunjieli2a2468bd2017-01-04 21:17:33443 if (http_network_session_dump == nullptr) {
444 http_network_session_dump = pmd->CreateAllocatorDump(name);
445 normal_socket_pool_manager_->DumpMemoryStats(
446 pmd, http_network_session_dump->absolute_name());
447 spdy_session_pool_.DumpMemoryStats(
448 pmd, http_network_session_dump->absolute_name());
xunjielif5267de2017-01-20 21:18:57449 if (http_stream_factory_) {
450 http_stream_factory_->DumpMemoryStats(
451 pmd, http_network_session_dump->absolute_name());
452 }
xunjieli69720dd2017-01-30 15:36:29453 quic_stream_factory_.DumpMemoryStats(
454 pmd, http_network_session_dump->absolute_name());
xunjieli9f8c5fb52016-12-07 22:59:33455 }
xunjielid5debfc2017-02-24 15:55:49456
xunjieli2a2468bd2017-01-04 21:17:33457 // Create an empty row under parent's dump so size can be attributed correctly
458 // if |this| is shared between URLRequestContexts.
459 base::trace_event::MemoryAllocatorDump* empty_row_dump =
460 pmd->CreateAllocatorDump(base::StringPrintf(
461 "%s/http_network_session", parent_absolute_name.c_str()));
462 pmd->AddOwnershipEdge(empty_row_dump->guid(),
xunjieli9f8c5fb52016-12-07 22:59:33463 http_network_session_dump->guid());
464}
465
pmarko6ab8be242017-01-11 11:02:55466bool HttpNetworkSession::IsQuicEnabled() const {
467 return params_.enable_quic;
468}
469
470void HttpNetworkSession::DisableQuic() {
471 params_.enable_quic = false;
472}
473
[email protected]cf4cae32014-05-27 00:39:10474ClientSocketPoolManager* HttpNetworkSession::GetSocketPoolManager(
475 SocketPoolType pool_type) {
476 switch (pool_type) {
477 case NORMAL_SOCKET_POOL:
478 return normal_socket_pool_manager_.get();
479 case WEBSOCKET_SOCKET_POOL:
480 return websocket_socket_pool_manager_.get();
481 default:
482 NOTREACHED();
483 break;
484 }
485 return NULL;
486}
487
maksim.sisov0adf8592016-07-15 06:25:56488void HttpNetworkSession::OnMemoryPressure(
489 base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) {
490 switch (memory_pressure_level) {
491 case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE:
maksim.sisov0adf8592016-07-15 06:25:56492 case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE:
yucliu9462d912017-11-22 02:41:23493 break;
maksim.sisov0adf8592016-07-15 06:25:56494 case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL:
495 CloseIdleConnections();
496 break;
497 }
498}
499
bashi56b23f302017-02-09 01:24:57500void HttpNetworkSession::OnPurgeMemory() {
501 CloseIdleConnections();
hajimehoshi8156e7c2016-09-29 06:17:52502}
503
ttuttle859dc7a2015-04-23 19:42:29504} // namespace net