1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef NET_SPDY_SPDY_SESSION_H_ 6*6777b538SAndroid Build Coastguard Worker #define NET_SPDY_SPDY_SESSION_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <stddef.h> 9*6777b538SAndroid Build Coastguard Worker #include <stdint.h> 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker #include <map> 12*6777b538SAndroid Build Coastguard Worker #include <memory> 13*6777b538SAndroid Build Coastguard Worker #include <optional> 14*6777b538SAndroid Build Coastguard Worker #include <set> 15*6777b538SAndroid Build Coastguard Worker #include <string> 16*6777b538SAndroid Build Coastguard Worker #include <string_view> 17*6777b538SAndroid Build Coastguard Worker #include <vector> 18*6777b538SAndroid Build Coastguard Worker 19*6777b538SAndroid Build Coastguard Worker #include "base/containers/circular_deque.h" 20*6777b538SAndroid Build Coastguard Worker #include "base/feature_list.h" 21*6777b538SAndroid Build Coastguard Worker #include "base/gtest_prod_util.h" 22*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h" 23*6777b538SAndroid Build Coastguard Worker #include "base/memory/ref_counted.h" 24*6777b538SAndroid Build Coastguard Worker #include "base/memory/scoped_refptr.h" 25*6777b538SAndroid Build Coastguard Worker #include "base/memory/weak_ptr.h" 26*6777b538SAndroid Build Coastguard Worker #include "base/metrics/field_trial_params.h" 27*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h" 28*6777b538SAndroid Build Coastguard Worker #include "base/timer/timer.h" 29*6777b538SAndroid Build Coastguard Worker #include "base/values.h" 30*6777b538SAndroid Build Coastguard Worker #include "net/base/completion_once_callback.h" 31*6777b538SAndroid Build Coastguard Worker #include "net/base/host_port_pair.h" 32*6777b538SAndroid Build Coastguard Worker #include "net/base/io_buffer.h" 33*6777b538SAndroid Build Coastguard Worker #include "net/base/load_states.h" 34*6777b538SAndroid Build Coastguard Worker #include "net/base/load_timing_info.h" 35*6777b538SAndroid Build Coastguard Worker #include "net/base/net_errors.h" 36*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h" 37*6777b538SAndroid Build Coastguard Worker #include "net/base/network_change_notifier.h" 38*6777b538SAndroid Build Coastguard Worker #include "net/base/request_priority.h" 39*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log_source.h" 40*6777b538SAndroid Build Coastguard Worker #include "net/socket/client_socket_pool.h" 41*6777b538SAndroid Build Coastguard Worker #include "net/socket/next_proto.h" 42*6777b538SAndroid Build Coastguard Worker #include "net/socket/ssl_client_socket.h" 43*6777b538SAndroid Build Coastguard Worker #include "net/socket/stream_socket.h" 44*6777b538SAndroid Build Coastguard Worker #include "net/spdy/buffered_spdy_framer.h" 45*6777b538SAndroid Build Coastguard Worker #include "net/spdy/http2_priority_dependencies.h" 46*6777b538SAndroid Build Coastguard Worker #include "net/spdy/multiplexed_session.h" 47*6777b538SAndroid Build Coastguard Worker #include "net/spdy/spdy_buffer.h" 48*6777b538SAndroid Build Coastguard Worker #include "net/spdy/spdy_session_pool.h" 49*6777b538SAndroid Build Coastguard Worker #include "net/spdy/spdy_stream.h" 50*6777b538SAndroid Build Coastguard Worker #include "net/spdy/spdy_write_queue.h" 51*6777b538SAndroid Build Coastguard Worker #include "net/ssl/ssl_config_service.h" 52*6777b538SAndroid Build Coastguard Worker #include "net/third_party/quiche/src/quiche/spdy/core/http2_header_block.h" 53*6777b538SAndroid Build Coastguard Worker #include "net/third_party/quiche/src/quiche/spdy/core/spdy_alt_svc_wire_format.h" 54*6777b538SAndroid Build Coastguard Worker #include "net/third_party/quiche/src/quiche/spdy/core/spdy_framer.h" 55*6777b538SAndroid Build Coastguard Worker #include "net/third_party/quiche/src/quiche/spdy/core/spdy_protocol.h" 56*6777b538SAndroid Build Coastguard Worker #include "net/traffic_annotation/network_traffic_annotation.h" 57*6777b538SAndroid Build Coastguard Worker #include "url/gurl.h" 58*6777b538SAndroid Build Coastguard Worker #include "url/origin.h" 59*6777b538SAndroid Build Coastguard Worker #include "url/scheme_host_port.h" 60*6777b538SAndroid Build Coastguard Worker 61*6777b538SAndroid Build Coastguard Worker namespace net { 62*6777b538SAndroid Build Coastguard Worker 63*6777b538SAndroid Build Coastguard Worker namespace test { 64*6777b538SAndroid Build Coastguard Worker class SpdyStreamTest; 65*6777b538SAndroid Build Coastguard Worker } 66*6777b538SAndroid Build Coastguard Worker 67*6777b538SAndroid Build Coastguard Worker // TLS and other layers will chunk data at 16KB. Making the max frame size too 68*6777b538SAndroid Build Coastguard Worker // small will lead to increased CPU/byte cost and overhead on both client/server 69*6777b538SAndroid Build Coastguard Worker // due to excessive frames to process. Making this larger has diminishing 70*6777b538SAndroid Build Coastguard Worker // returns as the data will be chunked elsewhere. We also want to ensure we are 71*6777b538SAndroid Build Coastguard Worker // >= 2860B (~2* MSS => 2 packets) to avoid delayed ACKs. We will also account 72*6777b538SAndroid Build Coastguard Worker // for the frame header size of 9B to prevent fragmentation when this is added. 73*6777b538SAndroid Build Coastguard Worker // As a result we will use a 16KB - 9B max data frame size. 74*6777b538SAndroid Build Coastguard Worker const int kMaxSpdyFrameChunkSize = (16 * 1024) - 9; 75*6777b538SAndroid Build Coastguard Worker 76*6777b538SAndroid Build Coastguard Worker // Default value of spdy::SETTINGS_INITIAL_WINDOW_SIZE per protocol 77*6777b538SAndroid Build Coastguard Worker // specification. A session is always created with this initial window size. 78*6777b538SAndroid Build Coastguard Worker const int32_t kDefaultInitialWindowSize = 65535; 79*6777b538SAndroid Build Coastguard Worker 80*6777b538SAndroid Build Coastguard Worker // The default maximum number of concurrent streams we will create, unless the 81*6777b538SAndroid Build Coastguard Worker // server sends a SETTINGS frame with a different value. 82*6777b538SAndroid Build Coastguard Worker const size_t kDefaultInitialMaxConcurrentStreams = 100; 83*6777b538SAndroid Build Coastguard Worker 84*6777b538SAndroid Build Coastguard Worker // Used to override kDefaultInitialMaxConcurrentStreams. 85*6777b538SAndroid Build Coastguard Worker NET_EXPORT BASE_DECLARE_FEATURE(kH2InitialMaxConcurrentStreamsOverride); 86*6777b538SAndroid Build Coastguard Worker NET_EXPORT extern const base::FeatureParam<int> kH2InitialMaxConcurrentStreams; 87*6777b538SAndroid Build Coastguard Worker 88*6777b538SAndroid Build Coastguard Worker // If more than this many bytes have been read or more than that many 89*6777b538SAndroid Build Coastguard Worker // milliseconds have passed, return ERR_IO_PENDING from ReadLoop. 90*6777b538SAndroid Build Coastguard Worker const int kYieldAfterBytesRead = 32 * 1024; 91*6777b538SAndroid Build Coastguard Worker const int kYieldAfterDurationMilliseconds = 20; 92*6777b538SAndroid Build Coastguard Worker 93*6777b538SAndroid Build Coastguard Worker // First and last valid stream IDs. As we always act as the client, 94*6777b538SAndroid Build Coastguard Worker // start at 1 for the first stream id. 95*6777b538SAndroid Build Coastguard Worker const spdy::SpdyStreamId kFirstStreamId = 1; 96*6777b538SAndroid Build Coastguard Worker const spdy::SpdyStreamId kLastStreamId = 0x7fffffff; 97*6777b538SAndroid Build Coastguard Worker 98*6777b538SAndroid Build Coastguard Worker // Maximum number of capped frames that can be queued at any time. 99*6777b538SAndroid Build Coastguard Worker // We measured how many queued capped frames were ever in the 100*6777b538SAndroid Build Coastguard Worker // SpdyWriteQueue at one given time between 2019-08 and 2020-02. 101*6777b538SAndroid Build Coastguard Worker // The numbers showed that in 99.94% of cases it would always 102*6777b538SAndroid Build Coastguard Worker // stay below 10, and that it would exceed 1000 only in 103*6777b538SAndroid Build Coastguard Worker // 10^-8 of cases. Therefore we picked 10000 as a number that will 104*6777b538SAndroid Build Coastguard Worker // virtually never be hit in practice, while still preventing an 105*6777b538SAndroid Build Coastguard Worker // attacker from growing this queue unboundedly. 106*6777b538SAndroid Build Coastguard Worker const int kSpdySessionMaxQueuedCappedFrames = 10000; 107*6777b538SAndroid Build Coastguard Worker 108*6777b538SAndroid Build Coastguard Worker // Default time to delay sending small receive window updates (can be 109*6777b538SAndroid Build Coastguard Worker // configured through SetTimeToBufferSmallWindowUpdates()). Usually window 110*6777b538SAndroid Build Coastguard Worker // updates are sent when half of the receive window has been processed by 111*6777b538SAndroid Build Coastguard Worker // the client but in the case of a client that consumes the data slowly, 112*6777b538SAndroid Build Coastguard Worker // this strategy alone would make servers consider the connection or stream 113*6777b538SAndroid Build Coastguard Worker // idle. 114*6777b538SAndroid Build Coastguard Worker constexpr base::TimeDelta kDefaultTimeToBufferSmallWindowUpdates = 115*6777b538SAndroid Build Coastguard Worker base::Seconds(5); 116*6777b538SAndroid Build Coastguard Worker 117*6777b538SAndroid Build Coastguard Worker class NetLog; 118*6777b538SAndroid Build Coastguard Worker class NetworkQualityEstimator; 119*6777b538SAndroid Build Coastguard Worker class SpdyStream; 120*6777b538SAndroid Build Coastguard Worker class SSLInfo; 121*6777b538SAndroid Build Coastguard Worker class TransportSecurityState; 122*6777b538SAndroid Build Coastguard Worker 123*6777b538SAndroid Build Coastguard Worker // NOTE: There is an enum called SpdyProtocolErrorDetails2 (also with numeric 124*6777b538SAndroid Build Coastguard Worker // suffixes) in tools/metrics/histograms/enums.xml. Be sure to add new values 125*6777b538SAndroid Build Coastguard Worker // there also. 126*6777b538SAndroid Build Coastguard Worker enum SpdyProtocolErrorDetails { 127*6777b538SAndroid Build Coastguard Worker // http2::Http2DecoderAdapter::SpdyFramerError mappings. 128*6777b538SAndroid Build Coastguard Worker SPDY_ERROR_NO_ERROR = 0, 129*6777b538SAndroid Build Coastguard Worker SPDY_ERROR_INVALID_STREAM_ID = 38, 130*6777b538SAndroid Build Coastguard Worker SPDY_ERROR_INVALID_CONTROL_FRAME = 1, 131*6777b538SAndroid Build Coastguard Worker SPDY_ERROR_CONTROL_PAYLOAD_TOO_LARGE = 2, 132*6777b538SAndroid Build Coastguard Worker SPDY_ERROR_DECOMPRESS_FAILURE = 5, 133*6777b538SAndroid Build Coastguard Worker SPDY_ERROR_INVALID_PADDING = 39, 134*6777b538SAndroid Build Coastguard Worker SPDY_ERROR_INVALID_DATA_FRAME_FLAGS = 8, 135*6777b538SAndroid Build Coastguard Worker SPDY_ERROR_UNEXPECTED_FRAME = 31, 136*6777b538SAndroid Build Coastguard Worker SPDY_ERROR_INTERNAL_FRAMER_ERROR = 41, 137*6777b538SAndroid Build Coastguard Worker SPDY_ERROR_INVALID_CONTROL_FRAME_SIZE = 37, 138*6777b538SAndroid Build Coastguard Worker SPDY_ERROR_OVERSIZED_PAYLOAD = 40, 139*6777b538SAndroid Build Coastguard Worker 140*6777b538SAndroid Build Coastguard Worker // HttpDecoder or HttpDecoderAdapter error. 141*6777b538SAndroid Build Coastguard Worker SPDY_ERROR_HPACK_INDEX_VARINT_ERROR = 43, 142*6777b538SAndroid Build Coastguard Worker SPDY_ERROR_HPACK_NAME_LENGTH_VARINT_ERROR = 44, 143*6777b538SAndroid Build Coastguard Worker SPDY_ERROR_HPACK_VALUE_LENGTH_VARINT_ERROR = 45, 144*6777b538SAndroid Build Coastguard Worker SPDY_ERROR_HPACK_NAME_TOO_LONG = 46, 145*6777b538SAndroid Build Coastguard Worker SPDY_ERROR_HPACK_VALUE_TOO_LONG = 47, 146*6777b538SAndroid Build Coastguard Worker SPDY_ERROR_HPACK_NAME_HUFFMAN_ERROR = 48, 147*6777b538SAndroid Build Coastguard Worker SPDY_ERROR_HPACK_VALUE_HUFFMAN_ERROR = 49, 148*6777b538SAndroid Build Coastguard Worker SPDY_ERROR_HPACK_MISSING_DYNAMIC_TABLE_SIZE_UPDATE = 50, 149*6777b538SAndroid Build Coastguard Worker SPDY_ERROR_HPACK_INVALID_INDEX = 51, 150*6777b538SAndroid Build Coastguard Worker SPDY_ERROR_HPACK_INVALID_NAME_INDEX = 52, 151*6777b538SAndroid Build Coastguard Worker SPDY_ERROR_HPACK_DYNAMIC_TABLE_SIZE_UPDATE_NOT_ALLOWED = 53, 152*6777b538SAndroid Build Coastguard Worker SPDY_ERROR_HPACK_INITIAL_DYNAMIC_TABLE_SIZE_UPDATE_IS_ABOVE_LOW_WATER_MARK = 153*6777b538SAndroid Build Coastguard Worker 54, 154*6777b538SAndroid Build Coastguard Worker SPDY_ERROR_HPACK_DYNAMIC_TABLE_SIZE_UPDATE_IS_ABOVE_ACKNOWLEDGED_SETTING = 55, 155*6777b538SAndroid Build Coastguard Worker SPDY_ERROR_HPACK_TRUNCATED_BLOCK = 56, 156*6777b538SAndroid Build Coastguard Worker SPDY_ERROR_HPACK_FRAGMENT_TOO_LONG = 57, 157*6777b538SAndroid Build Coastguard Worker SPDY_ERROR_HPACK_COMPRESSED_HEADER_SIZE_EXCEEDS_LIMIT = 58, 158*6777b538SAndroid Build Coastguard Worker SPDY_ERROR_STOP_PROCESSING = 59, 159*6777b538SAndroid Build Coastguard Worker // spdy::SpdyErrorCode mappings. 160*6777b538SAndroid Build Coastguard Worker STATUS_CODE_NO_ERROR = 41, 161*6777b538SAndroid Build Coastguard Worker STATUS_CODE_PROTOCOL_ERROR = 11, 162*6777b538SAndroid Build Coastguard Worker STATUS_CODE_INTERNAL_ERROR = 16, 163*6777b538SAndroid Build Coastguard Worker STATUS_CODE_FLOW_CONTROL_ERROR = 17, 164*6777b538SAndroid Build Coastguard Worker STATUS_CODE_SETTINGS_TIMEOUT = 32, 165*6777b538SAndroid Build Coastguard Worker STATUS_CODE_STREAM_CLOSED = 12, 166*6777b538SAndroid Build Coastguard Worker STATUS_CODE_FRAME_SIZE_ERROR = 21, 167*6777b538SAndroid Build Coastguard Worker STATUS_CODE_REFUSED_STREAM = 13, 168*6777b538SAndroid Build Coastguard Worker STATUS_CODE_CANCEL = 15, 169*6777b538SAndroid Build Coastguard Worker STATUS_CODE_COMPRESSION_ERROR = 42, 170*6777b538SAndroid Build Coastguard Worker STATUS_CODE_CONNECT_ERROR = 33, 171*6777b538SAndroid Build Coastguard Worker STATUS_CODE_ENHANCE_YOUR_CALM = 34, 172*6777b538SAndroid Build Coastguard Worker STATUS_CODE_INADEQUATE_SECURITY = 35, 173*6777b538SAndroid Build Coastguard Worker STATUS_CODE_HTTP_1_1_REQUIRED = 36, 174*6777b538SAndroid Build Coastguard Worker // Deprecated SpdyRstStrreamStatus mappings. 175*6777b538SAndroid Build Coastguard Worker STATUS_CODE_UNSUPPORTED_VERSION = 14, 176*6777b538SAndroid Build Coastguard Worker STATUS_CODE_STREAM_IN_USE = 18, 177*6777b538SAndroid Build Coastguard Worker STATUS_CODE_STREAM_ALREADY_CLOSED = 19, 178*6777b538SAndroid Build Coastguard Worker 179*6777b538SAndroid Build Coastguard Worker // SpdySession errors 180*6777b538SAndroid Build Coastguard Worker PROTOCOL_ERROR_UNEXPECTED_PING = 22, 181*6777b538SAndroid Build Coastguard Worker PROTOCOL_ERROR_RST_STREAM_FOR_NON_ACTIVE_STREAM = 23, 182*6777b538SAndroid Build Coastguard Worker PROTOCOL_ERROR_SPDY_COMPRESSION_FAILURE = 24, 183*6777b538SAndroid Build Coastguard Worker PROTOCOL_ERROR_REQUEST_FOR_SECURE_CONTENT_OVER_INSECURE_SESSION = 25, 184*6777b538SAndroid Build Coastguard Worker PROTOCOL_ERROR_SYN_REPLY_NOT_RECEIVED = 26, 185*6777b538SAndroid Build Coastguard Worker PROTOCOL_ERROR_INVALID_WINDOW_UPDATE_SIZE = 27, 186*6777b538SAndroid Build Coastguard Worker PROTOCOL_ERROR_RECEIVE_WINDOW_VIOLATION = 28, 187*6777b538SAndroid Build Coastguard Worker 188*6777b538SAndroid Build Coastguard Worker // Next free value. 189*6777b538SAndroid Build Coastguard Worker NUM_SPDY_PROTOCOL_ERROR_DETAILS = 60, 190*6777b538SAndroid Build Coastguard Worker }; 191*6777b538SAndroid Build Coastguard Worker SpdyProtocolErrorDetails NET_EXPORT_PRIVATE MapFramerErrorToProtocolError( 192*6777b538SAndroid Build Coastguard Worker http2::Http2DecoderAdapter::SpdyFramerError error); 193*6777b538SAndroid Build Coastguard Worker Error NET_EXPORT_PRIVATE 194*6777b538SAndroid Build Coastguard Worker MapFramerErrorToNetError(http2::Http2DecoderAdapter::SpdyFramerError error); 195*6777b538SAndroid Build Coastguard Worker SpdyProtocolErrorDetails NET_EXPORT_PRIVATE 196*6777b538SAndroid Build Coastguard Worker MapRstStreamStatusToProtocolError(spdy::SpdyErrorCode error_code); 197*6777b538SAndroid Build Coastguard Worker spdy::SpdyErrorCode NET_EXPORT_PRIVATE MapNetErrorToGoAwayStatus(Error err); 198*6777b538SAndroid Build Coastguard Worker 199*6777b538SAndroid Build Coastguard Worker // If these compile asserts fail then SpdyProtocolErrorDetails needs 200*6777b538SAndroid Build Coastguard Worker // to be updated with new values, as do the mapping functions above. 201*6777b538SAndroid Build Coastguard Worker static_assert(28 == http2::Http2DecoderAdapter::LAST_ERROR, 202*6777b538SAndroid Build Coastguard Worker "SpdyProtocolErrorDetails / Spdy Errors mismatch"); 203*6777b538SAndroid Build Coastguard Worker static_assert(13 == spdy::SpdyErrorCode::ERROR_CODE_MAX, 204*6777b538SAndroid Build Coastguard Worker "SpdyProtocolErrorDetails / spdy::SpdyErrorCode mismatch"); 205*6777b538SAndroid Build Coastguard Worker 206*6777b538SAndroid Build Coastguard Worker // A helper class used to manage a request to create a stream. 207*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE SpdyStreamRequest { 208*6777b538SAndroid Build Coastguard Worker public: 209*6777b538SAndroid Build Coastguard Worker SpdyStreamRequest(); 210*6777b538SAndroid Build Coastguard Worker 211*6777b538SAndroid Build Coastguard Worker SpdyStreamRequest(const SpdyStreamRequest&) = delete; 212*6777b538SAndroid Build Coastguard Worker SpdyStreamRequest& operator=(const SpdyStreamRequest&) = delete; 213*6777b538SAndroid Build Coastguard Worker 214*6777b538SAndroid Build Coastguard Worker // Calls CancelRequest(). 215*6777b538SAndroid Build Coastguard Worker ~SpdyStreamRequest(); 216*6777b538SAndroid Build Coastguard Worker 217*6777b538SAndroid Build Coastguard Worker // Returns the time when ConfirmHandshake() completed, if this request had to 218*6777b538SAndroid Build Coastguard Worker // wait for ConfirmHandshake(). confirm_handshake_end()219*6777b538SAndroid Build Coastguard Worker base::TimeTicks confirm_handshake_end() const { 220*6777b538SAndroid Build Coastguard Worker return confirm_handshake_end_; 221*6777b538SAndroid Build Coastguard Worker } 222*6777b538SAndroid Build Coastguard Worker 223*6777b538SAndroid Build Coastguard Worker // Starts the request to create a stream. If OK is returned, then 224*6777b538SAndroid Build Coastguard Worker // ReleaseStream() may be called. If ERR_IO_PENDING is returned, 225*6777b538SAndroid Build Coastguard Worker // then when the stream is created, |callback| will be called, at 226*6777b538SAndroid Build Coastguard Worker // which point ReleaseStream() may be called. Otherwise, the stream 227*6777b538SAndroid Build Coastguard Worker // is not created, an error is returned, and ReleaseStream() may not 228*6777b538SAndroid Build Coastguard Worker // be called. 229*6777b538SAndroid Build Coastguard Worker // 230*6777b538SAndroid Build Coastguard Worker // If |can_send_early| is true, this request is allowed to be sent over 231*6777b538SAndroid Build Coastguard Worker // TLS 1.3 0RTT without confirming the handshake. 232*6777b538SAndroid Build Coastguard Worker // 233*6777b538SAndroid Build Coastguard Worker // If OK is returned, must not be called again without 234*6777b538SAndroid Build Coastguard Worker // ReleaseStream() being called first. If ERR_IO_PENDING is 235*6777b538SAndroid Build Coastguard Worker // returned, must not be called again without CancelRequest() or 236*6777b538SAndroid Build Coastguard Worker // ReleaseStream() being called first. Otherwise, in case of an 237*6777b538SAndroid Build Coastguard Worker // immediate error, this may be called again. 238*6777b538SAndroid Build Coastguard Worker int StartRequest(SpdyStreamType type, 239*6777b538SAndroid Build Coastguard Worker const base::WeakPtr<SpdySession>& session, 240*6777b538SAndroid Build Coastguard Worker const GURL& url, 241*6777b538SAndroid Build Coastguard Worker bool can_send_early, 242*6777b538SAndroid Build Coastguard Worker RequestPriority priority, 243*6777b538SAndroid Build Coastguard Worker const SocketTag& socket_tag, 244*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& net_log, 245*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback, 246*6777b538SAndroid Build Coastguard Worker const NetworkTrafficAnnotationTag& traffic_annotation, 247*6777b538SAndroid Build Coastguard Worker bool detect_broken_connection = false, 248*6777b538SAndroid Build Coastguard Worker base::TimeDelta heartbeat_interval = base::Seconds(0)); 249*6777b538SAndroid Build Coastguard Worker 250*6777b538SAndroid Build Coastguard Worker // Cancels any pending stream creation request. May be called 251*6777b538SAndroid Build Coastguard Worker // repeatedly. 252*6777b538SAndroid Build Coastguard Worker void CancelRequest(); 253*6777b538SAndroid Build Coastguard Worker 254*6777b538SAndroid Build Coastguard Worker // Transfers the created stream (guaranteed to not be NULL) to the 255*6777b538SAndroid Build Coastguard Worker // caller. Must be called at most once after StartRequest() returns 256*6777b538SAndroid Build Coastguard Worker // OK or |callback| is called with OK. The caller must immediately 257*6777b538SAndroid Build Coastguard Worker // set a delegate for the returned stream (except for test code). 258*6777b538SAndroid Build Coastguard Worker base::WeakPtr<SpdyStream> ReleaseStream(); 259*6777b538SAndroid Build Coastguard Worker 260*6777b538SAndroid Build Coastguard Worker // Changes the priority of the stream, or changes the priority of the queued 261*6777b538SAndroid Build Coastguard Worker // request in the session. 262*6777b538SAndroid Build Coastguard Worker void SetPriority(RequestPriority priority); 263*6777b538SAndroid Build Coastguard Worker traffic_annotation()264*6777b538SAndroid Build Coastguard Worker const NetworkTrafficAnnotationTag traffic_annotation() const { 265*6777b538SAndroid Build Coastguard Worker return NetworkTrafficAnnotationTag(traffic_annotation_); 266*6777b538SAndroid Build Coastguard Worker } 267*6777b538SAndroid Build Coastguard Worker 268*6777b538SAndroid Build Coastguard Worker private: 269*6777b538SAndroid Build Coastguard Worker friend class SpdySession; 270*6777b538SAndroid Build Coastguard Worker 271*6777b538SAndroid Build Coastguard Worker void OnConfirmHandshakeComplete(int rv); 272*6777b538SAndroid Build Coastguard Worker 273*6777b538SAndroid Build Coastguard Worker // Called by |session_| when the stream attempt has finished 274*6777b538SAndroid Build Coastguard Worker // successfully. 275*6777b538SAndroid Build Coastguard Worker void OnRequestCompleteSuccess(const base::WeakPtr<SpdyStream>& stream); 276*6777b538SAndroid Build Coastguard Worker 277*6777b538SAndroid Build Coastguard Worker // Called by |session_| when the stream attempt has finished with an 278*6777b538SAndroid Build Coastguard Worker // error. Also called with ERR_ABORTED if |session_| is destroyed 279*6777b538SAndroid Build Coastguard Worker // while the stream attempt is still pending. 280*6777b538SAndroid Build Coastguard Worker void OnRequestCompleteFailure(int rv); 281*6777b538SAndroid Build Coastguard Worker 282*6777b538SAndroid Build Coastguard Worker // Accessors called by |session_|. type()283*6777b538SAndroid Build Coastguard Worker SpdyStreamType type() const { return type_; } url()284*6777b538SAndroid Build Coastguard Worker const GURL& url() const { return url_; } priority()285*6777b538SAndroid Build Coastguard Worker RequestPriority priority() const { return priority_; } net_log()286*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& net_log() const { return net_log_; } 287*6777b538SAndroid Build Coastguard Worker 288*6777b538SAndroid Build Coastguard Worker void Reset(); 289*6777b538SAndroid Build Coastguard Worker 290*6777b538SAndroid Build Coastguard Worker SpdyStreamType type_; 291*6777b538SAndroid Build Coastguard Worker base::WeakPtr<SpdySession> session_; 292*6777b538SAndroid Build Coastguard Worker base::WeakPtr<SpdyStream> stream_; 293*6777b538SAndroid Build Coastguard Worker GURL url_; 294*6777b538SAndroid Build Coastguard Worker RequestPriority priority_; 295*6777b538SAndroid Build Coastguard Worker SocketTag socket_tag_; 296*6777b538SAndroid Build Coastguard Worker NetLogWithSource net_log_; 297*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback_; 298*6777b538SAndroid Build Coastguard Worker MutableNetworkTrafficAnnotationTag traffic_annotation_; 299*6777b538SAndroid Build Coastguard Worker base::TimeTicks confirm_handshake_end_; 300*6777b538SAndroid Build Coastguard Worker bool detect_broken_connection_; 301*6777b538SAndroid Build Coastguard Worker base::TimeDelta heartbeat_interval_; 302*6777b538SAndroid Build Coastguard Worker 303*6777b538SAndroid Build Coastguard Worker base::WeakPtrFactory<SpdyStreamRequest> weak_ptr_factory_{this}; 304*6777b538SAndroid Build Coastguard Worker }; 305*6777b538SAndroid Build Coastguard Worker 306*6777b538SAndroid Build Coastguard Worker class NET_EXPORT SpdySession 307*6777b538SAndroid Build Coastguard Worker : public BufferedSpdyFramerVisitorInterface, 308*6777b538SAndroid Build Coastguard Worker public spdy::SpdyFramerDebugVisitorInterface, 309*6777b538SAndroid Build Coastguard Worker public MultiplexedSession, 310*6777b538SAndroid Build Coastguard Worker public HigherLayeredPool, 311*6777b538SAndroid Build Coastguard Worker public NetworkChangeNotifier::DefaultNetworkActiveObserver { 312*6777b538SAndroid Build Coastguard Worker public: 313*6777b538SAndroid Build Coastguard Worker // TODO(akalin): Use base::TickClock when it becomes available. 314*6777b538SAndroid Build Coastguard Worker typedef base::TimeTicks (*TimeFunc)(); 315*6777b538SAndroid Build Coastguard Worker 316*6777b538SAndroid Build Coastguard Worker // Returns true if |new_hostname| can be pooled into an existing connection to 317*6777b538SAndroid Build Coastguard Worker // |old_hostname| associated with |ssl_info|. 318*6777b538SAndroid Build Coastguard Worker static bool CanPool(TransportSecurityState* transport_security_state, 319*6777b538SAndroid Build Coastguard Worker const SSLInfo& ssl_info, 320*6777b538SAndroid Build Coastguard Worker const SSLConfigService& ssl_config_service, 321*6777b538SAndroid Build Coastguard Worker std::string_view old_hostname, 322*6777b538SAndroid Build Coastguard Worker std::string_view new_hostname); 323*6777b538SAndroid Build Coastguard Worker 324*6777b538SAndroid Build Coastguard Worker // Create a new SpdySession. 325*6777b538SAndroid Build Coastguard Worker // |spdy_session_key| is the host/port that this session connects to, privacy 326*6777b538SAndroid Build Coastguard Worker // and proxy configuration settings that it's using. 327*6777b538SAndroid Build Coastguard Worker // |net_log| is the NetLog that we log network events to. 328*6777b538SAndroid Build Coastguard Worker SpdySession(const SpdySessionKey& spdy_session_key, 329*6777b538SAndroid Build Coastguard Worker HttpServerProperties* http_server_properties, 330*6777b538SAndroid Build Coastguard Worker TransportSecurityState* transport_security_state, 331*6777b538SAndroid Build Coastguard Worker SSLConfigService* ssl_config_service, 332*6777b538SAndroid Build Coastguard Worker const quic::ParsedQuicVersionVector& quic_supported_versions, 333*6777b538SAndroid Build Coastguard Worker bool enable_sending_initial_data, 334*6777b538SAndroid Build Coastguard Worker bool enable_ping_based_connection_checking, 335*6777b538SAndroid Build Coastguard Worker bool is_http_enabled, 336*6777b538SAndroid Build Coastguard Worker bool is_quic_enabled, 337*6777b538SAndroid Build Coastguard Worker size_t session_max_recv_window_size, 338*6777b538SAndroid Build Coastguard Worker int session_max_queued_capped_frames, 339*6777b538SAndroid Build Coastguard Worker const spdy::SettingsMap& initial_settings, 340*6777b538SAndroid Build Coastguard Worker bool enable_http2_settings_grease, 341*6777b538SAndroid Build Coastguard Worker const std::optional<SpdySessionPool::GreasedHttp2Frame>& 342*6777b538SAndroid Build Coastguard Worker greased_http2_frame, 343*6777b538SAndroid Build Coastguard Worker bool http2_end_stream_with_data_frame, 344*6777b538SAndroid Build Coastguard Worker bool enable_priority_update, 345*6777b538SAndroid Build Coastguard Worker TimeFunc time_func, 346*6777b538SAndroid Build Coastguard Worker NetworkQualityEstimator* network_quality_estimator, 347*6777b538SAndroid Build Coastguard Worker NetLog* net_log); 348*6777b538SAndroid Build Coastguard Worker 349*6777b538SAndroid Build Coastguard Worker ~SpdySession() override; 350*6777b538SAndroid Build Coastguard Worker host_port_pair()351*6777b538SAndroid Build Coastguard Worker const HostPortPair& host_port_pair() const { 352*6777b538SAndroid Build Coastguard Worker return spdy_session_key_.host_port_proxy_pair().first; 353*6777b538SAndroid Build Coastguard Worker } host_port_proxy_pair()354*6777b538SAndroid Build Coastguard Worker const HostPortProxyPair& host_port_proxy_pair() const { 355*6777b538SAndroid Build Coastguard Worker return spdy_session_key_.host_port_proxy_pair(); 356*6777b538SAndroid Build Coastguard Worker } spdy_session_key()357*6777b538SAndroid Build Coastguard Worker const SpdySessionKey& spdy_session_key() const { return spdy_session_key_; } 358*6777b538SAndroid Build Coastguard Worker 359*6777b538SAndroid Build Coastguard Worker // Initialize the session with the given connection. 360*6777b538SAndroid Build Coastguard Worker // 361*6777b538SAndroid Build Coastguard Worker // |pool| is the SpdySessionPool that owns us. Its lifetime must 362*6777b538SAndroid Build Coastguard Worker // strictly be greater than |this|. 363*6777b538SAndroid Build Coastguard Worker // 364*6777b538SAndroid Build Coastguard Worker // The session begins reading from |client_socket_handle| on a subsequent 365*6777b538SAndroid Build Coastguard Worker // event loop iteration, so the SpdySession may close immediately afterwards 366*6777b538SAndroid Build Coastguard Worker // if the first read of |client_socket_handle| fails. 367*6777b538SAndroid Build Coastguard Worker void InitializeWithSocketHandle( 368*6777b538SAndroid Build Coastguard Worker std::unique_ptr<ClientSocketHandle> client_socket_handle, 369*6777b538SAndroid Build Coastguard Worker SpdySessionPool* pool); 370*6777b538SAndroid Build Coastguard Worker 371*6777b538SAndroid Build Coastguard Worker // Just like InitializeWithSocketHandle(), but for use when the session is not 372*6777b538SAndroid Build Coastguard Worker // on top of a socket pool, but instead directly on top of a socket, which the 373*6777b538SAndroid Build Coastguard Worker // session has sole ownership of, and is responsible for deleting directly 374*6777b538SAndroid Build Coastguard Worker // itself. 375*6777b538SAndroid Build Coastguard Worker void InitializeWithSocket(std::unique_ptr<StreamSocket> stream_socket, 376*6777b538SAndroid Build Coastguard Worker const LoadTimingInfo::ConnectTiming& connect_timing, 377*6777b538SAndroid Build Coastguard Worker SpdySessionPool* pool); 378*6777b538SAndroid Build Coastguard Worker 379*6777b538SAndroid Build Coastguard Worker // Parse ALPS application_data from TLS handshake. 380*6777b538SAndroid Build Coastguard Worker // Returns OK on success. Return a net error code on failure, and closes the 381*6777b538SAndroid Build Coastguard Worker // connection with the same error code. 382*6777b538SAndroid Build Coastguard Worker int ParseAlps(); 383*6777b538SAndroid Build Coastguard Worker 384*6777b538SAndroid Build Coastguard Worker // Check to see if this SPDY session can support an additional domain. 385*6777b538SAndroid Build Coastguard Worker // If the session is un-authenticated, then this call always returns true. 386*6777b538SAndroid Build Coastguard Worker // For SSL-based sessions, verifies that the server certificate in use by 387*6777b538SAndroid Build Coastguard Worker // this session provides authentication for the domain and no client 388*6777b538SAndroid Build Coastguard Worker // certificate or channel ID was sent to the original server during the SSL 389*6777b538SAndroid Build Coastguard Worker // handshake. NOTE: This function can have false negatives on some 390*6777b538SAndroid Build Coastguard Worker // platforms. 391*6777b538SAndroid Build Coastguard Worker // TODO(wtc): rename this function and the Net.SpdyIPPoolDomainMatch 392*6777b538SAndroid Build Coastguard Worker // histogram because this function does more than verifying domain 393*6777b538SAndroid Build Coastguard Worker // authentication now. 394*6777b538SAndroid Build Coastguard Worker bool VerifyDomainAuthentication(std::string_view domain) const; 395*6777b538SAndroid Build Coastguard Worker 396*6777b538SAndroid Build Coastguard Worker // Pushes the given producer into the write queue for 397*6777b538SAndroid Build Coastguard Worker // |stream|. |stream| is guaranteed to be activated before the 398*6777b538SAndroid Build Coastguard Worker // producer is used to produce its frame. 399*6777b538SAndroid Build Coastguard Worker void EnqueueStreamWrite(const base::WeakPtr<SpdyStream>& stream, 400*6777b538SAndroid Build Coastguard Worker spdy::SpdyFrameType frame_type, 401*6777b538SAndroid Build Coastguard Worker std::unique_ptr<SpdyBufferProducer> producer); 402*6777b538SAndroid Build Coastguard Worker 403*6777b538SAndroid Build Coastguard Worker // Returns true if this session is configured to send greased HTTP/2 frames. 404*6777b538SAndroid Build Coastguard Worker // For more details on greased frames, see 405*6777b538SAndroid Build Coastguard Worker // https://tools.ietf.org/html/draft-bishop-httpbis-grease-00. 406*6777b538SAndroid Build Coastguard Worker bool GreasedFramesEnabled() const; 407*6777b538SAndroid Build Coastguard Worker 408*6777b538SAndroid Build Coastguard Worker // Returns true if HEADERS frames on request streams should not have the 409*6777b538SAndroid Build Coastguard Worker // END_STREAM flag set, but instead an empty DATA frame with END_STREAM should 410*6777b538SAndroid Build Coastguard Worker // be sent afterwards to close the stream. Does not apply to bidirectional or 411*6777b538SAndroid Build Coastguard Worker // proxy streams. EndStreamWithDataFrame()412*6777b538SAndroid Build Coastguard Worker bool EndStreamWithDataFrame() const { 413*6777b538SAndroid Build Coastguard Worker return http2_end_stream_with_data_frame_; 414*6777b538SAndroid Build Coastguard Worker } 415*6777b538SAndroid Build Coastguard Worker 416*6777b538SAndroid Build Coastguard Worker // Send greased frame, that is, a frame of reserved type. 417*6777b538SAndroid Build Coastguard Worker void EnqueueGreasedFrame(const base::WeakPtr<SpdyStream>& stream); 418*6777b538SAndroid Build Coastguard Worker 419*6777b538SAndroid Build Coastguard Worker // Returns whether HTTP/2 style priority information (stream dependency and 420*6777b538SAndroid Build Coastguard Worker // weight fields in HEADERS frames, and PRIORITY frames) should be sent. True 421*6777b538SAndroid Build Coastguard Worker // unless |enable_priority_update_| is true and 422*6777b538SAndroid Build Coastguard Worker // SETTINGS_DEPRECATE_HTTP2_PRIORITIES with value 1 has been received from 423*6777b538SAndroid Build Coastguard Worker // server. In particular, if it returns false, it will always return false 424*6777b538SAndroid Build Coastguard Worker // afterwards. 425*6777b538SAndroid Build Coastguard Worker bool ShouldSendHttp2Priority() const; 426*6777b538SAndroid Build Coastguard Worker 427*6777b538SAndroid Build Coastguard Worker // Returns whether PRIORITY_UPDATE frames should be sent. False if 428*6777b538SAndroid Build Coastguard Worker // |enable_priority_update_| is false. Otherwise, true before SETTINGS frame 429*6777b538SAndroid Build Coastguard Worker // is received from server, and true after SETTINGS frame is received if it 430*6777b538SAndroid Build Coastguard Worker // contained SETTINGS_DEPRECATE_HTTP2_PRIORITIES with value 1. In particular, 431*6777b538SAndroid Build Coastguard Worker // if it returns false, it will always return false afterwards. 432*6777b538SAndroid Build Coastguard Worker bool ShouldSendPriorityUpdate() const; 433*6777b538SAndroid Build Coastguard Worker 434*6777b538SAndroid Build Coastguard Worker // Runs the handshake to completion to confirm the handshake with the server. 435*6777b538SAndroid Build Coastguard Worker // If ERR_IO_PENDING is returned, then when the handshake is confirmed, 436*6777b538SAndroid Build Coastguard Worker // |callback| will be called. 437*6777b538SAndroid Build Coastguard Worker int ConfirmHandshake(CompletionOnceCallback callback); 438*6777b538SAndroid Build Coastguard Worker 439*6777b538SAndroid Build Coastguard Worker // Creates and returns a HEADERS frame for |stream_id|. 440*6777b538SAndroid Build Coastguard Worker std::unique_ptr<spdy::SpdySerializedFrame> CreateHeaders( 441*6777b538SAndroid Build Coastguard Worker spdy::SpdyStreamId stream_id, 442*6777b538SAndroid Build Coastguard Worker RequestPriority priority, 443*6777b538SAndroid Build Coastguard Worker spdy::SpdyControlFlags flags, 444*6777b538SAndroid Build Coastguard Worker spdy::Http2HeaderBlock headers, 445*6777b538SAndroid Build Coastguard Worker NetLogSource source_dependency); 446*6777b538SAndroid Build Coastguard Worker 447*6777b538SAndroid Build Coastguard Worker // Creates and returns a SpdyBuffer holding a data frame with the given data. 448*6777b538SAndroid Build Coastguard Worker // Sets |*effective_len| to number of bytes sent, and |*end_stream| to the 449*6777b538SAndroid Build Coastguard Worker // value of the END_STREAM (also known as fin) flag. Returns nullptr if 450*6777b538SAndroid Build Coastguard Worker // session is draining or if session or stream is stalled by flow control. 451*6777b538SAndroid Build Coastguard Worker std::unique_ptr<SpdyBuffer> CreateDataBuffer(spdy::SpdyStreamId stream_id, 452*6777b538SAndroid Build Coastguard Worker IOBuffer* data, 453*6777b538SAndroid Build Coastguard Worker int len, 454*6777b538SAndroid Build Coastguard Worker spdy::SpdyDataFlags flags, 455*6777b538SAndroid Build Coastguard Worker int* effective_len, 456*6777b538SAndroid Build Coastguard Worker bool* end_stream); 457*6777b538SAndroid Build Coastguard Worker 458*6777b538SAndroid Build Coastguard Worker // Send PRIORITY frames according to the new priority of an existing stream. 459*6777b538SAndroid Build Coastguard Worker void UpdateStreamPriority(SpdyStream* stream, 460*6777b538SAndroid Build Coastguard Worker RequestPriority old_priority, 461*6777b538SAndroid Build Coastguard Worker RequestPriority new_priority); 462*6777b538SAndroid Build Coastguard Worker 463*6777b538SAndroid Build Coastguard Worker // Close the stream with the given ID, which must exist and be 464*6777b538SAndroid Build Coastguard Worker // active. Note that that stream may hold the last reference to the 465*6777b538SAndroid Build Coastguard Worker // session. 466*6777b538SAndroid Build Coastguard Worker void CloseActiveStream(spdy::SpdyStreamId stream_id, int status); 467*6777b538SAndroid Build Coastguard Worker 468*6777b538SAndroid Build Coastguard Worker // Close the given created stream, which must exist but not yet be 469*6777b538SAndroid Build Coastguard Worker // active. Note that |stream| may hold the last reference to the 470*6777b538SAndroid Build Coastguard Worker // session. 471*6777b538SAndroid Build Coastguard Worker void CloseCreatedStream(const base::WeakPtr<SpdyStream>& stream, int status); 472*6777b538SAndroid Build Coastguard Worker 473*6777b538SAndroid Build Coastguard Worker // Send a RST_STREAM frame with the given status code and close the 474*6777b538SAndroid Build Coastguard Worker // stream with the given ID, which must exist and be active. Note 475*6777b538SAndroid Build Coastguard Worker // that that stream may hold the last reference to the session. 476*6777b538SAndroid Build Coastguard Worker void ResetStream(spdy::SpdyStreamId stream_id, 477*6777b538SAndroid Build Coastguard Worker int error, 478*6777b538SAndroid Build Coastguard Worker const std::string& description); 479*6777b538SAndroid Build Coastguard Worker 480*6777b538SAndroid Build Coastguard Worker // Check if a stream is active. 481*6777b538SAndroid Build Coastguard Worker bool IsStreamActive(spdy::SpdyStreamId stream_id) const; 482*6777b538SAndroid Build Coastguard Worker 483*6777b538SAndroid Build Coastguard Worker // The LoadState is used for informing the user of the current network 484*6777b538SAndroid Build Coastguard Worker // status, such as "resolving host", "connecting", etc. 485*6777b538SAndroid Build Coastguard Worker LoadState GetLoadState() const; 486*6777b538SAndroid Build Coastguard Worker 487*6777b538SAndroid Build Coastguard Worker // MultiplexedSession methods: 488*6777b538SAndroid Build Coastguard Worker int GetRemoteEndpoint(IPEndPoint* endpoint) override; 489*6777b538SAndroid Build Coastguard Worker bool GetSSLInfo(SSLInfo* ssl_info) const override; 490*6777b538SAndroid Build Coastguard Worker std::string_view GetAcceptChViaAlps( 491*6777b538SAndroid Build Coastguard Worker const url::SchemeHostPort& scheme_host_port) const override; 492*6777b538SAndroid Build Coastguard Worker 493*6777b538SAndroid Build Coastguard Worker // Returns the protocol negotiated via ALPN for the underlying socket. 494*6777b538SAndroid Build Coastguard Worker NextProto GetNegotiatedProtocol() const; 495*6777b538SAndroid Build Coastguard Worker 496*6777b538SAndroid Build Coastguard Worker // Send a WINDOW_UPDATE frame for a stream. Called by a stream 497*6777b538SAndroid Build Coastguard Worker // whenever receive window size is increased. 498*6777b538SAndroid Build Coastguard Worker void SendStreamWindowUpdate(spdy::SpdyStreamId stream_id, 499*6777b538SAndroid Build Coastguard Worker uint32_t delta_window_size); 500*6777b538SAndroid Build Coastguard Worker 501*6777b538SAndroid Build Coastguard Worker // Configure the amount of time that small receive window updates should 502*6777b538SAndroid Build Coastguard Worker // be accumulated over (defaults to kDefaultTimeToBufferSmallWindowUpdates). SetTimeToBufferSmallWindowUpdates(const base::TimeDelta buffer_time)503*6777b538SAndroid Build Coastguard Worker void SetTimeToBufferSmallWindowUpdates(const base::TimeDelta buffer_time) { 504*6777b538SAndroid Build Coastguard Worker time_to_buffer_small_window_updates_ = buffer_time; 505*6777b538SAndroid Build Coastguard Worker } 506*6777b538SAndroid Build Coastguard Worker 507*6777b538SAndroid Build Coastguard Worker // Returns the configured time that small receive window updates should 508*6777b538SAndroid Build Coastguard Worker // be accumulated over. TimeToBufferSmallWindowUpdates()509*6777b538SAndroid Build Coastguard Worker base::TimeDelta TimeToBufferSmallWindowUpdates() const { 510*6777b538SAndroid Build Coastguard Worker return time_to_buffer_small_window_updates_; 511*6777b538SAndroid Build Coastguard Worker } 512*6777b538SAndroid Build Coastguard Worker 513*6777b538SAndroid Build Coastguard Worker // Accessors for the session's availability state. IsAvailable()514*6777b538SAndroid Build Coastguard Worker bool IsAvailable() const { return availability_state_ == STATE_AVAILABLE; } IsGoingAway()515*6777b538SAndroid Build Coastguard Worker bool IsGoingAway() const { return availability_state_ == STATE_GOING_AWAY; } IsDraining()516*6777b538SAndroid Build Coastguard Worker bool IsDraining() const { return availability_state_ == STATE_DRAINING; } 517*6777b538SAndroid Build Coastguard Worker 518*6777b538SAndroid Build Coastguard Worker // Closes this session. This will close all active streams and mark 519*6777b538SAndroid Build Coastguard Worker // the session as permanently closed. Callers must assume that the 520*6777b538SAndroid Build Coastguard Worker // session is destroyed after this is called. (However, it may not 521*6777b538SAndroid Build Coastguard Worker // be destroyed right away, e.g. when a SpdySession function is 522*6777b538SAndroid Build Coastguard Worker // present in the call stack.) 523*6777b538SAndroid Build Coastguard Worker // 524*6777b538SAndroid Build Coastguard Worker // |err| should be < ERR_IO_PENDING; this function is intended to be 525*6777b538SAndroid Build Coastguard Worker // called on error. 526*6777b538SAndroid Build Coastguard Worker // |description| indicates the reason for the error. 527*6777b538SAndroid Build Coastguard Worker void CloseSessionOnError(Error err, const std::string& description); 528*6777b538SAndroid Build Coastguard Worker 529*6777b538SAndroid Build Coastguard Worker // Mark this session as unavailable, meaning that it will not be used to 530*6777b538SAndroid Build Coastguard Worker // service new streams. Unlike when a GOAWAY frame is received, this function 531*6777b538SAndroid Build Coastguard Worker // will not close any streams. 532*6777b538SAndroid Build Coastguard Worker void MakeUnavailable(); 533*6777b538SAndroid Build Coastguard Worker 534*6777b538SAndroid Build Coastguard Worker // Closes all active streams with stream id's greater than 535*6777b538SAndroid Build Coastguard Worker // |last_good_stream_id|, as well as any created or pending 536*6777b538SAndroid Build Coastguard Worker // streams. Must be called only when |availability_state_| >= 537*6777b538SAndroid Build Coastguard Worker // STATE_GOING_AWAY. After this function, DcheckGoingAway() will 538*6777b538SAndroid Build Coastguard Worker // pass. May be called multiple times. 539*6777b538SAndroid Build Coastguard Worker void StartGoingAway(spdy::SpdyStreamId last_good_stream_id, Error status); 540*6777b538SAndroid Build Coastguard Worker 541*6777b538SAndroid Build Coastguard Worker // Must be called only when going away (i.e., DcheckGoingAway() 542*6777b538SAndroid Build Coastguard Worker // passes). If there are no more active streams and the session 543*6777b538SAndroid Build Coastguard Worker // isn't closed yet, close it. 544*6777b538SAndroid Build Coastguard Worker void MaybeFinishGoingAway(); 545*6777b538SAndroid Build Coastguard Worker 546*6777b538SAndroid Build Coastguard Worker // Retrieves information on the current state of the SPDY session as a 547*6777b538SAndroid Build Coastguard Worker // Value. 548*6777b538SAndroid Build Coastguard Worker base::Value::Dict GetInfoAsValue() const; 549*6777b538SAndroid Build Coastguard Worker 550*6777b538SAndroid Build Coastguard Worker // Indicates whether the session is being reused after having successfully 551*6777b538SAndroid Build Coastguard Worker // used to send/receive data in the past or if the underlying socket was idle 552*6777b538SAndroid Build Coastguard Worker // before being used for a SPDY session. 553*6777b538SAndroid Build Coastguard Worker bool IsReused() const; 554*6777b538SAndroid Build Coastguard Worker 555*6777b538SAndroid Build Coastguard Worker // Returns true if the underlying transport socket ever had any reads or 556*6777b538SAndroid Build Coastguard Worker // writes. WasEverUsed()557*6777b538SAndroid Build Coastguard Worker bool WasEverUsed() const { return socket_->WasEverUsed(); } 558*6777b538SAndroid Build Coastguard Worker 559*6777b538SAndroid Build Coastguard Worker // Returns the load timing information from the perspective of the given 560*6777b538SAndroid Build Coastguard Worker // stream. If it's not the first stream, the connection is considered reused 561*6777b538SAndroid Build Coastguard Worker // for that stream. 562*6777b538SAndroid Build Coastguard Worker // 563*6777b538SAndroid Build Coastguard Worker // This uses a different notion of reuse than IsReused(). This function 564*6777b538SAndroid Build Coastguard Worker // sets |socket_reused| to false only if |stream_id| is the ID of the first 565*6777b538SAndroid Build Coastguard Worker // stream using the session. IsReused(), on the other hand, indicates if the 566*6777b538SAndroid Build Coastguard Worker // session has been used to send/receive data at all. 567*6777b538SAndroid Build Coastguard Worker bool GetLoadTimingInfo(spdy::SpdyStreamId stream_id, 568*6777b538SAndroid Build Coastguard Worker LoadTimingInfo* load_timing_info) const; 569*6777b538SAndroid Build Coastguard Worker 570*6777b538SAndroid Build Coastguard Worker // Returns true if session is currently active. is_active()571*6777b538SAndroid Build Coastguard Worker bool is_active() const { 572*6777b538SAndroid Build Coastguard Worker return !active_streams_.empty() || !created_streams_.empty(); 573*6777b538SAndroid Build Coastguard Worker } 574*6777b538SAndroid Build Coastguard Worker 575*6777b538SAndroid Build Coastguard Worker // True if the server supports WebSocket protocol. support_websocket()576*6777b538SAndroid Build Coastguard Worker bool support_websocket() const { return support_websocket_; } 577*6777b538SAndroid Build Coastguard Worker 578*6777b538SAndroid Build Coastguard Worker // Returns true if no stream in the session can send data due to 579*6777b538SAndroid Build Coastguard Worker // session flow control. IsSendStalled()580*6777b538SAndroid Build Coastguard Worker bool IsSendStalled() const { return session_send_window_size_ == 0; } 581*6777b538SAndroid Build Coastguard Worker net_log()582*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& net_log() const { return net_log_; } 583*6777b538SAndroid Build Coastguard Worker 584*6777b538SAndroid Build Coastguard Worker int GetPeerAddress(IPEndPoint* address) const; 585*6777b538SAndroid Build Coastguard Worker int GetLocalAddress(IPEndPoint* address) const; 586*6777b538SAndroid Build Coastguard Worker 587*6777b538SAndroid Build Coastguard Worker // Adds |alias| to set of aliases associated with this session. 588*6777b538SAndroid Build Coastguard Worker void AddPooledAlias(const SpdySessionKey& alias_key); 589*6777b538SAndroid Build Coastguard Worker 590*6777b538SAndroid Build Coastguard Worker // Removes |alias| from set of aliases associated with this session. 591*6777b538SAndroid Build Coastguard Worker void RemovePooledAlias(const SpdySessionKey& alias_key); 592*6777b538SAndroid Build Coastguard Worker 593*6777b538SAndroid Build Coastguard Worker // Returns the set of aliases associated with this session. pooled_aliases()594*6777b538SAndroid Build Coastguard Worker const std::set<SpdySessionKey>& pooled_aliases() const { 595*6777b538SAndroid Build Coastguard Worker return pooled_aliases_; 596*6777b538SAndroid Build Coastguard Worker } 597*6777b538SAndroid Build Coastguard Worker 598*6777b538SAndroid Build Coastguard Worker // https://http2.github.io/http2-spec/#TLSUsage mandates minimum security 599*6777b538SAndroid Build Coastguard Worker // standards for TLS. 600*6777b538SAndroid Build Coastguard Worker bool HasAcceptableTransportSecurity() const; 601*6777b538SAndroid Build Coastguard Worker 602*6777b538SAndroid Build Coastguard Worker // Must be used only by |pool_|. 603*6777b538SAndroid Build Coastguard Worker base::WeakPtr<SpdySession> GetWeakPtr(); 604*6777b538SAndroid Build Coastguard Worker 605*6777b538SAndroid Build Coastguard Worker // HigherLayeredPool implementation: 606*6777b538SAndroid Build Coastguard Worker bool CloseOneIdleConnection() override; 607*6777b538SAndroid Build Coastguard Worker 608*6777b538SAndroid Build Coastguard Worker // Change this session's socket tag to |new_tag|. Returns true on success. 609*6777b538SAndroid Build Coastguard Worker bool ChangeSocketTag(const SocketTag& new_tag); 610*6777b538SAndroid Build Coastguard Worker 611*6777b538SAndroid Build Coastguard Worker // Whether connection status monitoring is active or not. 612*6777b538SAndroid Build Coastguard Worker bool IsBrokenConnectionDetectionEnabled() const; 613*6777b538SAndroid Build Coastguard Worker 614*6777b538SAndroid Build Coastguard Worker private: 615*6777b538SAndroid Build Coastguard Worker friend class test::SpdyStreamTest; 616*6777b538SAndroid Build Coastguard Worker friend class base::RefCounted<SpdySession>; 617*6777b538SAndroid Build Coastguard Worker friend class HttpNetworkTransactionTest; 618*6777b538SAndroid Build Coastguard Worker friend class HttpProxyClientSocketPoolTest; 619*6777b538SAndroid Build Coastguard Worker friend class SpdyHttpStreamTest; 620*6777b538SAndroid Build Coastguard Worker friend class SpdyNetworkTransactionTest; 621*6777b538SAndroid Build Coastguard Worker friend class SpdyProxyClientSocketTest; 622*6777b538SAndroid Build Coastguard Worker friend class SpdySessionPoolTest; 623*6777b538SAndroid Build Coastguard Worker friend class SpdySessionTest; 624*6777b538SAndroid Build Coastguard Worker friend class SpdyStreamRequest; 625*6777b538SAndroid Build Coastguard Worker 626*6777b538SAndroid Build Coastguard Worker using PendingStreamRequestQueue = 627*6777b538SAndroid Build Coastguard Worker base::circular_deque<base::WeakPtr<SpdyStreamRequest>>; 628*6777b538SAndroid Build Coastguard Worker using ActiveStreamMap = std::map<spdy::SpdyStreamId, SpdyStream*>; 629*6777b538SAndroid Build Coastguard Worker using CreatedStreamSet = std::set<raw_ptr<SpdyStream, SetExperimental>>; 630*6777b538SAndroid Build Coastguard Worker 631*6777b538SAndroid Build Coastguard Worker enum AvailabilityState { 632*6777b538SAndroid Build Coastguard Worker // The session is available in its socket pool and can be used 633*6777b538SAndroid Build Coastguard Worker // freely. 634*6777b538SAndroid Build Coastguard Worker STATE_AVAILABLE, 635*6777b538SAndroid Build Coastguard Worker // The session can process data on existing streams but will 636*6777b538SAndroid Build Coastguard Worker // refuse to create new ones. 637*6777b538SAndroid Build Coastguard Worker STATE_GOING_AWAY, 638*6777b538SAndroid Build Coastguard Worker // The session is draining its write queue in preparation of closing. 639*6777b538SAndroid Build Coastguard Worker // Further writes will not be queued, and further reads will not be issued 640*6777b538SAndroid Build Coastguard Worker // (though the remainder of a current read may be processed). The session 641*6777b538SAndroid Build Coastguard Worker // will be destroyed by its write loop once the write queue is drained. 642*6777b538SAndroid Build Coastguard Worker STATE_DRAINING, 643*6777b538SAndroid Build Coastguard Worker }; 644*6777b538SAndroid Build Coastguard Worker 645*6777b538SAndroid Build Coastguard Worker enum ReadState { 646*6777b538SAndroid Build Coastguard Worker READ_STATE_DO_READ, 647*6777b538SAndroid Build Coastguard Worker READ_STATE_DO_READ_COMPLETE, 648*6777b538SAndroid Build Coastguard Worker }; 649*6777b538SAndroid Build Coastguard Worker 650*6777b538SAndroid Build Coastguard Worker enum WriteState { 651*6777b538SAndroid Build Coastguard Worker // There is no in-flight write and the write queue is empty. 652*6777b538SAndroid Build Coastguard Worker WRITE_STATE_IDLE, 653*6777b538SAndroid Build Coastguard Worker WRITE_STATE_DO_WRITE, 654*6777b538SAndroid Build Coastguard Worker WRITE_STATE_DO_WRITE_COMPLETE, 655*6777b538SAndroid Build Coastguard Worker }; 656*6777b538SAndroid Build Coastguard Worker 657*6777b538SAndroid Build Coastguard Worker // Has the shared logic for the other two Initialize methods that call it. 658*6777b538SAndroid Build Coastguard Worker void InitializeInternal(SpdySessionPool* pool); 659*6777b538SAndroid Build Coastguard Worker 660*6777b538SAndroid Build Coastguard Worker // Called by SpdyStreamRequest to start a request to create a 661*6777b538SAndroid Build Coastguard Worker // stream. If OK is returned, then |stream| will be filled in with a 662*6777b538SAndroid Build Coastguard Worker // valid stream. If ERR_IO_PENDING is returned, then 663*6777b538SAndroid Build Coastguard Worker // |request->OnRequestComplete{Success,Failure}()| will be called 664*6777b538SAndroid Build Coastguard Worker // when the stream is created (unless it is cancelled). Otherwise, 665*6777b538SAndroid Build Coastguard Worker // no stream is created and the error is returned. 666*6777b538SAndroid Build Coastguard Worker int TryCreateStream(const base::WeakPtr<SpdyStreamRequest>& request, 667*6777b538SAndroid Build Coastguard Worker base::WeakPtr<SpdyStream>* stream); 668*6777b538SAndroid Build Coastguard Worker 669*6777b538SAndroid Build Coastguard Worker // Actually create a stream into |stream|. Returns OK if successful; 670*6777b538SAndroid Build Coastguard Worker // otherwise, returns an error and |stream| is not filled. 671*6777b538SAndroid Build Coastguard Worker int CreateStream(const SpdyStreamRequest& request, 672*6777b538SAndroid Build Coastguard Worker base::WeakPtr<SpdyStream>* stream); 673*6777b538SAndroid Build Coastguard Worker 674*6777b538SAndroid Build Coastguard Worker // Called by SpdyStreamRequest to remove |request| from the stream 675*6777b538SAndroid Build Coastguard Worker // creation queue. Returns whether a request was removed from the queue. 676*6777b538SAndroid Build Coastguard Worker bool CancelStreamRequest(const base::WeakPtr<SpdyStreamRequest>& request); 677*6777b538SAndroid Build Coastguard Worker 678*6777b538SAndroid Build Coastguard Worker // Removes |request| from the stream creation queue and reinserts it into the 679*6777b538SAndroid Build Coastguard Worker // queue at the new |priority|. 680*6777b538SAndroid Build Coastguard Worker void ChangeStreamRequestPriority( 681*6777b538SAndroid Build Coastguard Worker const base::WeakPtr<SpdyStreamRequest>& request, 682*6777b538SAndroid Build Coastguard Worker RequestPriority priority); 683*6777b538SAndroid Build Coastguard Worker 684*6777b538SAndroid Build Coastguard Worker // Returns the next pending stream request to process, or NULL if 685*6777b538SAndroid Build Coastguard Worker // there is none. 686*6777b538SAndroid Build Coastguard Worker base::WeakPtr<SpdyStreamRequest> GetNextPendingStreamRequest(); 687*6777b538SAndroid Build Coastguard Worker 688*6777b538SAndroid Build Coastguard Worker // Called when there is room to create more streams (e.g., a stream 689*6777b538SAndroid Build Coastguard Worker // was closed). Processes as many pending stream requests as 690*6777b538SAndroid Build Coastguard Worker // possible. 691*6777b538SAndroid Build Coastguard Worker void ProcessPendingStreamRequests(); 692*6777b538SAndroid Build Coastguard Worker 693*6777b538SAndroid Build Coastguard Worker // Close the stream pointed to by the given iterator. Note that that 694*6777b538SAndroid Build Coastguard Worker // stream may hold the last reference to the session. 695*6777b538SAndroid Build Coastguard Worker void CloseActiveStreamIterator(ActiveStreamMap::iterator it, int status); 696*6777b538SAndroid Build Coastguard Worker 697*6777b538SAndroid Build Coastguard Worker // Close the stream pointed to by the given iterator. Note that that 698*6777b538SAndroid Build Coastguard Worker // stream may hold the last reference to the session. 699*6777b538SAndroid Build Coastguard Worker void CloseCreatedStreamIterator(CreatedStreamSet::iterator it, int status); 700*6777b538SAndroid Build Coastguard Worker 701*6777b538SAndroid Build Coastguard Worker // Calls EnqueueResetStreamFrame() and then 702*6777b538SAndroid Build Coastguard Worker // CloseActiveStreamIterator(). 703*6777b538SAndroid Build Coastguard Worker void ResetStreamIterator(ActiveStreamMap::iterator it, 704*6777b538SAndroid Build Coastguard Worker int status, 705*6777b538SAndroid Build Coastguard Worker const std::string& description); 706*6777b538SAndroid Build Coastguard Worker 707*6777b538SAndroid Build Coastguard Worker // Send a RST_STREAM frame with the given parameters. There should 708*6777b538SAndroid Build Coastguard Worker // either be no active stream with the given ID, or that active 709*6777b538SAndroid Build Coastguard Worker // stream should be closed shortly after this function is called. 710*6777b538SAndroid Build Coastguard Worker void EnqueueResetStreamFrame(spdy::SpdyStreamId stream_id, 711*6777b538SAndroid Build Coastguard Worker RequestPriority priority, 712*6777b538SAndroid Build Coastguard Worker spdy::SpdyErrorCode error_code, 713*6777b538SAndroid Build Coastguard Worker const std::string& description); 714*6777b538SAndroid Build Coastguard Worker 715*6777b538SAndroid Build Coastguard Worker // Send a PRIORITY frame with the given parameters. 716*6777b538SAndroid Build Coastguard Worker void EnqueuePriorityFrame(spdy::SpdyStreamId stream_id, 717*6777b538SAndroid Build Coastguard Worker spdy::SpdyStreamId dependency_id, 718*6777b538SAndroid Build Coastguard Worker int weight, 719*6777b538SAndroid Build Coastguard Worker bool exclusive); 720*6777b538SAndroid Build Coastguard Worker 721*6777b538SAndroid Build Coastguard Worker // Calls DoReadLoop. Use this function instead of DoReadLoop when 722*6777b538SAndroid Build Coastguard Worker // posting a task to pump the read loop. 723*6777b538SAndroid Build Coastguard Worker void PumpReadLoop(ReadState expected_read_state, int result); 724*6777b538SAndroid Build Coastguard Worker 725*6777b538SAndroid Build Coastguard Worker // Advance the ReadState state machine. |expected_read_state| is the 726*6777b538SAndroid Build Coastguard Worker // expected starting read state. 727*6777b538SAndroid Build Coastguard Worker // 728*6777b538SAndroid Build Coastguard Worker // This function must always be called via PumpReadLoop(). 729*6777b538SAndroid Build Coastguard Worker int DoReadLoop(ReadState expected_read_state, int result); 730*6777b538SAndroid Build Coastguard Worker // The implementations of the states of the ReadState state machine. 731*6777b538SAndroid Build Coastguard Worker int DoRead(); 732*6777b538SAndroid Build Coastguard Worker int DoReadComplete(int result); 733*6777b538SAndroid Build Coastguard Worker 734*6777b538SAndroid Build Coastguard Worker // Calls DoWriteLoop. If |availability_state_| is STATE_DRAINING and no 735*6777b538SAndroid Build Coastguard Worker // writes remain, the session is removed from the session pool and 736*6777b538SAndroid Build Coastguard Worker // destroyed. 737*6777b538SAndroid Build Coastguard Worker // 738*6777b538SAndroid Build Coastguard Worker // Use this function instead of DoWriteLoop when posting a task to 739*6777b538SAndroid Build Coastguard Worker // pump the write loop. 740*6777b538SAndroid Build Coastguard Worker void PumpWriteLoop(WriteState expected_write_state, int result); 741*6777b538SAndroid Build Coastguard Worker 742*6777b538SAndroid Build Coastguard Worker // Iff the write loop is not currently active, posts a callback into 743*6777b538SAndroid Build Coastguard Worker // PumpWriteLoop(). 744*6777b538SAndroid Build Coastguard Worker void MaybePostWriteLoop(); 745*6777b538SAndroid Build Coastguard Worker 746*6777b538SAndroid Build Coastguard Worker // Advance the WriteState state machine. |expected_write_state| is 747*6777b538SAndroid Build Coastguard Worker // the expected starting write state. 748*6777b538SAndroid Build Coastguard Worker // 749*6777b538SAndroid Build Coastguard Worker // This function must always be called via PumpWriteLoop(). 750*6777b538SAndroid Build Coastguard Worker int DoWriteLoop(WriteState expected_write_state, int result); 751*6777b538SAndroid Build Coastguard Worker // The implementations of the states of the WriteState state machine. 752*6777b538SAndroid Build Coastguard Worker int DoWrite(); 753*6777b538SAndroid Build Coastguard Worker int DoWriteComplete(int result); 754*6777b538SAndroid Build Coastguard Worker 755*6777b538SAndroid Build Coastguard Worker void NotifyRequestsOfConfirmation(int rv); 756*6777b538SAndroid Build Coastguard Worker 757*6777b538SAndroid Build Coastguard Worker // TODO(akalin): Rename the Send* and Write* functions below to 758*6777b538SAndroid Build Coastguard Worker // Enqueue*. 759*6777b538SAndroid Build Coastguard Worker 760*6777b538SAndroid Build Coastguard Worker // Send initial data. Called when a connection is successfully 761*6777b538SAndroid Build Coastguard Worker // established in InitializeWithSocket() and 762*6777b538SAndroid Build Coastguard Worker // |enable_sending_initial_data_| is true. 763*6777b538SAndroid Build Coastguard Worker void SendInitialData(); 764*6777b538SAndroid Build Coastguard Worker 765*6777b538SAndroid Build Coastguard Worker // Handle SETTING. Either when we send settings, or when we receive a 766*6777b538SAndroid Build Coastguard Worker // SETTINGS control frame, update our SpdySession accordingly. 767*6777b538SAndroid Build Coastguard Worker void HandleSetting(uint32_t id, uint32_t value); 768*6777b538SAndroid Build Coastguard Worker 769*6777b538SAndroid Build Coastguard Worker // Adjust the send window size of all ActiveStreams and PendingStreamRequests. 770*6777b538SAndroid Build Coastguard Worker void UpdateStreamsSendWindowSize(int32_t delta_window_size); 771*6777b538SAndroid Build Coastguard Worker 772*6777b538SAndroid Build Coastguard Worker // Checks the connection status in an energy efficient manner: 773*6777b538SAndroid Build Coastguard Worker // * If the radio is in full power mode, send the PING immediately 774*6777b538SAndroid Build Coastguard Worker // * If the radio is in standby, record the event and send the PING once the 775*6777b538SAndroid Build Coastguard Worker // radio wakes up 776*6777b538SAndroid Build Coastguard Worker // The radio status check is currently only implemented for Android devices, 777*6777b538SAndroid Build Coastguard Worker // on all other platforms the radio is assumed to be always active (i.e., no 778*6777b538SAndroid Build Coastguard Worker // batching happens). 779*6777b538SAndroid Build Coastguard Worker void MaybeCheckConnectionStatus(); 780*6777b538SAndroid Build Coastguard Worker // Always checks the connection status and schedules the next check. 781*6777b538SAndroid Build Coastguard Worker void CheckConnectionStatus(); 782*6777b538SAndroid Build Coastguard Worker // Send PING frame if all previous PING frames have been ACKed, 783*6777b538SAndroid Build Coastguard Worker // all posted CheckPingStatus() tasks have been executed, 784*6777b538SAndroid Build Coastguard Worker // and too long time has passed since last read from server. 785*6777b538SAndroid Build Coastguard Worker void MaybeSendPrefacePing(); 786*6777b538SAndroid Build Coastguard Worker 787*6777b538SAndroid Build Coastguard Worker // Send a single WINDOW_UPDATE frame. 788*6777b538SAndroid Build Coastguard Worker void SendWindowUpdateFrame(spdy::SpdyStreamId stream_id, 789*6777b538SAndroid Build Coastguard Worker uint32_t delta_window_size, 790*6777b538SAndroid Build Coastguard Worker RequestPriority priority); 791*6777b538SAndroid Build Coastguard Worker 792*6777b538SAndroid Build Coastguard Worker // Send the PING frame. 793*6777b538SAndroid Build Coastguard Worker void WritePingFrame(spdy::SpdyPingId unique_id, bool is_ack); 794*6777b538SAndroid Build Coastguard Worker 795*6777b538SAndroid Build Coastguard Worker // Post a CheckPingStatus call after delay. Don't post if there is already 796*6777b538SAndroid Build Coastguard Worker // CheckPingStatus running. 797*6777b538SAndroid Build Coastguard Worker void PlanToCheckPingStatus(); 798*6777b538SAndroid Build Coastguard Worker 799*6777b538SAndroid Build Coastguard Worker // Check the status of the connection. It calls |CloseSessionOnError| if we 800*6777b538SAndroid Build Coastguard Worker // haven't received any data in |kHungInterval| time period. 801*6777b538SAndroid Build Coastguard Worker void CheckPingStatus(base::TimeTicks last_check_time); 802*6777b538SAndroid Build Coastguard Worker 803*6777b538SAndroid Build Coastguard Worker // Get a new stream id. 804*6777b538SAndroid Build Coastguard Worker spdy::SpdyStreamId GetNewStreamId(); 805*6777b538SAndroid Build Coastguard Worker 806*6777b538SAndroid Build Coastguard Worker // Pushes the given frame with the given priority into the write 807*6777b538SAndroid Build Coastguard Worker // queue for the session. 808*6777b538SAndroid Build Coastguard Worker void EnqueueSessionWrite(RequestPriority priority, 809*6777b538SAndroid Build Coastguard Worker spdy::SpdyFrameType frame_type, 810*6777b538SAndroid Build Coastguard Worker std::unique_ptr<spdy::SpdySerializedFrame> frame); 811*6777b538SAndroid Build Coastguard Worker 812*6777b538SAndroid Build Coastguard Worker // Puts |producer| associated with |stream| onto the write queue 813*6777b538SAndroid Build Coastguard Worker // with the given priority. 814*6777b538SAndroid Build Coastguard Worker void EnqueueWrite(RequestPriority priority, 815*6777b538SAndroid Build Coastguard Worker spdy::SpdyFrameType frame_type, 816*6777b538SAndroid Build Coastguard Worker std::unique_ptr<SpdyBufferProducer> producer, 817*6777b538SAndroid Build Coastguard Worker const base::WeakPtr<SpdyStream>& stream, 818*6777b538SAndroid Build Coastguard Worker const NetworkTrafficAnnotationTag& traffic_annotation); 819*6777b538SAndroid Build Coastguard Worker 820*6777b538SAndroid Build Coastguard Worker // Inserts a newly-created stream into |created_streams_|. 821*6777b538SAndroid Build Coastguard Worker void InsertCreatedStream(std::unique_ptr<SpdyStream> stream); 822*6777b538SAndroid Build Coastguard Worker 823*6777b538SAndroid Build Coastguard Worker // Activates |stream| (which must be in |created_streams_|) by 824*6777b538SAndroid Build Coastguard Worker // assigning it an ID and returns it. 825*6777b538SAndroid Build Coastguard Worker std::unique_ptr<SpdyStream> ActivateCreatedStream(SpdyStream* stream); 826*6777b538SAndroid Build Coastguard Worker 827*6777b538SAndroid Build Coastguard Worker // Inserts a newly-activated stream into |active_streams_|. 828*6777b538SAndroid Build Coastguard Worker void InsertActivatedStream(std::unique_ptr<SpdyStream> stream); 829*6777b538SAndroid Build Coastguard Worker 830*6777b538SAndroid Build Coastguard Worker // Remove all internal references to |stream|, call OnClose() on it, 831*6777b538SAndroid Build Coastguard Worker // and process any pending stream requests before deleting it. Note 832*6777b538SAndroid Build Coastguard Worker // that |stream| may hold the last reference to the session. 833*6777b538SAndroid Build Coastguard Worker void DeleteStream(std::unique_ptr<SpdyStream> stream, int status); 834*6777b538SAndroid Build Coastguard Worker 835*6777b538SAndroid Build Coastguard Worker void RecordHistograms(); 836*6777b538SAndroid Build Coastguard Worker void RecordProtocolErrorHistogram(SpdyProtocolErrorDetails details); 837*6777b538SAndroid Build Coastguard Worker 838*6777b538SAndroid Build Coastguard Worker // DCHECKs that |availability_state_| >= STATE_GOING_AWAY, that 839*6777b538SAndroid Build Coastguard Worker // there are no pending stream creation requests, and that there are 840*6777b538SAndroid Build Coastguard Worker // no created streams. 841*6777b538SAndroid Build Coastguard Worker void DcheckGoingAway() const; 842*6777b538SAndroid Build Coastguard Worker 843*6777b538SAndroid Build Coastguard Worker // Calls DcheckGoingAway(), then DCHECKs that |availability_state_| 844*6777b538SAndroid Build Coastguard Worker // == STATE_DRAINING and |error_on_close_| has a valid value. 845*6777b538SAndroid Build Coastguard Worker void DcheckDraining() const; 846*6777b538SAndroid Build Coastguard Worker 847*6777b538SAndroid Build Coastguard Worker // If the session is already draining, does nothing. Otherwise, moves 848*6777b538SAndroid Build Coastguard Worker // the session to the draining state. 849*6777b538SAndroid Build Coastguard Worker void DoDrainSession(Error err, const std::string& description); 850*6777b538SAndroid Build Coastguard Worker 851*6777b538SAndroid Build Coastguard Worker // Called right before closing a (possibly-inactive) stream for a 852*6777b538SAndroid Build Coastguard Worker // reason other than being requested to by the stream. 853*6777b538SAndroid Build Coastguard Worker void LogAbandonedStream(SpdyStream* stream, Error status); 854*6777b538SAndroid Build Coastguard Worker 855*6777b538SAndroid Build Coastguard Worker // Called right before closing an active stream for a reason other 856*6777b538SAndroid Build Coastguard Worker // than being requested to by the stream. 857*6777b538SAndroid Build Coastguard Worker void LogAbandonedActiveStream(ActiveStreamMap::const_iterator it, 858*6777b538SAndroid Build Coastguard Worker Error status); 859*6777b538SAndroid Build Coastguard Worker 860*6777b538SAndroid Build Coastguard Worker // Invokes a user callback for stream creation. We provide this method so it 861*6777b538SAndroid Build Coastguard Worker // can be deferred to the MessageLoop, so we avoid re-entrancy problems. 862*6777b538SAndroid Build Coastguard Worker void CompleteStreamRequest( 863*6777b538SAndroid Build Coastguard Worker const base::WeakPtr<SpdyStreamRequest>& pending_request); 864*6777b538SAndroid Build Coastguard Worker 865*6777b538SAndroid Build Coastguard Worker // BufferedSpdyFramerVisitorInterface: 866*6777b538SAndroid Build Coastguard Worker void OnError( 867*6777b538SAndroid Build Coastguard Worker http2::Http2DecoderAdapter::SpdyFramerError spdy_framer_error) override; 868*6777b538SAndroid Build Coastguard Worker void OnStreamError(spdy::SpdyStreamId stream_id, 869*6777b538SAndroid Build Coastguard Worker const std::string& description) override; 870*6777b538SAndroid Build Coastguard Worker void OnPing(spdy::SpdyPingId unique_id, bool is_ack) override; 871*6777b538SAndroid Build Coastguard Worker void OnRstStream(spdy::SpdyStreamId stream_id, 872*6777b538SAndroid Build Coastguard Worker spdy::SpdyErrorCode error_code) override; 873*6777b538SAndroid Build Coastguard Worker void OnGoAway(spdy::SpdyStreamId last_accepted_stream_id, 874*6777b538SAndroid Build Coastguard Worker spdy::SpdyErrorCode error_code, 875*6777b538SAndroid Build Coastguard Worker std::string_view debug_data) override; 876*6777b538SAndroid Build Coastguard Worker void OnDataFrameHeader(spdy::SpdyStreamId stream_id, 877*6777b538SAndroid Build Coastguard Worker size_t length, 878*6777b538SAndroid Build Coastguard Worker bool fin) override; 879*6777b538SAndroid Build Coastguard Worker void OnStreamFrameData(spdy::SpdyStreamId stream_id, 880*6777b538SAndroid Build Coastguard Worker const char* data, 881*6777b538SAndroid Build Coastguard Worker size_t len) override; 882*6777b538SAndroid Build Coastguard Worker void OnStreamEnd(spdy::SpdyStreamId stream_id) override; 883*6777b538SAndroid Build Coastguard Worker void OnStreamPadding(spdy::SpdyStreamId stream_id, size_t len) override; 884*6777b538SAndroid Build Coastguard Worker void OnSettings() override; 885*6777b538SAndroid Build Coastguard Worker void OnSettingsAck() override; 886*6777b538SAndroid Build Coastguard Worker void OnSetting(spdy::SpdySettingsId id, uint32_t value) override; 887*6777b538SAndroid Build Coastguard Worker void OnSettingsEnd() override; 888*6777b538SAndroid Build Coastguard Worker void OnWindowUpdate(spdy::SpdyStreamId stream_id, 889*6777b538SAndroid Build Coastguard Worker int delta_window_size) override; 890*6777b538SAndroid Build Coastguard Worker void OnPushPromise(spdy::SpdyStreamId stream_id, 891*6777b538SAndroid Build Coastguard Worker spdy::SpdyStreamId promised_stream_id, 892*6777b538SAndroid Build Coastguard Worker spdy::Http2HeaderBlock headers) override; 893*6777b538SAndroid Build Coastguard Worker void OnHeaders(spdy::SpdyStreamId stream_id, 894*6777b538SAndroid Build Coastguard Worker bool has_priority, 895*6777b538SAndroid Build Coastguard Worker int weight, 896*6777b538SAndroid Build Coastguard Worker spdy::SpdyStreamId parent_stream_id, 897*6777b538SAndroid Build Coastguard Worker bool exclusive, 898*6777b538SAndroid Build Coastguard Worker bool fin, 899*6777b538SAndroid Build Coastguard Worker spdy::Http2HeaderBlock headers, 900*6777b538SAndroid Build Coastguard Worker base::TimeTicks recv_first_byte_time) override; 901*6777b538SAndroid Build Coastguard Worker void OnAltSvc(spdy::SpdyStreamId stream_id, 902*6777b538SAndroid Build Coastguard Worker std::string_view origin, 903*6777b538SAndroid Build Coastguard Worker const spdy::SpdyAltSvcWireFormat::AlternativeServiceVector& 904*6777b538SAndroid Build Coastguard Worker altsvc_vector) override; 905*6777b538SAndroid Build Coastguard Worker bool OnUnknownFrame(spdy::SpdyStreamId stream_id, 906*6777b538SAndroid Build Coastguard Worker uint8_t frame_type) override; 907*6777b538SAndroid Build Coastguard Worker 908*6777b538SAndroid Build Coastguard Worker // spdy::SpdyFramerDebugVisitorInterface 909*6777b538SAndroid Build Coastguard Worker void OnSendCompressedFrame(spdy::SpdyStreamId stream_id, 910*6777b538SAndroid Build Coastguard Worker spdy::SpdyFrameType type, 911*6777b538SAndroid Build Coastguard Worker size_t payload_len, 912*6777b538SAndroid Build Coastguard Worker size_t frame_len) override; 913*6777b538SAndroid Build Coastguard Worker void OnReceiveCompressedFrame(spdy::SpdyStreamId stream_id, 914*6777b538SAndroid Build Coastguard Worker spdy::SpdyFrameType type, 915*6777b538SAndroid Build Coastguard Worker size_t frame_len) override; 916*6777b538SAndroid Build Coastguard Worker 917*6777b538SAndroid Build Coastguard Worker // Called when bytes are consumed from a SpdyBuffer for a DATA frame 918*6777b538SAndroid Build Coastguard Worker // that is to be written or is being written. Increases the send 919*6777b538SAndroid Build Coastguard Worker // window size accordingly if some or all of the SpdyBuffer is being 920*6777b538SAndroid Build Coastguard Worker // discarded. 921*6777b538SAndroid Build Coastguard Worker // 922*6777b538SAndroid Build Coastguard Worker // If session flow control is turned off, this must not be called. 923*6777b538SAndroid Build Coastguard Worker void OnWriteBufferConsumed(size_t frame_payload_size, 924*6777b538SAndroid Build Coastguard Worker size_t consume_size, 925*6777b538SAndroid Build Coastguard Worker SpdyBuffer::ConsumeSource consume_source); 926*6777b538SAndroid Build Coastguard Worker 927*6777b538SAndroid Build Coastguard Worker // Called when the radio goes into full power mode. Currently implemented only 928*6777b538SAndroid Build Coastguard Worker // for Android devices. 929*6777b538SAndroid Build Coastguard Worker void OnDefaultNetworkActive() override; 930*6777b538SAndroid Build Coastguard Worker 931*6777b538SAndroid Build Coastguard Worker // Called by OnWindowUpdate() (which is in turn called by the 932*6777b538SAndroid Build Coastguard Worker // framer) to increase this session's send window size by 933*6777b538SAndroid Build Coastguard Worker // |delta_window_size| from a WINDOW_UPDATE frome, which must be at 934*6777b538SAndroid Build Coastguard Worker // least 1. If |delta_window_size| would cause this session's send 935*6777b538SAndroid Build Coastguard Worker // window size to overflow, does nothing. 936*6777b538SAndroid Build Coastguard Worker // 937*6777b538SAndroid Build Coastguard Worker // If session flow control is turned off, this must not be called. 938*6777b538SAndroid Build Coastguard Worker void IncreaseSendWindowSize(int delta_window_size); 939*6777b538SAndroid Build Coastguard Worker 940*6777b538SAndroid Build Coastguard Worker // If session flow control is turned on, called by CreateDataFrame() 941*6777b538SAndroid Build Coastguard Worker // (which is in turn called by a stream) to decrease this session's 942*6777b538SAndroid Build Coastguard Worker // send window size by |delta_window_size|, which must be at least 1 943*6777b538SAndroid Build Coastguard Worker // and at most kMaxSpdyFrameChunkSize. |delta_window_size| must not 944*6777b538SAndroid Build Coastguard Worker // cause this session's send window size to go negative. 945*6777b538SAndroid Build Coastguard Worker // 946*6777b538SAndroid Build Coastguard Worker // If session flow control is turned off, this must not be called. 947*6777b538SAndroid Build Coastguard Worker void DecreaseSendWindowSize(int32_t delta_window_size); 948*6777b538SAndroid Build Coastguard Worker 949*6777b538SAndroid Build Coastguard Worker // Called when bytes are consumed by the delegate from a SpdyBuffer 950*6777b538SAndroid Build Coastguard Worker // containing received data. Increases the receive window size 951*6777b538SAndroid Build Coastguard Worker // accordingly. 952*6777b538SAndroid Build Coastguard Worker // 953*6777b538SAndroid Build Coastguard Worker // If session flow control is turned off, this must not be called. 954*6777b538SAndroid Build Coastguard Worker void OnReadBufferConsumed(size_t consume_size, 955*6777b538SAndroid Build Coastguard Worker SpdyBuffer::ConsumeSource consume_source); 956*6777b538SAndroid Build Coastguard Worker 957*6777b538SAndroid Build Coastguard Worker // Called by OnReadBufferConsume to increase this session's receive 958*6777b538SAndroid Build Coastguard Worker // window size by |delta_window_size|, which must be at least 1 and 959*6777b538SAndroid Build Coastguard Worker // must not cause this session's receive window size to overflow, 960*6777b538SAndroid Build Coastguard Worker // possibly also sending a WINDOW_UPDATE frame. Also called during 961*6777b538SAndroid Build Coastguard Worker // initialization to set the initial receive window size. 962*6777b538SAndroid Build Coastguard Worker // 963*6777b538SAndroid Build Coastguard Worker // If session flow control is turned off, this must not be called. 964*6777b538SAndroid Build Coastguard Worker void IncreaseRecvWindowSize(int32_t delta_window_size); 965*6777b538SAndroid Build Coastguard Worker 966*6777b538SAndroid Build Coastguard Worker // Called by OnStreamFrameData (which is in turn called by the 967*6777b538SAndroid Build Coastguard Worker // framer) to decrease this session's receive window size by 968*6777b538SAndroid Build Coastguard Worker // |delta_window_size|, which must be at least 1 and must not cause 969*6777b538SAndroid Build Coastguard Worker // this session's receive window size to go negative. 970*6777b538SAndroid Build Coastguard Worker // 971*6777b538SAndroid Build Coastguard Worker // If session flow control is turned off, this must not be called. 972*6777b538SAndroid Build Coastguard Worker void DecreaseRecvWindowSize(int32_t delta_window_size); 973*6777b538SAndroid Build Coastguard Worker 974*6777b538SAndroid Build Coastguard Worker // Queue a send-stalled stream for possibly resuming once we're not 975*6777b538SAndroid Build Coastguard Worker // send-stalled anymore. 976*6777b538SAndroid Build Coastguard Worker void QueueSendStalledStream(const SpdyStream& stream); 977*6777b538SAndroid Build Coastguard Worker 978*6777b538SAndroid Build Coastguard Worker // Go through the queue of send-stalled streams and try to resume as 979*6777b538SAndroid Build Coastguard Worker // many as possible. 980*6777b538SAndroid Build Coastguard Worker void ResumeSendStalledStreams(); 981*6777b538SAndroid Build Coastguard Worker 982*6777b538SAndroid Build Coastguard Worker // Returns the next stream to possibly resume, or 0 if the queue is 983*6777b538SAndroid Build Coastguard Worker // empty. 984*6777b538SAndroid Build Coastguard Worker spdy::SpdyStreamId PopStreamToPossiblyResume(); 985*6777b538SAndroid Build Coastguard Worker 986*6777b538SAndroid Build Coastguard Worker // Enables connection status monitoring, causing the session to periodically 987*6777b538SAndroid Build Coastguard Worker // send a PING frame. 988*6777b538SAndroid Build Coastguard Worker // This must be called at most once for each stream requiring it. If called, 989*6777b538SAndroid Build Coastguard Worker // MaybeDisableBrokenConnectionDetection() will need to be called before 990*6777b538SAndroid Build Coastguard Worker // closing the requesting stream. 991*6777b538SAndroid Build Coastguard Worker // Note: `heartbeat_interval` should be considered a suggestion. The 992*6777b538SAndroid Build Coastguard Worker // implementation, for example, could either: 993*6777b538SAndroid Build Coastguard Worker // * Avoid sending a PING, if one has recently been transmitted or is 994*6777b538SAndroid Build Coastguard Worker // already in flight 995*6777b538SAndroid Build Coastguard Worker // * Delay sending a PING, to avoid waking up the radio on mobile platforms 996*6777b538SAndroid Build Coastguard Worker // Only the first value of `heartbeat_interval` is taken into account. 997*6777b538SAndroid Build Coastguard Worker void EnableBrokenConnectionDetection(base::TimeDelta heartbeat_interval); 998*6777b538SAndroid Build Coastguard Worker 999*6777b538SAndroid Build Coastguard Worker // Requests to disable connection status monitoring. The service is disabled 1000*6777b538SAndroid Build Coastguard Worker // only if no other active stream also requires it (an internal counter keeps 1001*6777b538SAndroid Build Coastguard Worker // track of that). 1002*6777b538SAndroid Build Coastguard Worker // This must be called once for each stream that requested it previously. 1003*6777b538SAndroid Build Coastguard Worker void MaybeDisableBrokenConnectionDetection(); 1004*6777b538SAndroid Build Coastguard Worker 1005*6777b538SAndroid Build Coastguard Worker // Whether Do{Read,Write}Loop() is in the call stack. Useful for 1006*6777b538SAndroid Build Coastguard Worker // making sure we don't destroy ourselves prematurely in that case. 1007*6777b538SAndroid Build Coastguard Worker bool in_io_loop_ = false; 1008*6777b538SAndroid Build Coastguard Worker 1009*6777b538SAndroid Build Coastguard Worker // The key used to identify this session. 1010*6777b538SAndroid Build Coastguard Worker SpdySessionKey spdy_session_key_; 1011*6777b538SAndroid Build Coastguard Worker 1012*6777b538SAndroid Build Coastguard Worker // Set set of SpdySessionKeys for which this session has serviced 1013*6777b538SAndroid Build Coastguard Worker // requests. 1014*6777b538SAndroid Build Coastguard Worker std::set<SpdySessionKey> pooled_aliases_; 1015*6777b538SAndroid Build Coastguard Worker 1016*6777b538SAndroid Build Coastguard Worker // |pool_| owns us, therefore its lifetime must exceed ours. 1017*6777b538SAndroid Build Coastguard Worker raw_ptr<SpdySessionPool> pool_ = nullptr; 1018*6777b538SAndroid Build Coastguard Worker raw_ptr<HttpServerProperties> http_server_properties_; 1019*6777b538SAndroid Build Coastguard Worker 1020*6777b538SAndroid Build Coastguard Worker raw_ptr<TransportSecurityState> transport_security_state_; 1021*6777b538SAndroid Build Coastguard Worker raw_ptr<SSLConfigService> ssl_config_service_; 1022*6777b538SAndroid Build Coastguard Worker 1023*6777b538SAndroid Build Coastguard Worker // One of these two owns the socket for this session, which is stored in 1024*6777b538SAndroid Build Coastguard Worker // |socket_|. If |client_socket_handle_| is non-null, this session is on top 1025*6777b538SAndroid Build Coastguard Worker // of a socket in a socket pool. If |owned_stream_socket_| is non-null, this 1026*6777b538SAndroid Build Coastguard Worker // session is directly on top of a socket, which is not in a socket pool. 1027*6777b538SAndroid Build Coastguard Worker std::unique_ptr<ClientSocketHandle> client_socket_handle_; 1028*6777b538SAndroid Build Coastguard Worker std::unique_ptr<StreamSocket> owned_stream_socket_; 1029*6777b538SAndroid Build Coastguard Worker 1030*6777b538SAndroid Build Coastguard Worker // This is non-null only if |owned_stream_socket_| is non-null. 1031*6777b538SAndroid Build Coastguard Worker std::unique_ptr<LoadTimingInfo::ConnectTiming> connect_timing_; 1032*6777b538SAndroid Build Coastguard Worker 1033*6777b538SAndroid Build Coastguard Worker // The socket for this session. 1034*6777b538SAndroid Build Coastguard Worker raw_ptr<StreamSocket> socket_ = nullptr; 1035*6777b538SAndroid Build Coastguard Worker 1036*6777b538SAndroid Build Coastguard Worker // The read buffer used to read data from the socket. 1037*6777b538SAndroid Build Coastguard Worker // Non-null if there is a Read() pending. 1038*6777b538SAndroid Build Coastguard Worker scoped_refptr<IOBuffer> read_buffer_; 1039*6777b538SAndroid Build Coastguard Worker 1040*6777b538SAndroid Build Coastguard Worker spdy::SpdyStreamId stream_hi_water_mark_; // The next stream id to use. 1041*6777b538SAndroid Build Coastguard Worker 1042*6777b538SAndroid Build Coastguard Worker // Queue, for each priority, of pending stream requests that have 1043*6777b538SAndroid Build Coastguard Worker // not yet been satisfied. 1044*6777b538SAndroid Build Coastguard Worker PendingStreamRequestQueue pending_create_stream_queues_[NUM_PRIORITIES]; 1045*6777b538SAndroid Build Coastguard Worker 1046*6777b538SAndroid Build Coastguard Worker // Map from stream id to all active streams. Streams are active in the sense 1047*6777b538SAndroid Build Coastguard Worker // that they have a consumer (typically HttpNetworkTransaction and regardless 1048*6777b538SAndroid Build Coastguard Worker // of whether or not there is currently any ongoing IO) or there are still 1049*6777b538SAndroid Build Coastguard Worker // network events incoming even though the consumer has already gone away 1050*6777b538SAndroid Build Coastguard Worker // (cancellation). 1051*6777b538SAndroid Build Coastguard Worker // 1052*6777b538SAndroid Build Coastguard Worker // |active_streams_| owns all its SpdyStream objects. 1053*6777b538SAndroid Build Coastguard Worker // 1054*6777b538SAndroid Build Coastguard Worker // TODO(willchan): Perhaps we should separate out cancelled streams and move 1055*6777b538SAndroid Build Coastguard Worker // them into a separate ActiveStreamMap, and not deliver network events to 1056*6777b538SAndroid Build Coastguard Worker // them? 1057*6777b538SAndroid Build Coastguard Worker ActiveStreamMap active_streams_; 1058*6777b538SAndroid Build Coastguard Worker 1059*6777b538SAndroid Build Coastguard Worker // Set of all created streams but that have not yet sent any frames. 1060*6777b538SAndroid Build Coastguard Worker // 1061*6777b538SAndroid Build Coastguard Worker // |created_streams_| owns all its SpdyStream objects. 1062*6777b538SAndroid Build Coastguard Worker CreatedStreamSet created_streams_; 1063*6777b538SAndroid Build Coastguard Worker 1064*6777b538SAndroid Build Coastguard Worker // The write queue. 1065*6777b538SAndroid Build Coastguard Worker SpdyWriteQueue write_queue_; 1066*6777b538SAndroid Build Coastguard Worker 1067*6777b538SAndroid Build Coastguard Worker // Data for the frame we are currently sending. 1068*6777b538SAndroid Build Coastguard Worker 1069*6777b538SAndroid Build Coastguard Worker // The buffer we're currently writing. 1070*6777b538SAndroid Build Coastguard Worker std::unique_ptr<SpdyBuffer> in_flight_write_; 1071*6777b538SAndroid Build Coastguard Worker // The type of the frame in |in_flight_write_|. 1072*6777b538SAndroid Build Coastguard Worker spdy::SpdyFrameType in_flight_write_frame_type_ = spdy::SpdyFrameType::DATA; 1073*6777b538SAndroid Build Coastguard Worker // The size of the frame in |in_flight_write_|. 1074*6777b538SAndroid Build Coastguard Worker size_t in_flight_write_frame_size_ = 0; 1075*6777b538SAndroid Build Coastguard Worker // The stream to notify when |in_flight_write_| has been written to 1076*6777b538SAndroid Build Coastguard Worker // the socket completely. 1077*6777b538SAndroid Build Coastguard Worker base::WeakPtr<SpdyStream> in_flight_write_stream_; 1078*6777b538SAndroid Build Coastguard Worker 1079*6777b538SAndroid Build Coastguard Worker // Traffic annotation for the write in progress. 1080*6777b538SAndroid Build Coastguard Worker MutableNetworkTrafficAnnotationTag in_flight_write_traffic_annotation_; 1081*6777b538SAndroid Build Coastguard Worker 1082*6777b538SAndroid Build Coastguard Worker // Spdy Frame state. 1083*6777b538SAndroid Build Coastguard Worker std::unique_ptr<BufferedSpdyFramer> buffered_spdy_framer_; 1084*6777b538SAndroid Build Coastguard Worker 1085*6777b538SAndroid Build Coastguard Worker // The state variables. 1086*6777b538SAndroid Build Coastguard Worker AvailabilityState availability_state_ = STATE_AVAILABLE; 1087*6777b538SAndroid Build Coastguard Worker ReadState read_state_ = READ_STATE_DO_READ; 1088*6777b538SAndroid Build Coastguard Worker WriteState write_state_ = WRITE_STATE_IDLE; 1089*6777b538SAndroid Build Coastguard Worker 1090*6777b538SAndroid Build Coastguard Worker // If the session is closing (i.e., |availability_state_| is STATE_DRAINING), 1091*6777b538SAndroid Build Coastguard Worker // then |error_on_close_| holds the error with which it was closed, which 1092*6777b538SAndroid Build Coastguard Worker // may be OK (upon a polite GOAWAY) or an error < ERR_IO_PENDING otherwise. 1093*6777b538SAndroid Build Coastguard Worker // Initialized to OK. 1094*6777b538SAndroid Build Coastguard Worker Error error_on_close_ = OK; 1095*6777b538SAndroid Build Coastguard Worker 1096*6777b538SAndroid Build Coastguard Worker // Settings that are sent in the initial SETTINGS frame 1097*6777b538SAndroid Build Coastguard Worker // (if |enable_sending_initial_data_| is true), 1098*6777b538SAndroid Build Coastguard Worker // and also control SpdySession parameters like initial receive window size 1099*6777b538SAndroid Build Coastguard Worker // and maximum HPACK dynamic table size. 1100*6777b538SAndroid Build Coastguard Worker const spdy::SettingsMap initial_settings_; 1101*6777b538SAndroid Build Coastguard Worker 1102*6777b538SAndroid Build Coastguard Worker // If true, a setting parameter with reserved identifier will be sent in every 1103*6777b538SAndroid Build Coastguard Worker // initial SETTINGS frame, see 1104*6777b538SAndroid Build Coastguard Worker // https://tools.ietf.org/html/draft-bishop-httpbis-grease-00. 1105*6777b538SAndroid Build Coastguard Worker // The setting identifier and value will be drawn independently for each 1106*6777b538SAndroid Build Coastguard Worker // connection to prevent tracking of the client. 1107*6777b538SAndroid Build Coastguard Worker const bool enable_http2_settings_grease_; 1108*6777b538SAndroid Build Coastguard Worker 1109*6777b538SAndroid Build Coastguard Worker // If set, an HTTP/2 frame with a reserved frame type will be sent after 1110*6777b538SAndroid Build Coastguard Worker // every HTTP/2 SETTINGS frame and before every HTTP/2 DATA frame. See 1111*6777b538SAndroid Build Coastguard Worker // https://tools.ietf.org/html/draft-bishop-httpbis-grease-00. 1112*6777b538SAndroid Build Coastguard Worker const std::optional<SpdySessionPool::GreasedHttp2Frame> greased_http2_frame_; 1113*6777b538SAndroid Build Coastguard Worker 1114*6777b538SAndroid Build Coastguard Worker // If set, the HEADERS frame carrying a request without body will not have the 1115*6777b538SAndroid Build Coastguard Worker // END_STREAM flag set. The stream will be closed by a subsequent empty DATA 1116*6777b538SAndroid Build Coastguard Worker // frame with END_STREAM. Does not affect bidirectional or proxy streams. 1117*6777b538SAndroid Build Coastguard Worker // If unset, the HEADERS frame will have the END_STREAM flag set on. 1118*6777b538SAndroid Build Coastguard Worker // This is useful in conjuction with |greased_http2_frame_| so that a frame 1119*6777b538SAndroid Build Coastguard Worker // of reserved type can be sent out even on requests without a body. 1120*6777b538SAndroid Build Coastguard Worker const bool http2_end_stream_with_data_frame_; 1121*6777b538SAndroid Build Coastguard Worker 1122*6777b538SAndroid Build Coastguard Worker // If true, enable sending PRIORITY_UPDATE frames until SETTINGS frame 1123*6777b538SAndroid Build Coastguard Worker // arrives. After SETTINGS frame arrives, do not send PRIORITY_UPDATE frames 1124*6777b538SAndroid Build Coastguard Worker // any longer if SETTINGS_DEPRECATE_HTTP2_PRIORITIES is missing or has zero 0, 1125*6777b538SAndroid Build Coastguard Worker // but continue and also stop sending HTTP/2-style priority information in 1126*6777b538SAndroid Build Coastguard Worker // HEADERS frames and PRIORITY frames if it has value 1. 1127*6777b538SAndroid Build Coastguard Worker const bool enable_priority_update_; 1128*6777b538SAndroid Build Coastguard Worker 1129*6777b538SAndroid Build Coastguard Worker // The value of the last received SETTINGS_DEPRECATE_HTTP2_PRIORITIES, with 0 1130*6777b538SAndroid Build Coastguard Worker // mapping to false and 1 to true. Initial value is false. 1131*6777b538SAndroid Build Coastguard Worker bool deprecate_http2_priorities_ = false; 1132*6777b538SAndroid Build Coastguard Worker 1133*6777b538SAndroid Build Coastguard Worker // True if at least one SETTINGS frame has been received. 1134*6777b538SAndroid Build Coastguard Worker bool settings_frame_received_ = false; 1135*6777b538SAndroid Build Coastguard Worker 1136*6777b538SAndroid Build Coastguard Worker // The callbacks to notify a request that the handshake has been confirmed. 1137*6777b538SAndroid Build Coastguard Worker std::vector<CompletionOnceCallback> waiting_for_confirmation_callbacks_; 1138*6777b538SAndroid Build Coastguard Worker 1139*6777b538SAndroid Build Coastguard Worker // True if there is an ongoing handshake confirmation with outstanding 1140*6777b538SAndroid Build Coastguard Worker // requests. 1141*6777b538SAndroid Build Coastguard Worker bool in_confirm_handshake_ = false; 1142*6777b538SAndroid Build Coastguard Worker 1143*6777b538SAndroid Build Coastguard Worker // Limits 1144*6777b538SAndroid Build Coastguard Worker size_t max_concurrent_streams_; 1145*6777b538SAndroid Build Coastguard Worker 1146*6777b538SAndroid Build Coastguard Worker // Some statistics counters for the session. 1147*6777b538SAndroid Build Coastguard Worker int streams_initiated_count_ = 0; 1148*6777b538SAndroid Build Coastguard Worker 1149*6777b538SAndroid Build Coastguard Worker int streams_abandoned_count_ = 0; 1150*6777b538SAndroid Build Coastguard Worker 1151*6777b538SAndroid Build Coastguard Worker // True if there has been a ping sent for which we have not received a 1152*6777b538SAndroid Build Coastguard Worker // response yet. There is always at most one ping in flight. 1153*6777b538SAndroid Build Coastguard Worker bool ping_in_flight_ = false; 1154*6777b538SAndroid Build Coastguard Worker 1155*6777b538SAndroid Build Coastguard Worker // Triggers periodic connection status checks. 1156*6777b538SAndroid Build Coastguard Worker base::OneShotTimer heartbeat_timer_; 1157*6777b538SAndroid Build Coastguard Worker 1158*6777b538SAndroid Build Coastguard Worker // Period used by the connection status monitoring mechanism. 1159*6777b538SAndroid Build Coastguard Worker base::TimeDelta heartbeat_interval_; 1160*6777b538SAndroid Build Coastguard Worker 1161*6777b538SAndroid Build Coastguard Worker // True if the connection status should be checked once the radio wakes up. 1162*6777b538SAndroid Build Coastguard Worker bool check_connection_on_radio_wakeup_ = false; 1163*6777b538SAndroid Build Coastguard Worker 1164*6777b538SAndroid Build Coastguard Worker // This is the next ping_id (unique_id) to be sent in PING frame. 1165*6777b538SAndroid Build Coastguard Worker spdy::SpdyPingId next_ping_id_ = 1; 1166*6777b538SAndroid Build Coastguard Worker 1167*6777b538SAndroid Build Coastguard Worker // This is the last time we have sent a PING. 1168*6777b538SAndroid Build Coastguard Worker base::TimeTicks last_ping_sent_time_; 1169*6777b538SAndroid Build Coastguard Worker 1170*6777b538SAndroid Build Coastguard Worker // This is the last time we had read activity in the session. 1171*6777b538SAndroid Build Coastguard Worker base::TimeTicks last_read_time_; 1172*6777b538SAndroid Build Coastguard Worker 1173*6777b538SAndroid Build Coastguard Worker // This is the length of the last compressed frame. 1174*6777b538SAndroid Build Coastguard Worker size_t last_compressed_frame_len_ = 0; 1175*6777b538SAndroid Build Coastguard Worker 1176*6777b538SAndroid Build Coastguard Worker // True if there is a CheckPingStatus() task posted on the message loop. 1177*6777b538SAndroid Build Coastguard Worker bool check_ping_status_pending_ = false; 1178*6777b538SAndroid Build Coastguard Worker 1179*6777b538SAndroid Build Coastguard Worker // Current send window size. Zero unless session flow control is turned on. 1180*6777b538SAndroid Build Coastguard Worker int32_t session_send_window_size_ = 0; 1181*6777b538SAndroid Build Coastguard Worker 1182*6777b538SAndroid Build Coastguard Worker // Maximum receive window size. Each time a WINDOW_UPDATE is sent, it 1183*6777b538SAndroid Build Coastguard Worker // restores the receive window size to this value. Zero unless session flow 1184*6777b538SAndroid Build Coastguard Worker // control is turned on. 1185*6777b538SAndroid Build Coastguard Worker int32_t session_max_recv_window_size_; 1186*6777b538SAndroid Build Coastguard Worker 1187*6777b538SAndroid Build Coastguard Worker // Maximum number of capped frames that can be queued at any time. 1188*6777b538SAndroid Build Coastguard Worker // Every time we try to enqueue a capped frame, we check that there aren't 1189*6777b538SAndroid Build Coastguard Worker // more than this amount already queued, and close the connection if so. 1190*6777b538SAndroid Build Coastguard Worker int session_max_queued_capped_frames_; 1191*6777b538SAndroid Build Coastguard Worker 1192*6777b538SAndroid Build Coastguard Worker // Number of active requests which asked for connection status monitoring. 1193*6777b538SAndroid Build Coastguard Worker int broken_connection_detection_requests_ = 0; 1194*6777b538SAndroid Build Coastguard Worker 1195*6777b538SAndroid Build Coastguard Worker // Sum of |session_unacked_recv_window_bytes_| and current receive window 1196*6777b538SAndroid Build Coastguard Worker // size. Zero unless session flow control is turned on. 1197*6777b538SAndroid Build Coastguard Worker // TODO(bnc): Rename or change semantics so that |window_size_| is actual 1198*6777b538SAndroid Build Coastguard Worker // window size. 1199*6777b538SAndroid Build Coastguard Worker int32_t session_recv_window_size_ = 0; 1200*6777b538SAndroid Build Coastguard Worker 1201*6777b538SAndroid Build Coastguard Worker // When bytes are consumed, SpdyIOBuffer destructor calls back to SpdySession, 1202*6777b538SAndroid Build Coastguard Worker // and this member keeps count of them until the corresponding WINDOW_UPDATEs 1203*6777b538SAndroid Build Coastguard Worker // are sent. Zero unless session flow control is turned on. 1204*6777b538SAndroid Build Coastguard Worker int32_t session_unacked_recv_window_bytes_ = 0; 1205*6777b538SAndroid Build Coastguard Worker 1206*6777b538SAndroid Build Coastguard Worker // Time of the last WINDOW_UPDATE for the receive window. 1207*6777b538SAndroid Build Coastguard Worker base::TimeTicks last_recv_window_update_; 1208*6777b538SAndroid Build Coastguard Worker 1209*6777b538SAndroid Build Coastguard Worker // Time to accumilate small receive window updates for. 1210*6777b538SAndroid Build Coastguard Worker base::TimeDelta time_to_buffer_small_window_updates_; 1211*6777b538SAndroid Build Coastguard Worker 1212*6777b538SAndroid Build Coastguard Worker // Initial send window size for this session's streams. Can be 1213*6777b538SAndroid Build Coastguard Worker // changed by an arriving SETTINGS frame. Newly created streams use 1214*6777b538SAndroid Build Coastguard Worker // this value for the initial send window size. 1215*6777b538SAndroid Build Coastguard Worker int32_t stream_initial_send_window_size_; 1216*6777b538SAndroid Build Coastguard Worker 1217*6777b538SAndroid Build Coastguard Worker // The maximum HPACK dynamic table size the server is allowed to set. 1218*6777b538SAndroid Build Coastguard Worker uint32_t max_header_table_size_; 1219*6777b538SAndroid Build Coastguard Worker 1220*6777b538SAndroid Build Coastguard Worker // Initial receive window size for this session's streams. There are 1221*6777b538SAndroid Build Coastguard Worker // plans to add a command line switch that would cause a SETTINGS 1222*6777b538SAndroid Build Coastguard Worker // frame with window size announcement to be sent on startup. Newly 1223*6777b538SAndroid Build Coastguard Worker // created streams will use this value for the initial receive 1224*6777b538SAndroid Build Coastguard Worker // window size. 1225*6777b538SAndroid Build Coastguard Worker int32_t stream_max_recv_window_size_; 1226*6777b538SAndroid Build Coastguard Worker 1227*6777b538SAndroid Build Coastguard Worker // A queue of stream IDs that have been send-stalled at some point 1228*6777b538SAndroid Build Coastguard Worker // in the past. 1229*6777b538SAndroid Build Coastguard Worker base::circular_deque<spdy::SpdyStreamId> 1230*6777b538SAndroid Build Coastguard Worker stream_send_unstall_queue_[NUM_PRIORITIES]; 1231*6777b538SAndroid Build Coastguard Worker 1232*6777b538SAndroid Build Coastguard Worker NetLogWithSource net_log_; 1233*6777b538SAndroid Build Coastguard Worker 1234*6777b538SAndroid Build Coastguard Worker // Versions of QUIC which may be used. 1235*6777b538SAndroid Build Coastguard Worker const quic::ParsedQuicVersionVector quic_supported_versions_; 1236*6777b538SAndroid Build Coastguard Worker 1237*6777b538SAndroid Build Coastguard Worker // Outside of tests, these should always be true. 1238*6777b538SAndroid Build Coastguard Worker const bool enable_sending_initial_data_; 1239*6777b538SAndroid Build Coastguard Worker const bool enable_ping_based_connection_checking_; 1240*6777b538SAndroid Build Coastguard Worker 1241*6777b538SAndroid Build Coastguard Worker const bool is_http2_enabled_; 1242*6777b538SAndroid Build Coastguard Worker const bool is_quic_enabled_; 1243*6777b538SAndroid Build Coastguard Worker 1244*6777b538SAndroid Build Coastguard Worker // True if the server has advertised WebSocket support via 1245*6777b538SAndroid Build Coastguard Worker // spdy::SETTINGS_ENABLE_CONNECT_PROTOCOL, see 1246*6777b538SAndroid Build Coastguard Worker // https://tools.ietf.org/html/draft-ietf-httpbis-h2-websockets-00. 1247*6777b538SAndroid Build Coastguard Worker bool support_websocket_ = false; 1248*6777b538SAndroid Build Coastguard Worker 1249*6777b538SAndroid Build Coastguard Worker // |connection_at_risk_of_loss_time_| is an optimization to avoid sending 1250*6777b538SAndroid Build Coastguard Worker // wasteful preface pings (when we just got some data). 1251*6777b538SAndroid Build Coastguard Worker // 1252*6777b538SAndroid Build Coastguard Worker // If it is zero (the most conservative figure), then we always send the 1253*6777b538SAndroid Build Coastguard Worker // preface ping (when none are in flight). 1254*6777b538SAndroid Build Coastguard Worker // 1255*6777b538SAndroid Build Coastguard Worker // It is common for TCP/IP sessions to time out in about 3-5 minutes. 1256*6777b538SAndroid Build Coastguard Worker // Certainly if it has been more than 3 minutes, we do want to send a preface 1257*6777b538SAndroid Build Coastguard Worker // ping. 1258*6777b538SAndroid Build Coastguard Worker // 1259*6777b538SAndroid Build Coastguard Worker // We don't think any connection will time out in under about 10 seconds. So 1260*6777b538SAndroid Build Coastguard Worker // this might as well be set to something conservative like 10 seconds. Later, 1261*6777b538SAndroid Build Coastguard Worker // we could adjust it to send fewer pings perhaps. 1262*6777b538SAndroid Build Coastguard Worker base::TimeDelta connection_at_risk_of_loss_time_; 1263*6777b538SAndroid Build Coastguard Worker 1264*6777b538SAndroid Build Coastguard Worker // The amount of time that we are willing to tolerate with no activity (of any 1265*6777b538SAndroid Build Coastguard Worker // form), while there is a ping in flight, before we declare the connection to 1266*6777b538SAndroid Build Coastguard Worker // be hung. TODO(rtenneti): When hung, instead of resetting connection, race 1267*6777b538SAndroid Build Coastguard Worker // to build a new connection, and see if that completes before we (finally) 1268*6777b538SAndroid Build Coastguard Worker // get a PING response (http://crbug.com/127812). 1269*6777b538SAndroid Build Coastguard Worker base::TimeDelta hung_interval_; 1270*6777b538SAndroid Build Coastguard Worker 1271*6777b538SAndroid Build Coastguard Worker TimeFunc time_func_; 1272*6777b538SAndroid Build Coastguard Worker 1273*6777b538SAndroid Build Coastguard Worker Http2PriorityDependencies priority_dependency_state_; 1274*6777b538SAndroid Build Coastguard Worker 1275*6777b538SAndroid Build Coastguard Worker // Map of origin to Accept-CH header field values received via ALPS. 1276*6777b538SAndroid Build Coastguard Worker base::flat_map<url::SchemeHostPort, std::string> 1277*6777b538SAndroid Build Coastguard Worker accept_ch_entries_received_via_alps_; 1278*6777b538SAndroid Build Coastguard Worker 1279*6777b538SAndroid Build Coastguard Worker // Network quality estimator to which the ping RTTs should be reported. May be 1280*6777b538SAndroid Build Coastguard Worker // nullptr. 1281*6777b538SAndroid Build Coastguard Worker raw_ptr<NetworkQualityEstimator> network_quality_estimator_; 1282*6777b538SAndroid Build Coastguard Worker 1283*6777b538SAndroid Build Coastguard Worker // Used for accessing the SpdySession from asynchronous tasks. An asynchronous 1284*6777b538SAndroid Build Coastguard Worker // must check if its WeakPtr<SpdySession> is valid before accessing it, to 1285*6777b538SAndroid Build Coastguard Worker // correctly handle the case where it became unavailable and was deleted. 1286*6777b538SAndroid Build Coastguard Worker base::WeakPtrFactory<SpdySession> weak_factory_{this}; 1287*6777b538SAndroid Build Coastguard Worker }; 1288*6777b538SAndroid Build Coastguard Worker 1289*6777b538SAndroid Build Coastguard Worker } // namespace net 1290*6777b538SAndroid Build Coastguard Worker 1291*6777b538SAndroid Build Coastguard Worker #endif // NET_SPDY_SPDY_SESSION_H_ 1292