// Copyright 2012 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef NET_HTTP_HTTP_NETWORK_SESSION_H_ #define NET_HTTP_HTTP_NETWORK_SESSION_H_ #include #include #include #include #include #include #include #include #include "base/bind.h" #include "base/containers/flat_set.h" #include "base/containers/unique_ptr_adapters.h" #include "base/memory/memory_pressure_monitor.h" #include "base/memory/raw_ptr.h" #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" #include "base/threading/thread_checker.h" #include "base/values.h" #include "build/buildflag.h" #include "net/base/host_mapping_rules.h" #include "net/base/host_port_pair.h" #include "net/base/net_export.h" #include "net/http/http_auth_cache.h" #include "net/http/http_stream_factory.h" #include "net/net_buildflags.h" #include "net/quic/quic_stream_factory.h" #include "net/socket/connect_job.h" #include "net/socket/next_proto.h" #include "net/socket/websocket_endpoint_lock_manager.h" #include "net/spdy/spdy_session_pool.h" #include "net/ssl/ssl_client_session_cache.h" #include "net/third_party/quiche/src/quiche/spdy/core/spdy_protocol.h" #include "third_party/abseil-cpp/absl/types/optional.h" namespace base { class Value; } namespace net { class CTPolicyEnforcer; class CertVerifier; class ClientSocketFactory; class ClientSocketPool; class ClientSocketPoolManager; class HostResolver; class HttpAuthHandlerFactory; class HttpNetworkSessionPeer; class HttpResponseBodyDrainer; class HttpServerProperties; class HttpUserAgentSettings; class NetLog; #if BUILDFLAG(ENABLE_REPORTING) class NetworkErrorLoggingService; #endif class NetworkQualityEstimator; class ProxyDelegate; class ProxyResolutionService; class ProxyServer; class QuicCryptoClientStreamFactory; #if BUILDFLAG(ENABLE_REPORTING) class ReportingService; #endif class SCTAuditingDelegate; class SocketPerformanceWatcherFactory; class SSLConfigService; class TransportSecurityState; // Specifies the maximum HPACK dynamic table size the server is allowed to set. const uint32_t kSpdyMaxHeaderTableSize = 64 * 1024; // The maximum size of header list that the server is allowed to send. const uint32_t kSpdyMaxHeaderListSize = 256 * 1024; // Specifies the maximum concurrent streams server could send (via push). const uint32_t kSpdyMaxConcurrentPushedStreams = 1000; // Specifies the the default value for the push setting, which is disabled. const uint32_t kSpdyDisablePush = 0; // Self-contained structure with all the simple configuration options // supported by the HttpNetworkSession. struct NET_EXPORT HttpNetworkSessionParams { HttpNetworkSessionParams(); HttpNetworkSessionParams(const HttpNetworkSessionParams& other); ~HttpNetworkSessionParams(); bool enable_server_push_cancellation = false; HostMappingRules host_mapping_rules; bool ignore_certificate_errors = false; uint16_t testing_fixed_http_port = 0; uint16_t testing_fixed_https_port = 0; bool enable_user_alternate_protocol_ports = false; // Use SPDY ping frames to test for connection health after idle. bool enable_spdy_ping_based_connection_checking = true; bool enable_http2 = true; size_t spdy_session_max_recv_window_size; // Maximum number of capped frames that can be queued at any time. int spdy_session_max_queued_capped_frames; // Whether SPDY pools should mark sessions as going away upon relevant network // changes (instead of closing them). Default value is OS specific. // For OSs that terminate TCP connections upon relevant network changes, // attempt to preserve active streams by marking all sessions as going // away, rather than explicitly closing them. Streams may still fail due // to a generated TCP reset. #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_IOS) bool spdy_go_away_on_ip_change = true; #else bool spdy_go_away_on_ip_change = false; #endif // HTTP/2 connection settings. // Unknown settings will still be sent to the server. // Might contain unknown setting identifiers from a predefined set that // servers are supposed to ignore, see // https://tools.ietf.org/html/draft-bishop-httpbis-grease-00. // The same setting will be sent on every connection to prevent the retry // logic from hiding broken servers. spdy::SettingsMap http2_settings; // If true, a setting parameter with reserved identifier will be sent in every // initial SETTINGS frame, see // https://tools.ietf.org/html/draft-bishop-httpbis-grease-00. // The setting identifier and value will be drawn independently for each // connection to prevent tracking of the client. bool enable_http2_settings_grease = false; // If set, an HTTP/2 frame with a reserved frame type will be sent after // every HTTP/2 SETTINGS frame and before every HTTP/2 DATA frame. // https://tools.ietf.org/html/draft-bishop-httpbis-grease-00. // The same frame will be sent out on all connections to prevent the retry // logic from hiding broken servers. absl::optional greased_http2_frame; // If set, the HEADERS frame carrying a request without body will not have // the END_STREAM flag set. The stream will be closed by a subsequent empty // DATA frame with END_STREAM. Does not affect bidirectional or proxy // streams. // If unset, the HEADERS frame will have the END_STREAM flag set on. // This is useful in conjunction with |greased_http2_frame| so that a frame // of reserved type can be sent out even on requests without a body. bool http2_end_stream_with_data_frame = false; // Source of time for SPDY connections. SpdySessionPool::TimeFunc time_func; // Whether to enable HTTP/2 Alt-Svc entries. bool enable_http2_alternative_service = false; // Enables 0-RTT support. bool enable_early_data; // Enables QUIC support. bool enable_quic = true; // If true, HTTPS URLs can be sent to QUIC proxies. bool enable_quic_proxies_for_https_urls = false; // If non-empty, QUIC will only be spoken to hosts in this list. base::flat_set quic_host_allowlist; // If true, idle sockets won't be closed when memory pressure happens. bool disable_idle_sockets_close_on_memory_pressure = false; bool key_auth_cache_server_entries_by_network_anonymization_key = false; // If true, enable sending PRIORITY_UPDATE frames until SETTINGS frame // arrives. After SETTINGS frame arrives, do not send PRIORITY_UPDATE // frames any longer if SETTINGS_DEPRECATE_HTTP2_PRIORITIES is missing or // has zero 0, but continue and also stop sending HTTP/2-style priority // information in HEADERS frames and PRIORITY frames if it has value 1. bool enable_priority_update = false; // If true, objects used by a HttpNetworkTransaction are asked not to perform // disruptive work after there has been an IP address change (which usually // means that the "default network" has possibly changed). // This is currently used by HttpNetworkSessions that are bound to a specific // network: for these, the underlying network does never change, even if the // default network does (hence underlying objects should not drop their // state). bool ignore_ip_address_changes = false; // Whether to use the ALPN information in the DNS HTTPS record. bool use_dns_https_svcb_alpn = false; }; // Structure with pointers to the dependencies of the HttpNetworkSession. // These objects must all outlive the HttpNetworkSession. struct NET_EXPORT HttpNetworkSessionContext { HttpNetworkSessionContext(); HttpNetworkSessionContext(const HttpNetworkSessionContext& other); ~HttpNetworkSessionContext(); raw_ptr client_socket_factory; raw_ptr host_resolver; raw_ptr cert_verifier; raw_ptr transport_security_state; raw_ptr ct_policy_enforcer; raw_ptr sct_auditing_delegate; raw_ptr proxy_resolution_service; raw_ptr proxy_delegate; raw_ptr http_user_agent_settings; raw_ptr ssl_config_service; raw_ptr http_auth_handler_factory; raw_ptr http_server_properties; raw_ptr net_log; raw_ptr socket_performance_watcher_factory; raw_ptr network_quality_estimator; raw_ptr quic_context; #if BUILDFLAG(ENABLE_REPORTING) raw_ptr reporting_service; raw_ptr network_error_logging_service; #endif // Optional factory to use for creating QuicCryptoClientStreams. raw_ptr quic_crypto_client_stream_factory; }; // This class holds session objects used by HttpNetworkTransaction objects. class NET_EXPORT HttpNetworkSession { public: enum SocketPoolType { NORMAL_SOCKET_POOL, WEBSOCKET_SOCKET_POOL, NUM_SOCKET_POOL_TYPES }; HttpNetworkSession(const HttpNetworkSessionParams& params, const HttpNetworkSessionContext& context); ~HttpNetworkSession(); HttpAuthCache* http_auth_cache() { return &http_auth_cache_; } SSLClientContext* ssl_client_context() { return &ssl_client_context_; } void StartResponseDrainer(std::unique_ptr drainer); // Removes the drainer from the session. void RemoveResponseDrainer(HttpResponseBodyDrainer* drainer); // Returns the socket pool of the given type for use with the specified // ProxyServer. Use ProxyServer::Direct() to get the pool for use with direct // connections. ClientSocketPool* GetSocketPool(SocketPoolType pool_type, const ProxyServer& proxy_server); CertVerifier* cert_verifier() { return cert_verifier_; } ProxyResolutionService* proxy_resolution_service() { return proxy_resolution_service_; } SSLConfigService* ssl_config_service() { return ssl_config_service_; } WebSocketEndpointLockManager* websocket_endpoint_lock_manager() { return &websocket_endpoint_lock_manager_; } SpdySessionPool* spdy_session_pool() { return &spdy_session_pool_; } QuicStreamFactory* quic_stream_factory() { return &quic_stream_factory_; } HttpAuthHandlerFactory* http_auth_handler_factory() { return http_auth_handler_factory_; } HttpServerProperties* http_server_properties() { return http_server_properties_; } HttpStreamFactory* http_stream_factory() { return http_stream_factory_.get(); } NetLog* net_log() { return net_log_; } HostResolver* host_resolver() { return host_resolver_; } #if BUILDFLAG(ENABLE_REPORTING) ReportingService* reporting_service() const { return reporting_service_; } NetworkErrorLoggingService* network_error_logging_service() const { return network_error_logging_service_; } #endif // Creates a Value summary of the state of the socket pools. base::Value SocketPoolInfoToValue() const; // Creates a Value summary of the state of the SPDY sessions. std::unique_ptr SpdySessionPoolInfoToValue() const; // Creates a Value summary of the state of the QUIC sessions and // configuration. base::Value QuicInfoToValue() const; void CloseAllConnections(int net_error, const char* net_log_reason_utf8); void CloseIdleConnections(const char* net_log_reason_utf8); // Returns the original Params used to construct this session. const HttpNetworkSessionParams& params() const { return params_; } // Returns the original Context used to construct this session. const HttpNetworkSessionContext& context() const { return context_; } void SetServerPushDelegate(std::unique_ptr push_delegate); // Returns protocols to be used with ALPN. const NextProtoVector& GetAlpnProtos() const { return next_protos_; } // Returns ALPS data to be sent to server for each NextProto. // Data might be empty. const SSLConfig::ApplicationSettings& GetApplicationSettings() const { return application_settings_; } // Evaluates if QUIC is enabled for new streams. bool IsQuicEnabled() const; // Disable QUIC for new streams. void DisableQuic(); // Clear the SSL session cache. void ClearSSLSessionCache(); // Returns a CommonConnectJobParams that references the NetworkSession's // components. If |for_websockets| is true, the Params' // |websocket_endpoint_lock_manager| field will be populated. Otherwise, it // will be nullptr. CommonConnectJobParams CreateCommonConnectJobParams( bool for_websockets = false); private: friend class HttpNetworkSessionPeer; ClientSocketPoolManager* GetSocketPoolManager(SocketPoolType pool_type); // Flush sockets on low memory notifications callback. void OnMemoryPressure( base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level); const raw_ptr net_log_; const raw_ptr http_server_properties_; const raw_ptr cert_verifier_; const raw_ptr http_auth_handler_factory_; const raw_ptr host_resolver_; #if BUILDFLAG(ENABLE_REPORTING) const raw_ptr reporting_service_; const raw_ptr network_error_logging_service_; #endif const raw_ptr proxy_resolution_service_; const raw_ptr ssl_config_service_; HttpAuthCache http_auth_cache_; SSLClientSessionCache ssl_client_session_cache_; SSLClientContext ssl_client_context_; WebSocketEndpointLockManager websocket_endpoint_lock_manager_; std::unique_ptr normal_socket_pool_manager_; std::unique_ptr websocket_socket_pool_manager_; std::unique_ptr push_delegate_; QuicStreamFactory quic_stream_factory_; SpdySessionPool spdy_session_pool_; std::unique_ptr http_stream_factory_; std::set, base::UniquePtrComparator> response_drainers_; NextProtoVector next_protos_; SSLConfig::ApplicationSettings application_settings_; HttpNetworkSessionParams params_; HttpNetworkSessionContext context_; std::unique_ptr memory_pressure_listener_; THREAD_CHECKER(thread_checker_); }; } // namespace net #endif // NET_HTTP_HTTP_NETWORK_SESSION_H_