xref: /aosp_15_r20/external/cronet/net/spdy/buffered_spdy_framer.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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