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_BUFFERED_SPDY_FRAMER_H_ 6*6777b538SAndroid Build Coastguard Worker #define NET_SPDY_BUFFERED_SPDY_FRAMER_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 <memory> 12*6777b538SAndroid Build Coastguard Worker #include <string> 13*6777b538SAndroid Build Coastguard Worker #include <string_view> 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h" 16*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h" 17*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h" 18*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log_source.h" 19*6777b538SAndroid Build Coastguard Worker #include "net/spdy/header_coalescer.h" 20*6777b538SAndroid Build Coastguard Worker #include "net/third_party/quiche/src/quiche/spdy/core/http2_frame_decoder_adapter.h" 21*6777b538SAndroid Build Coastguard Worker #include "net/third_party/quiche/src/quiche/spdy/core/http2_header_block.h" 22*6777b538SAndroid Build Coastguard Worker #include "net/third_party/quiche/src/quiche/spdy/core/spdy_alt_svc_wire_format.h" 23*6777b538SAndroid Build Coastguard Worker #include "net/third_party/quiche/src/quiche/spdy/core/spdy_framer.h" 24*6777b538SAndroid Build Coastguard Worker #include "net/third_party/quiche/src/quiche/spdy/core/spdy_protocol.h" 25*6777b538SAndroid Build Coastguard Worker 26*6777b538SAndroid Build Coastguard Worker namespace net { 27*6777b538SAndroid Build Coastguard Worker 28*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE BufferedSpdyFramerVisitorInterface { 29*6777b538SAndroid Build Coastguard Worker public: 30*6777b538SAndroid Build Coastguard Worker BufferedSpdyFramerVisitorInterface() = default; 31*6777b538SAndroid Build Coastguard Worker 32*6777b538SAndroid Build Coastguard Worker BufferedSpdyFramerVisitorInterface( 33*6777b538SAndroid Build Coastguard Worker const BufferedSpdyFramerVisitorInterface&) = delete; 34*6777b538SAndroid Build Coastguard Worker BufferedSpdyFramerVisitorInterface& operator=( 35*6777b538SAndroid Build Coastguard Worker const BufferedSpdyFramerVisitorInterface&) = delete; 36*6777b538SAndroid Build Coastguard Worker 37*6777b538SAndroid Build Coastguard Worker // Called if an error is detected in the spdy::SpdySerializedFrame protocol. 38*6777b538SAndroid Build Coastguard Worker virtual void OnError( 39*6777b538SAndroid Build Coastguard Worker http2::Http2DecoderAdapter::SpdyFramerError spdy_framer_error) = 0; 40*6777b538SAndroid Build Coastguard Worker 41*6777b538SAndroid Build Coastguard Worker // Called if an error is detected in a HTTP2 stream. 42*6777b538SAndroid Build Coastguard Worker virtual void OnStreamError(spdy::SpdyStreamId stream_id, 43*6777b538SAndroid Build Coastguard Worker const std::string& description) = 0; 44*6777b538SAndroid Build Coastguard Worker 45*6777b538SAndroid Build Coastguard Worker // Called after all the header data for HEADERS control frame is received. 46*6777b538SAndroid Build Coastguard Worker virtual void OnHeaders(spdy::SpdyStreamId stream_id, 47*6777b538SAndroid Build Coastguard Worker bool has_priority, 48*6777b538SAndroid Build Coastguard Worker int weight, 49*6777b538SAndroid Build Coastguard Worker spdy::SpdyStreamId parent_stream_id, 50*6777b538SAndroid Build Coastguard Worker bool exclusive, 51*6777b538SAndroid Build Coastguard Worker bool fin, 52*6777b538SAndroid Build Coastguard Worker spdy::Http2HeaderBlock headers, 53*6777b538SAndroid Build Coastguard Worker base::TimeTicks recv_first_byte_time) = 0; 54*6777b538SAndroid Build Coastguard Worker 55*6777b538SAndroid Build Coastguard Worker // Called when a data frame header is received. 56*6777b538SAndroid Build Coastguard Worker virtual void OnDataFrameHeader(spdy::SpdyStreamId stream_id, 57*6777b538SAndroid Build Coastguard Worker size_t length, 58*6777b538SAndroid Build Coastguard Worker bool fin) = 0; 59*6777b538SAndroid Build Coastguard Worker 60*6777b538SAndroid Build Coastguard Worker // Called when data is received. 61*6777b538SAndroid Build Coastguard Worker // |stream_id| The stream receiving data. 62*6777b538SAndroid Build Coastguard Worker // |data| A buffer containing the data received. 63*6777b538SAndroid Build Coastguard Worker // |len| The length of the data buffer (at most 2^16 - 1 - 8). 64*6777b538SAndroid Build Coastguard Worker virtual void OnStreamFrameData(spdy::SpdyStreamId stream_id, 65*6777b538SAndroid Build Coastguard Worker const char* data, 66*6777b538SAndroid Build Coastguard Worker size_t len) = 0; 67*6777b538SAndroid Build Coastguard Worker 68*6777b538SAndroid Build Coastguard Worker // Called when the other side has finished sending data on this stream. 69*6777b538SAndroid Build Coastguard Worker // |stream_id| The stream that was receivin data. 70*6777b538SAndroid Build Coastguard Worker virtual void OnStreamEnd(spdy::SpdyStreamId stream_id) = 0; 71*6777b538SAndroid Build Coastguard Worker 72*6777b538SAndroid Build Coastguard Worker // Called when padding is received (padding length field or padding octets). 73*6777b538SAndroid Build Coastguard Worker // |stream_id| The stream receiving data. 74*6777b538SAndroid Build Coastguard Worker // |len| The number of padding octets. 75*6777b538SAndroid Build Coastguard Worker virtual void OnStreamPadding(spdy::SpdyStreamId stream_id, size_t len) = 0; 76*6777b538SAndroid Build Coastguard Worker 77*6777b538SAndroid Build Coastguard Worker // Called when a SETTINGS frame is received. 78*6777b538SAndroid Build Coastguard Worker virtual void OnSettings() = 0; 79*6777b538SAndroid Build Coastguard Worker 80*6777b538SAndroid Build Coastguard Worker // Called when an individual setting within a SETTINGS frame has been parsed. 81*6777b538SAndroid Build Coastguard Worker // Note that |id| may or may not be a SETTINGS ID defined in the HTTP/2 spec. 82*6777b538SAndroid Build Coastguard Worker virtual void OnSetting(spdy::SpdySettingsId id, uint32_t value) = 0; 83*6777b538SAndroid Build Coastguard Worker 84*6777b538SAndroid Build Coastguard Worker // Called when a SETTINGS frame is received with the ACK flag set. 85*6777b538SAndroid Build Coastguard Worker virtual void OnSettingsAck() = 0; 86*6777b538SAndroid Build Coastguard Worker 87*6777b538SAndroid Build Coastguard Worker // Called at the completion of parsing SETTINGS id and value tuples. 88*6777b538SAndroid Build Coastguard Worker virtual void OnSettingsEnd() = 0; 89*6777b538SAndroid Build Coastguard Worker 90*6777b538SAndroid Build Coastguard Worker // Called when a PING frame has been parsed. 91*6777b538SAndroid Build Coastguard Worker virtual void OnPing(spdy::SpdyPingId unique_id, bool is_ack) = 0; 92*6777b538SAndroid Build Coastguard Worker 93*6777b538SAndroid Build Coastguard Worker // Called when a RST_STREAM frame has been parsed. 94*6777b538SAndroid Build Coastguard Worker virtual void OnRstStream(spdy::SpdyStreamId stream_id, 95*6777b538SAndroid Build Coastguard Worker spdy::SpdyErrorCode error_code) = 0; 96*6777b538SAndroid Build Coastguard Worker 97*6777b538SAndroid Build Coastguard Worker // Called when a GOAWAY frame has been parsed. 98*6777b538SAndroid Build Coastguard Worker virtual void OnGoAway(spdy::SpdyStreamId last_accepted_stream_id, 99*6777b538SAndroid Build Coastguard Worker spdy::SpdyErrorCode error_code, 100*6777b538SAndroid Build Coastguard Worker std::string_view debug_data) = 0; 101*6777b538SAndroid Build Coastguard Worker 102*6777b538SAndroid Build Coastguard Worker // Called when a WINDOW_UPDATE frame has been parsed. 103*6777b538SAndroid Build Coastguard Worker virtual void OnWindowUpdate(spdy::SpdyStreamId stream_id, 104*6777b538SAndroid Build Coastguard Worker int delta_window_size) = 0; 105*6777b538SAndroid Build Coastguard Worker 106*6777b538SAndroid Build Coastguard Worker // Called when a PUSH_PROMISE frame has been parsed. 107*6777b538SAndroid Build Coastguard Worker virtual void OnPushPromise(spdy::SpdyStreamId stream_id, 108*6777b538SAndroid Build Coastguard Worker spdy::SpdyStreamId promised_stream_id, 109*6777b538SAndroid Build Coastguard Worker spdy::Http2HeaderBlock headers) = 0; 110*6777b538SAndroid Build Coastguard Worker 111*6777b538SAndroid Build Coastguard Worker // Called when an ALTSVC frame has been parsed. 112*6777b538SAndroid Build Coastguard Worker virtual void OnAltSvc( 113*6777b538SAndroid Build Coastguard Worker spdy::SpdyStreamId stream_id, 114*6777b538SAndroid Build Coastguard Worker std::string_view origin, 115*6777b538SAndroid Build Coastguard Worker const spdy::SpdyAltSvcWireFormat::AlternativeServiceVector& 116*6777b538SAndroid Build Coastguard Worker altsvc_vector) = 0; 117*6777b538SAndroid Build Coastguard Worker 118*6777b538SAndroid Build Coastguard Worker // Called when a frame type we don't recognize is received. 119*6777b538SAndroid Build Coastguard Worker // Return true if this appears to be a valid extension frame, false otherwise. 120*6777b538SAndroid Build Coastguard Worker // We distinguish between extension frames and nonsense by checking 121*6777b538SAndroid Build Coastguard Worker // whether the stream id is valid. 122*6777b538SAndroid Build Coastguard Worker virtual bool OnUnknownFrame(spdy::SpdyStreamId stream_id, 123*6777b538SAndroid Build Coastguard Worker uint8_t frame_type) = 0; 124*6777b538SAndroid Build Coastguard Worker 125*6777b538SAndroid Build Coastguard Worker protected: 126*6777b538SAndroid Build Coastguard Worker virtual ~BufferedSpdyFramerVisitorInterface() = default; 127*6777b538SAndroid Build Coastguard Worker }; 128*6777b538SAndroid Build Coastguard Worker 129*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE BufferedSpdyFramer 130*6777b538SAndroid Build Coastguard Worker : public spdy::SpdyFramerVisitorInterface { 131*6777b538SAndroid Build Coastguard Worker public: 132*6777b538SAndroid Build Coastguard Worker using TimeFunc = base::TimeTicks (*)(); 133*6777b538SAndroid Build Coastguard Worker 134*6777b538SAndroid Build Coastguard Worker BufferedSpdyFramer(uint32_t max_header_list_size, 135*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& net_log, 136*6777b538SAndroid Build Coastguard Worker TimeFunc time_func = base::TimeTicks::Now); 137*6777b538SAndroid Build Coastguard Worker BufferedSpdyFramer() = delete; 138*6777b538SAndroid Build Coastguard Worker 139*6777b538SAndroid Build Coastguard Worker BufferedSpdyFramer(const BufferedSpdyFramer&) = delete; 140*6777b538SAndroid Build Coastguard Worker BufferedSpdyFramer& operator=(const BufferedSpdyFramer&) = delete; 141*6777b538SAndroid Build Coastguard Worker 142*6777b538SAndroid Build Coastguard Worker ~BufferedSpdyFramer() override; 143*6777b538SAndroid Build Coastguard Worker 144*6777b538SAndroid Build Coastguard Worker // Sets callbacks to be called from the buffered spdy framer. A visitor must 145*6777b538SAndroid Build Coastguard Worker // be set, or else the framer will likely crash. It is acceptable for the 146*6777b538SAndroid Build Coastguard Worker // visitor to do nothing. If this is called multiple times, only the last 147*6777b538SAndroid Build Coastguard Worker // visitor will be used. 148*6777b538SAndroid Build Coastguard Worker void set_visitor(BufferedSpdyFramerVisitorInterface* visitor); 149*6777b538SAndroid Build Coastguard Worker 150*6777b538SAndroid Build Coastguard Worker // Set debug callbacks to be called from the framer. The debug visitor is 151*6777b538SAndroid Build Coastguard Worker // completely optional and need not be set in order for normal operation. 152*6777b538SAndroid Build Coastguard Worker // If this is called multiple times, only the last visitor will be used. 153*6777b538SAndroid Build Coastguard Worker void set_debug_visitor(spdy::SpdyFramerDebugVisitorInterface* debug_visitor); 154*6777b538SAndroid Build Coastguard Worker 155*6777b538SAndroid Build Coastguard Worker // spdy::SpdyFramerVisitorInterface 156*6777b538SAndroid Build Coastguard Worker void OnError(http2::Http2DecoderAdapter::SpdyFramerError spdy_framer_error, 157*6777b538SAndroid Build Coastguard Worker std::string detailed_error) override; 158*6777b538SAndroid Build Coastguard Worker void OnHeaders(spdy::SpdyStreamId stream_id, 159*6777b538SAndroid Build Coastguard Worker size_t payload_length, 160*6777b538SAndroid Build Coastguard Worker bool has_priority, 161*6777b538SAndroid Build Coastguard Worker int weight, 162*6777b538SAndroid Build Coastguard Worker spdy::SpdyStreamId parent_stream_id, 163*6777b538SAndroid Build Coastguard Worker bool exclusive, 164*6777b538SAndroid Build Coastguard Worker bool fin, 165*6777b538SAndroid Build Coastguard Worker bool end) override; 166*6777b538SAndroid Build Coastguard Worker void OnStreamFrameData(spdy::SpdyStreamId stream_id, 167*6777b538SAndroid Build Coastguard Worker const char* data, 168*6777b538SAndroid Build Coastguard Worker size_t len) override; 169*6777b538SAndroid Build Coastguard Worker void OnStreamEnd(spdy::SpdyStreamId stream_id) override; 170*6777b538SAndroid Build Coastguard Worker void OnStreamPadLength(spdy::SpdyStreamId stream_id, size_t value) override; 171*6777b538SAndroid Build Coastguard Worker void OnStreamPadding(spdy::SpdyStreamId stream_id, size_t len) override; 172*6777b538SAndroid Build Coastguard Worker spdy::SpdyHeadersHandlerInterface* OnHeaderFrameStart( 173*6777b538SAndroid Build Coastguard Worker spdy::SpdyStreamId stream_id) override; 174*6777b538SAndroid Build Coastguard Worker void OnHeaderFrameEnd(spdy::SpdyStreamId stream_id) override; 175*6777b538SAndroid Build Coastguard Worker void OnSettings() override; 176*6777b538SAndroid Build Coastguard Worker void OnSetting(spdy::SpdySettingsId id, uint32_t value) override; 177*6777b538SAndroid Build Coastguard Worker void OnSettingsAck() override; 178*6777b538SAndroid Build Coastguard Worker void OnSettingsEnd() override; 179*6777b538SAndroid Build Coastguard Worker void OnPing(spdy::SpdyPingId unique_id, bool is_ack) override; 180*6777b538SAndroid Build Coastguard Worker void OnRstStream(spdy::SpdyStreamId stream_id, 181*6777b538SAndroid Build Coastguard Worker spdy::SpdyErrorCode error_code) override; 182*6777b538SAndroid Build Coastguard Worker void OnGoAway(spdy::SpdyStreamId last_accepted_stream_id, 183*6777b538SAndroid Build Coastguard Worker spdy::SpdyErrorCode error_code) override; 184*6777b538SAndroid Build Coastguard Worker bool OnGoAwayFrameData(const char* goaway_data, size_t len) override; 185*6777b538SAndroid Build Coastguard Worker void OnWindowUpdate(spdy::SpdyStreamId stream_id, 186*6777b538SAndroid Build Coastguard Worker int delta_window_size) override; 187*6777b538SAndroid Build Coastguard Worker void OnPushPromise(spdy::SpdyStreamId stream_id, 188*6777b538SAndroid Build Coastguard Worker spdy::SpdyStreamId promised_stream_id, 189*6777b538SAndroid Build Coastguard Worker bool end) override; 190*6777b538SAndroid Build Coastguard Worker void OnAltSvc(spdy::SpdyStreamId stream_id, 191*6777b538SAndroid Build Coastguard Worker std::string_view origin, 192*6777b538SAndroid Build Coastguard Worker const spdy::SpdyAltSvcWireFormat::AlternativeServiceVector& 193*6777b538SAndroid Build Coastguard Worker altsvc_vector) override; 194*6777b538SAndroid Build Coastguard Worker void OnDataFrameHeader(spdy::SpdyStreamId stream_id, 195*6777b538SAndroid Build Coastguard Worker size_t length, 196*6777b538SAndroid Build Coastguard Worker bool fin) override; 197*6777b538SAndroid Build Coastguard Worker void OnContinuation(spdy::SpdyStreamId stream_id, 198*6777b538SAndroid Build Coastguard Worker size_t payload_length, 199*6777b538SAndroid Build Coastguard Worker bool end) override; OnPriority(spdy::SpdyStreamId stream_id,spdy::SpdyStreamId parent_stream_id,int weight,bool exclusive)200*6777b538SAndroid Build Coastguard Worker void OnPriority(spdy::SpdyStreamId stream_id, 201*6777b538SAndroid Build Coastguard Worker spdy::SpdyStreamId parent_stream_id, 202*6777b538SAndroid Build Coastguard Worker int weight, 203*6777b538SAndroid Build Coastguard Worker bool exclusive) override {} OnPriorityUpdate(spdy::SpdyStreamId prioritized_stream_id,std::string_view priority_field_value)204*6777b538SAndroid Build Coastguard Worker void OnPriorityUpdate(spdy::SpdyStreamId prioritized_stream_id, 205*6777b538SAndroid Build Coastguard Worker std::string_view priority_field_value) override {} 206*6777b538SAndroid Build Coastguard Worker bool OnUnknownFrame(spdy::SpdyStreamId stream_id, 207*6777b538SAndroid Build Coastguard Worker uint8_t frame_type) override; OnUnknownFrameStart(spdy::SpdyStreamId stream_id,size_t length,uint8_t type,uint8_t flags)208*6777b538SAndroid Build Coastguard Worker void OnUnknownFrameStart(spdy::SpdyStreamId stream_id, 209*6777b538SAndroid Build Coastguard Worker size_t length, 210*6777b538SAndroid Build Coastguard Worker uint8_t type, 211*6777b538SAndroid Build Coastguard Worker uint8_t flags) override {} OnUnknownFramePayload(spdy::SpdyStreamId stream_id,std::string_view payload)212*6777b538SAndroid Build Coastguard Worker void OnUnknownFramePayload(spdy::SpdyStreamId stream_id, 213*6777b538SAndroid Build Coastguard Worker std::string_view payload) override {} 214*6777b538SAndroid Build Coastguard Worker 215*6777b538SAndroid Build Coastguard Worker // spdy::SpdyFramer methods. 216*6777b538SAndroid Build Coastguard Worker size_t ProcessInput(const char* data, size_t len); 217*6777b538SAndroid Build Coastguard Worker void UpdateHeaderDecoderTableSize(uint32_t value); 218*6777b538SAndroid Build Coastguard Worker http2::Http2DecoderAdapter::SpdyFramerError spdy_framer_error() const; 219*6777b538SAndroid Build Coastguard Worker http2::Http2DecoderAdapter::SpdyState state() const; 220*6777b538SAndroid Build Coastguard Worker bool MessageFullyRead(); 221*6777b538SAndroid Build Coastguard Worker bool HasError(); 222*6777b538SAndroid Build Coastguard Worker std::unique_ptr<spdy::SpdySerializedFrame> CreateRstStream( 223*6777b538SAndroid Build Coastguard Worker spdy::SpdyStreamId stream_id, 224*6777b538SAndroid Build Coastguard Worker spdy::SpdyErrorCode error_code) const; 225*6777b538SAndroid Build Coastguard Worker std::unique_ptr<spdy::SpdySerializedFrame> CreateSettings( 226*6777b538SAndroid Build Coastguard Worker const spdy::SettingsMap& values) const; 227*6777b538SAndroid Build Coastguard Worker std::unique_ptr<spdy::SpdySerializedFrame> CreatePingFrame( 228*6777b538SAndroid Build Coastguard Worker spdy::SpdyPingId unique_id, 229*6777b538SAndroid Build Coastguard Worker bool is_ack) const; 230*6777b538SAndroid Build Coastguard Worker std::unique_ptr<spdy::SpdySerializedFrame> CreateWindowUpdate( 231*6777b538SAndroid Build Coastguard Worker spdy::SpdyStreamId stream_id, 232*6777b538SAndroid Build Coastguard Worker uint32_t delta_window_size) const; 233*6777b538SAndroid Build Coastguard Worker std::unique_ptr<spdy::SpdySerializedFrame> CreateDataFrame( 234*6777b538SAndroid Build Coastguard Worker spdy::SpdyStreamId stream_id, 235*6777b538SAndroid Build Coastguard Worker const char* data, 236*6777b538SAndroid Build Coastguard Worker uint32_t len, 237*6777b538SAndroid Build Coastguard Worker spdy::SpdyDataFlags flags); 238*6777b538SAndroid Build Coastguard Worker std::unique_ptr<spdy::SpdySerializedFrame> CreatePriority( 239*6777b538SAndroid Build Coastguard Worker spdy::SpdyStreamId stream_id, 240*6777b538SAndroid Build Coastguard Worker spdy::SpdyStreamId dependency_id, 241*6777b538SAndroid Build Coastguard Worker int weight, 242*6777b538SAndroid Build Coastguard Worker bool exclusive) const; 243*6777b538SAndroid Build Coastguard Worker 244*6777b538SAndroid Build Coastguard Worker // Serialize a frame of unknown type. SerializeFrame(const spdy::SpdyFrameIR & frame)245*6777b538SAndroid Build Coastguard Worker spdy::SpdySerializedFrame SerializeFrame(const spdy::SpdyFrameIR& frame) { 246*6777b538SAndroid Build Coastguard Worker return spdy_framer_.SerializeFrame(frame); 247*6777b538SAndroid Build Coastguard Worker } 248*6777b538SAndroid Build Coastguard Worker frames_received()249*6777b538SAndroid Build Coastguard Worker int frames_received() const { return frames_received_; } 250*6777b538SAndroid Build Coastguard Worker 251*6777b538SAndroid Build Coastguard Worker // Updates the maximum size of the header encoder compression table. 252*6777b538SAndroid Build Coastguard Worker void UpdateHeaderEncoderTableSize(uint32_t value); 253*6777b538SAndroid Build Coastguard Worker // Returns the maximum size of the header encoder compression table. 254*6777b538SAndroid Build Coastguard Worker uint32_t header_encoder_table_size() const; 255*6777b538SAndroid Build Coastguard Worker 256*6777b538SAndroid Build Coastguard Worker private: 257*6777b538SAndroid Build Coastguard Worker spdy::SpdyFramer spdy_framer_; 258*6777b538SAndroid Build Coastguard Worker http2::Http2DecoderAdapter deframer_; 259*6777b538SAndroid Build Coastguard Worker raw_ptr<BufferedSpdyFramerVisitorInterface> visitor_ = nullptr; 260*6777b538SAndroid Build Coastguard Worker 261*6777b538SAndroid Build Coastguard Worker int frames_received_ = 0; 262*6777b538SAndroid Build Coastguard Worker 263*6777b538SAndroid Build Coastguard Worker // Collection of fields from control frames that we need to 264*6777b538SAndroid Build Coastguard Worker // buffer up from the spdy framer. 265*6777b538SAndroid Build Coastguard Worker struct ControlFrameFields { 266*6777b538SAndroid Build Coastguard Worker ControlFrameFields(); 267*6777b538SAndroid Build Coastguard Worker 268*6777b538SAndroid Build Coastguard Worker spdy::SpdyFrameType type; 269*6777b538SAndroid Build Coastguard Worker spdy::SpdyStreamId stream_id = 0U; 270*6777b538SAndroid Build Coastguard Worker spdy::SpdyStreamId associated_stream_id = 0U; 271*6777b538SAndroid Build Coastguard Worker spdy::SpdyStreamId promised_stream_id = 0U; 272*6777b538SAndroid Build Coastguard Worker bool has_priority = false; 273*6777b538SAndroid Build Coastguard Worker spdy::SpdyPriority priority = 0U; 274*6777b538SAndroid Build Coastguard Worker int weight = 0; 275*6777b538SAndroid Build Coastguard Worker spdy::SpdyStreamId parent_stream_id = 0U; 276*6777b538SAndroid Build Coastguard Worker bool exclusive = false; 277*6777b538SAndroid Build Coastguard Worker bool fin = false; 278*6777b538SAndroid Build Coastguard Worker bool unidirectional = false; 279*6777b538SAndroid Build Coastguard Worker base::TimeTicks recv_first_byte_time; 280*6777b538SAndroid Build Coastguard Worker }; 281*6777b538SAndroid Build Coastguard Worker std::unique_ptr<ControlFrameFields> control_frame_fields_; 282*6777b538SAndroid Build Coastguard Worker 283*6777b538SAndroid Build Coastguard Worker // Collection of fields of a GOAWAY frame that this class needs to buffer. 284*6777b538SAndroid Build Coastguard Worker struct GoAwayFields { 285*6777b538SAndroid Build Coastguard Worker spdy::SpdyStreamId last_accepted_stream_id; 286*6777b538SAndroid Build Coastguard Worker spdy::SpdyErrorCode error_code; 287*6777b538SAndroid Build Coastguard Worker std::string debug_data; 288*6777b538SAndroid Build Coastguard Worker }; 289*6777b538SAndroid Build Coastguard Worker std::unique_ptr<GoAwayFields> goaway_fields_; 290*6777b538SAndroid Build Coastguard Worker 291*6777b538SAndroid Build Coastguard Worker std::unique_ptr<HeaderCoalescer> coalescer_; 292*6777b538SAndroid Build Coastguard Worker 293*6777b538SAndroid Build Coastguard Worker const uint32_t max_header_list_size_; 294*6777b538SAndroid Build Coastguard Worker NetLogWithSource net_log_; 295*6777b538SAndroid Build Coastguard Worker TimeFunc time_func_; 296*6777b538SAndroid Build Coastguard Worker }; 297*6777b538SAndroid Build Coastguard Worker 298*6777b538SAndroid Build Coastguard Worker } // namespace net 299*6777b538SAndroid Build Coastguard Worker 300*6777b538SAndroid Build Coastguard Worker #endif // NET_SPDY_BUFFERED_SPDY_FRAMER_H_ 301