blob: 07a7d72f8d2654dec152cabee86f7c5e758c8efe [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#ifndef NET_HTTP_HTTP_NETWORK_SESSION_H_
6#define NET_HTTP_HTTP_NETWORK_SESSION_H_
7
Avi Drissman13fc8932015-12-20 04:40:468#include <stddef.h>
9#include <stdint.h>
10
[email protected]cf4cae32014-05-27 00:39:1011#include <set>
12#include <string>
rch74da0e1a2016-01-14 02:49:3213#include <unordered_set>
[email protected]cf4cae32014-05-27 00:39:1014#include <vector>
15
maksim.sisov0adf8592016-07-15 06:25:5616#include "base/bind.h"
hajimehoshi8156e7c2016-09-29 06:17:5217#include "base/memory/memory_coordinator_client.h"
maksim.sisov0adf8592016-07-15 06:25:5618#include "base/memory/memory_pressure_monitor.h"
[email protected]cf4cae32014-05-27 00:39:1019#include "base/memory/ref_counted.h"
20#include "base/memory/weak_ptr.h"
21#include "base/threading/non_thread_safe.h"
22#include "net/base/host_port_pair.h"
23#include "net/base/net_export.h"
24#include "net/dns/host_resolver.h"
25#include "net/http/http_auth_cache.h"
26#include "net/http/http_stream_factory.h"
rch675757b2016-07-29 16:40:1127#include "net/quic/chromium/quic_stream_factory.h"
[email protected]cf4cae32014-05-27 00:39:1028#include "net/socket/next_proto.h"
29#include "net/spdy/spdy_session_pool.h"
30#include "net/ssl/ssl_client_auth_cache.h"
31
32namespace base {
33class Value;
34}
35
36namespace net {
37
estark6f9b3d82016-01-12 21:37:0538class CTPolicyEnforcer;
[email protected]cf4cae32014-05-27 00:39:1039class CertVerifier;
[email protected]6b8a3c742014-07-25 00:25:3540class ChannelIDService;
[email protected]cf4cae32014-05-27 00:39:1041class ClientSocketFactory;
42class ClientSocketPoolManager;
43class CTVerifier;
44class HostResolver;
[email protected]cf4cae32014-05-27 00:39:1045class HttpAuthHandlerFactory;
46class HttpNetworkSessionPeer;
47class HttpProxyClientSocketPool;
48class HttpResponseBodyDrainer;
49class HttpServerProperties;
50class NetLog;
bengr39e406102014-09-10 23:04:4651class ProxyDelegate;
[email protected]cf4cae32014-05-27 00:39:1052class ProxyService;
53class QuicClock;
54class QuicCryptoClientStreamFactory;
55class QuicServerInfoFactory;
tbansalba8f4112015-09-03 21:57:1956class SocketPerformanceWatcherFactory;
[email protected]cf4cae32014-05-27 00:39:1057class SOCKSClientSocketPool;
58class SSLClientSocketPool;
59class SSLConfigService;
60class TransportClientSocketPool;
61class TransportSecurityState;
62
63// This class holds session objects used by HttpNetworkTransaction objects.
64class NET_EXPORT HttpNetworkSession
hajimehoshi8156e7c2016-09-29 06:17:5265 : NON_EXPORTED_BASE(public base::NonThreadSafe),
66 public base::MemoryCoordinatorClient {
[email protected]cf4cae32014-05-27 00:39:1067 public:
68 struct NET_EXPORT Params {
69 Params();
vmpstracd23b72016-02-26 21:08:5570 Params(const Params& other);
[email protected]cf4cae32014-05-27 00:39:1071 ~Params();
72
73 ClientSocketFactory* client_socket_factory;
74 HostResolver* host_resolver;
75 CertVerifier* cert_verifier;
[email protected]6b8a3c742014-07-25 00:25:3576 ChannelIDService* channel_id_service;
[email protected]cf4cae32014-05-27 00:39:1077 TransportSecurityState* transport_security_state;
78 CTVerifier* cert_transparency_verifier;
rsleevid6de8302016-06-21 01:33:2079 CTPolicyEnforcer* ct_policy_enforcer;
[email protected]cf4cae32014-05-27 00:39:1080 ProxyService* proxy_service;
[email protected]cf4cae32014-05-27 00:39:1081 SSLConfigService* ssl_config_service;
82 HttpAuthHandlerFactory* http_auth_handler_factory;
bnc525e175a2016-06-20 12:36:4083 HttpServerProperties* http_server_properties;
[email protected]cf4cae32014-05-27 00:39:1084 NetLog* net_log;
85 HostMappingRules* host_mapping_rules;
tbansalba8f4112015-09-03 21:57:1986 SocketPerformanceWatcherFactory* socket_performance_watcher_factory;
[email protected]cf4cae32014-05-27 00:39:1087 bool ignore_certificate_errors;
Avi Drissman13fc8932015-12-20 04:40:4688 uint16_t testing_fixed_http_port;
89 uint16_t testing_fixed_https_port;
jrif9b4bec2014-09-15 15:46:5490 bool enable_tcp_fast_open_for_ssl;
[email protected]cf4cae32014-05-27 00:39:1091
rchd502a302015-10-16 03:57:2192 // Use SPDY ping frames to test for connection health after idle.
[email protected]cf4cae32014-05-27 00:39:1093 bool enable_spdy_ping_based_connection_checking;
bnc3f0118e2016-02-02 15:42:2294 bool enable_http2;
bnc8f0f3b62015-04-08 04:37:2395 size_t spdy_session_max_recv_window_size;
96 size_t spdy_stream_max_recv_window_size;
rchd502a302015-10-16 03:57:2197 // Source of time for SPDY connections.
[email protected]cf4cae32014-05-27 00:39:1098 SpdySessionPool::TimeFunc time_func;
bnca86815342016-06-27 12:27:4899 // Whether to enable HTTP/2 Alt-Svc entries with hostname different than
100 // that of the origin.
101 bool enable_http2_alternative_service_with_different_host;
102 // Whether to enable QUIC Alt-Svc entries with hostname different than that
103 // of the origin.
104 bool enable_quic_alternative_service_with_different_host;
[email protected]cf4cae32014-05-27 00:39:10105
rchd502a302015-10-16 03:57:21106 // Enables QUIC support.
[email protected]cf4cae32014-05-27 00:39:10107 bool enable_quic;
zhongyi75527dd2016-01-21 22:26:43108 // Disable QUIC if a connection times out with open streams.
109 bool disable_quic_on_timeout_with_open_streams;
rchd502a302015-10-16 03:57:21110 // Instruct QUIC to use consistent ephemeral ports when talking to
111 // the same server.
[email protected]cf4cae32014-05-27 00:39:10112 bool enable_quic_port_selection;
rchd502a302015-10-16 03:57:21113 // Disables QUIC's 0-RTT behavior.
jri2b966f22014-09-02 22:25:36114 bool quic_always_require_handshake_confirmation;
rchd502a302015-10-16 03:57:21115 // Disables QUIC connection pooling.
jri584002d12014-09-09 00:51:28116 bool quic_disable_connection_pooling;
rchd502a302015-10-16 03:57:21117 // If not zero, the task to load QUIC server configs from the disk cache
118 // will timeout after this value multiplied by the smoothed RTT for the
119 // server.
rtenneti2912825c2015-01-06 01:19:46120 float quic_load_server_info_timeout_srtt_multiplier;
rchd502a302015-10-16 03:57:21121 // Causes QUIC to race reading the server config from disk with
122 // sending an inchoate CHLO.
rtenneti4f809972015-02-11 19:38:34123 bool quic_enable_connection_racing;
rchd502a302015-10-16 03:57:21124 // Use non-blocking IO for UDP sockets.
qyearsley3257b7de2015-02-28 06:59:03125 bool quic_enable_non_blocking_io;
rchd502a302015-10-16 03:57:21126 // Disables using the disk cache to store QUIC server configs.
rtenneti34dffe752015-02-24 23:27:32127 bool quic_disable_disk_cache;
rchd502a302015-10-16 03:57:21128 // Prefer AES-GCM to ChaCha20 even if no hardware support is present.
rch9976b0c2015-06-10 21:27:23129 bool quic_prefer_aes;
rchd502a302015-10-16 03:57:21130 // Size in bytes of the QUIC DUP socket receive buffer.
rchc7433572015-02-27 18:16:51131 int quic_socket_receive_buffer_size;
rtennetib8e80fb2016-05-16 00:12:09132 // Delay starting a TCP connection when QUIC believes it can speak
133 // 0-RTT to a server.
134 bool quic_delay_tcp_race;
rtenneti6971c172016-01-15 20:12:10135 // Maximum number of server configs that are to be stored in
136 // HttpServerProperties, instead of the disk cache.
137 size_t quic_max_server_configs_stored_in_properties;
rtenneti8a2f4632016-03-21 20:26:57138 // If not empty, QUIC will be used for all connections to the set of
139 // origins in |origins_to_force_quic_on|.
140 std::set<HostPortPair> origins_to_force_quic_on;
rchd502a302015-10-16 03:57:21141 // Source of time for QUIC connections. Will be owned by QuicStreamFactory.
142 QuicClock* quic_clock;
143 // Source of entropy for QUIC connections.
[email protected]cf4cae32014-05-27 00:39:10144 QuicRandom* quic_random;
rchd502a302015-10-16 03:57:21145 // Limit on the size of QUIC packets.
[email protected]cf4cae32014-05-27 00:39:10146 size_t quic_max_packet_length;
rchd502a302015-10-16 03:57:21147 // User agent description to send in the QUIC handshake.
[email protected]0c4017ca2014-06-06 03:30:45148 std::string quic_user_agent_id;
[email protected]cf4cae32014-05-27 00:39:10149 bool enable_user_alternate_protocol_ports;
rchd502a302015-10-16 03:57:21150 // Optional factory to use for creating QuicCryptoClientStreams.
[email protected]cf4cae32014-05-27 00:39:10151 QuicCryptoClientStreamFactory* quic_crypto_client_stream_factory;
rchd502a302015-10-16 03:57:21152 // Versions of QUIC which may be used.
[email protected]cf4cae32014-05-27 00:39:10153 QuicVersionVector quic_supported_versions;
jri8c44d692015-10-23 23:53:41154 // Set of QUIC tags to send in the handshake's connection options.
[email protected]488a0e252014-06-25 04:37:44155 QuicTagVector quic_connection_options;
jri8c44d692015-10-23 23:53:41156 // If true, all QUIC sessions are closed when any local IP address changes.
157 bool quic_close_sessions_on_ip_change;
zhongyi6ba0f4252016-08-23 05:20:04158 // Specifies QUIC idle connection state lifetime.
rtenneti41c09992015-11-30 18:24:01159 int quic_idle_connection_timeout_seconds;
zhongyidd1439f62016-09-02 02:02:26160 // Specifies the reduced ping timeout subsequent connections should use when
161 // a connection was timed out with open streams.
162 int quic_reduced_ping_timeout_seconds;
zhongyi6ba0f4252016-08-23 05:20:04163 // Specifies the maximum time duration that QUIC packet reader can perform
164 // consecutive packets reading.
165 int quic_packet_reader_yield_after_duration_milliseconds;
rtennetid2e74caa2015-12-09 00:51:57166 // If true, disable preconnections if QUIC can do 0RTT.
167 bool quic_disable_preconnect_if_0rtt;
rch74da0e1a2016-01-14 02:49:32168 // List of hosts for which QUIC is explicitly whitelisted.
169 std::unordered_set<std::string> quic_host_whitelist;
jrid36ada62016-02-06 02:42:08170 // If true, active QUIC sessions may be migrated onto a new network when
171 // the platform indicates that the default network is changing.
jri7e636642016-01-14 06:57:08172 bool quic_migrate_sessions_on_network_change;
jrid36ada62016-02-06 02:42:08173 // If true, active QUIC sessions experiencing poor connectivity may be
174 // migrated onto a new network.
175 bool quic_migrate_sessions_early;
jri217455a12016-07-13 20:15:09176 // If true, allows migration of QUIC connections to a server-specified
177 // alternate server address.
178 bool quic_allow_server_migration;
xunjieli888c29922016-03-18 21:05:09179 // If true, bidirectional streams over QUIC will be disabled.
180 bool quic_disable_bidirectional_streams;
ckrasicda193a82016-07-09 00:39:36181 // If true, enable force HOL blocking. For measurement purposes.
182 bool quic_force_hol_blocking;
rtennetid073dd22016-08-04 01:58:33183 // If true, race cert verification with host resolution.
184 bool quic_race_cert_verification;
rchbedd57452016-08-30 19:11:48185 // If true, configure QUIC sockets to not fragment packets.
186 bool quic_do_not_fragment;
xunjieli888c29922016-03-18 21:05:09187
bengr39e406102014-09-10 23:04:46188 ProxyDelegate* proxy_delegate;
nharperb7441ef2016-01-25 23:54:14189 // Enable support for Token Binding.
190 bool enable_token_binding;
mmenkea7da6da2016-09-01 21:56:52191
192 // Enable HTTP/0.9 for HTTP/HTTPS on ports other than the default one for
193 // each protocol.
194 bool http_09_on_non_default_ports_enabled;
[email protected]cf4cae32014-05-27 00:39:10195 };
196
197 enum SocketPoolType {
198 NORMAL_SOCKET_POOL,
199 WEBSOCKET_SOCKET_POOL,
200 NUM_SOCKET_POOL_TYPES
201 };
202
203 explicit HttpNetworkSession(const Params& params);
hajimehoshi8156e7c2016-09-29 06:17:52204 ~HttpNetworkSession() override;
[email protected]cf4cae32014-05-27 00:39:10205
206 HttpAuthCache* http_auth_cache() { return &http_auth_cache_; }
207 SSLClientAuthCache* ssl_client_auth_cache() {
208 return &ssl_client_auth_cache_;
209 }
210
211 void AddResponseDrainer(HttpResponseBodyDrainer* drainer);
212
213 void RemoveResponseDrainer(HttpResponseBodyDrainer* drainer);
214
215 TransportClientSocketPool* GetTransportSocketPool(SocketPoolType pool_type);
216 SSLClientSocketPool* GetSSLSocketPool(SocketPoolType pool_type);
217 SOCKSClientSocketPool* GetSocketPoolForSOCKSProxy(
218 SocketPoolType pool_type,
219 const HostPortPair& socks_proxy);
220 HttpProxyClientSocketPool* GetSocketPoolForHTTPProxy(
221 SocketPoolType pool_type,
222 const HostPortPair& http_proxy);
223 SSLClientSocketPool* GetSocketPoolForSSLWithProxy(
224 SocketPoolType pool_type,
225 const HostPortPair& proxy_server);
226
227 CertVerifier* cert_verifier() { return cert_verifier_; }
228 ProxyService* proxy_service() { return proxy_service_; }
229 SSLConfigService* ssl_config_service() { return ssl_config_service_.get(); }
230 SpdySessionPool* spdy_session_pool() { return &spdy_session_pool_; }
231 QuicStreamFactory* quic_stream_factory() { return &quic_stream_factory_; }
232 HttpAuthHandlerFactory* http_auth_handler_factory() {
233 return http_auth_handler_factory_;
234 }
bnc525e175a2016-06-20 12:36:40235 HttpServerProperties* http_server_properties() {
[email protected]cf4cae32014-05-27 00:39:10236 return http_server_properties_;
237 }
238 HttpStreamFactory* http_stream_factory() {
239 return http_stream_factory_.get();
240 }
241 HttpStreamFactory* http_stream_factory_for_websocket() {
242 return http_stream_factory_for_websocket_.get();
243 }
244 NetLog* net_log() {
245 return net_log_;
246 }
[email protected]cf4cae32014-05-27 00:39:10247
payal.pandey62a400292015-05-28 09:29:54248 // Creates a Value summary of the state of the socket pools.
danakj1fd259a02016-04-16 03:17:09249 std::unique_ptr<base::Value> SocketPoolInfoToValue() const;
[email protected]cf4cae32014-05-27 00:39:10250
payal.pandey91cb2312015-05-27 07:41:51251 // Creates a Value summary of the state of the SPDY sessions.
danakj1fd259a02016-04-16 03:17:09252 std::unique_ptr<base::Value> SpdySessionPoolInfoToValue() const;
[email protected]cf4cae32014-05-27 00:39:10253
254 // Creates a Value summary of the state of the QUIC sessions and
payal.pandeya18956a2015-05-27 05:57:55255 // configuration.
danakj1fd259a02016-04-16 03:17:09256 std::unique_ptr<base::Value> QuicInfoToValue() const;
[email protected]cf4cae32014-05-27 00:39:10257
258 void CloseAllConnections();
259 void CloseIdleConnections();
260
261 // Returns the original Params used to construct this session.
262 const Params& params() const { return params_; }
263
264 bool IsProtocolEnabled(AlternateProtocol protocol) const;
265
bnc1f295372015-10-21 23:24:22266 // Populates |*alpn_protos| with protocols to be used with ALPN.
267 void GetAlpnProtos(NextProtoVector* alpn_protos) const;
268
nharper8cdb0fb2016-04-22 21:34:59269 // Populates |server_config| and |proxy_config| based on this session and
270 // |request|.
271 void GetSSLConfig(const HttpRequestInfo& request,
272 SSLConfig* server_config,
273 SSLConfig* proxy_config) const;
274
[email protected]cf4cae32014-05-27 00:39:10275 private:
[email protected]cf4cae32014-05-27 00:39:10276 friend class HttpNetworkSessionPeer;
277
[email protected]cf4cae32014-05-27 00:39:10278 ClientSocketPoolManager* GetSocketPoolManager(SocketPoolType pool_type);
279
maksim.sisov0adf8592016-07-15 06:25:56280 // Flush sockets on low memory notifications callback.
281 void OnMemoryPressure(
282 base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level);
283
hajimehoshi8156e7c2016-09-29 06:17:52284 // base::MemoryCoordinatorClient implementation:
285 void OnMemoryStateChange(base::MemoryState state) override;
286
[email protected]cf4cae32014-05-27 00:39:10287 NetLog* const net_log_;
bnc525e175a2016-06-20 12:36:40288 HttpServerProperties* const http_server_properties_;
[email protected]cf4cae32014-05-27 00:39:10289 CertVerifier* const cert_verifier_;
290 HttpAuthHandlerFactory* const http_auth_handler_factory_;
291
292 // Not const since it's modified by HttpNetworkSessionPeer for testing.
293 ProxyService* proxy_service_;
294 const scoped_refptr<SSLConfigService> ssl_config_service_;
295
296 HttpAuthCache http_auth_cache_;
297 SSLClientAuthCache ssl_client_auth_cache_;
danakj1fd259a02016-04-16 03:17:09298 std::unique_ptr<ClientSocketPoolManager> normal_socket_pool_manager_;
299 std::unique_ptr<ClientSocketPoolManager> websocket_socket_pool_manager_;
[email protected]cf4cae32014-05-27 00:39:10300 QuicStreamFactory quic_stream_factory_;
301 SpdySessionPool spdy_session_pool_;
danakj1fd259a02016-04-16 03:17:09302 std::unique_ptr<HttpStreamFactory> http_stream_factory_;
303 std::unique_ptr<HttpStreamFactory> http_stream_factory_for_websocket_;
[email protected]cf4cae32014-05-27 00:39:10304 std::set<HttpResponseBodyDrainer*> response_drainers_;
305
bnc0d23cf42014-12-11 14:09:46306 NextProtoVector next_protos_;
[email protected]cf4cae32014-05-27 00:39:10307
308 Params params_;
maksim.sisov0adf8592016-07-15 06:25:56309
310 std::unique_ptr<base::MemoryPressureListener> memory_pressure_listener_;
[email protected]cf4cae32014-05-27 00:39:10311};
312
313} // namespace net
314
315#endif // NET_HTTP_HTTP_NETWORK_SESSION_H_