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 #include "net/spdy/buffered_spdy_framer.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <algorithm>
8*6777b538SAndroid Build Coastguard Worker #include <utility>
9*6777b538SAndroid Build Coastguard Worker
10*6777b538SAndroid Build Coastguard Worker #include "base/check.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_util.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/trace_event/memory_usage_estimator.h"
13*6777b538SAndroid Build Coastguard Worker
14*6777b538SAndroid Build Coastguard Worker namespace net {
15*6777b538SAndroid Build Coastguard Worker
16*6777b538SAndroid Build Coastguard Worker namespace {
17*6777b538SAndroid Build Coastguard Worker
18*6777b538SAndroid Build Coastguard Worker // GOAWAY frame debug data is only buffered up to this many bytes.
19*6777b538SAndroid Build Coastguard Worker size_t kGoAwayDebugDataMaxSize = 1024;
20*6777b538SAndroid Build Coastguard Worker
21*6777b538SAndroid Build Coastguard Worker } // namespace
22*6777b538SAndroid Build Coastguard Worker
BufferedSpdyFramer(uint32_t max_header_list_size,const NetLogWithSource & net_log,TimeFunc time_func)23*6777b538SAndroid Build Coastguard Worker BufferedSpdyFramer::BufferedSpdyFramer(uint32_t max_header_list_size,
24*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& net_log,
25*6777b538SAndroid Build Coastguard Worker TimeFunc time_func)
26*6777b538SAndroid Build Coastguard Worker : spdy_framer_(spdy::SpdyFramer::ENABLE_COMPRESSION),
27*6777b538SAndroid Build Coastguard Worker max_header_list_size_(max_header_list_size),
28*6777b538SAndroid Build Coastguard Worker net_log_(net_log),
29*6777b538SAndroid Build Coastguard Worker time_func_(time_func) {
30*6777b538SAndroid Build Coastguard Worker // Do not bother decoding response header payload above the limit.
31*6777b538SAndroid Build Coastguard Worker deframer_.GetHpackDecoder().set_max_decode_buffer_size_bytes(
32*6777b538SAndroid Build Coastguard Worker max_header_list_size_);
33*6777b538SAndroid Build Coastguard Worker }
34*6777b538SAndroid Build Coastguard Worker
35*6777b538SAndroid Build Coastguard Worker BufferedSpdyFramer::~BufferedSpdyFramer() = default;
36*6777b538SAndroid Build Coastguard Worker
set_visitor(BufferedSpdyFramerVisitorInterface * visitor)37*6777b538SAndroid Build Coastguard Worker void BufferedSpdyFramer::set_visitor(
38*6777b538SAndroid Build Coastguard Worker BufferedSpdyFramerVisitorInterface* visitor) {
39*6777b538SAndroid Build Coastguard Worker visitor_ = visitor;
40*6777b538SAndroid Build Coastguard Worker deframer_.set_visitor(this);
41*6777b538SAndroid Build Coastguard Worker }
42*6777b538SAndroid Build Coastguard Worker
set_debug_visitor(spdy::SpdyFramerDebugVisitorInterface * debug_visitor)43*6777b538SAndroid Build Coastguard Worker void BufferedSpdyFramer::set_debug_visitor(
44*6777b538SAndroid Build Coastguard Worker spdy::SpdyFramerDebugVisitorInterface* debug_visitor) {
45*6777b538SAndroid Build Coastguard Worker spdy_framer_.set_debug_visitor(debug_visitor);
46*6777b538SAndroid Build Coastguard Worker deframer_.set_debug_visitor(debug_visitor);
47*6777b538SAndroid Build Coastguard Worker }
48*6777b538SAndroid Build Coastguard Worker
OnError(http2::Http2DecoderAdapter::SpdyFramerError spdy_framer_error,std::string)49*6777b538SAndroid Build Coastguard Worker void BufferedSpdyFramer::OnError(
50*6777b538SAndroid Build Coastguard Worker http2::Http2DecoderAdapter::SpdyFramerError spdy_framer_error,
51*6777b538SAndroid Build Coastguard Worker std::string /*detailed_error*/) {
52*6777b538SAndroid Build Coastguard Worker visitor_->OnError(spdy_framer_error);
53*6777b538SAndroid Build Coastguard Worker }
54*6777b538SAndroid Build Coastguard Worker
OnHeaders(spdy::SpdyStreamId stream_id,size_t payload_length,bool has_priority,int weight,spdy::SpdyStreamId parent_stream_id,bool exclusive,bool fin,bool end)55*6777b538SAndroid Build Coastguard Worker void BufferedSpdyFramer::OnHeaders(spdy::SpdyStreamId stream_id,
56*6777b538SAndroid Build Coastguard Worker size_t payload_length,
57*6777b538SAndroid Build Coastguard Worker bool has_priority,
58*6777b538SAndroid Build Coastguard Worker int weight,
59*6777b538SAndroid Build Coastguard Worker spdy::SpdyStreamId parent_stream_id,
60*6777b538SAndroid Build Coastguard Worker bool exclusive,
61*6777b538SAndroid Build Coastguard Worker bool fin,
62*6777b538SAndroid Build Coastguard Worker bool end) {
63*6777b538SAndroid Build Coastguard Worker frames_received_++;
64*6777b538SAndroid Build Coastguard Worker DCHECK(!control_frame_fields_.get());
65*6777b538SAndroid Build Coastguard Worker control_frame_fields_ = std::make_unique<ControlFrameFields>();
66*6777b538SAndroid Build Coastguard Worker control_frame_fields_->type = spdy::SpdyFrameType::HEADERS;
67*6777b538SAndroid Build Coastguard Worker control_frame_fields_->stream_id = stream_id;
68*6777b538SAndroid Build Coastguard Worker control_frame_fields_->has_priority = has_priority;
69*6777b538SAndroid Build Coastguard Worker if (control_frame_fields_->has_priority) {
70*6777b538SAndroid Build Coastguard Worker control_frame_fields_->weight = weight;
71*6777b538SAndroid Build Coastguard Worker control_frame_fields_->parent_stream_id = parent_stream_id;
72*6777b538SAndroid Build Coastguard Worker control_frame_fields_->exclusive = exclusive;
73*6777b538SAndroid Build Coastguard Worker }
74*6777b538SAndroid Build Coastguard Worker control_frame_fields_->fin = fin;
75*6777b538SAndroid Build Coastguard Worker control_frame_fields_->recv_first_byte_time = time_func_();
76*6777b538SAndroid Build Coastguard Worker }
77*6777b538SAndroid Build Coastguard Worker
OnDataFrameHeader(spdy::SpdyStreamId stream_id,size_t length,bool fin)78*6777b538SAndroid Build Coastguard Worker void BufferedSpdyFramer::OnDataFrameHeader(spdy::SpdyStreamId stream_id,
79*6777b538SAndroid Build Coastguard Worker size_t length,
80*6777b538SAndroid Build Coastguard Worker bool fin) {
81*6777b538SAndroid Build Coastguard Worker frames_received_++;
82*6777b538SAndroid Build Coastguard Worker visitor_->OnDataFrameHeader(stream_id, length, fin);
83*6777b538SAndroid Build Coastguard Worker }
84*6777b538SAndroid Build Coastguard Worker
OnStreamFrameData(spdy::SpdyStreamId stream_id,const char * data,size_t len)85*6777b538SAndroid Build Coastguard Worker void BufferedSpdyFramer::OnStreamFrameData(spdy::SpdyStreamId stream_id,
86*6777b538SAndroid Build Coastguard Worker const char* data,
87*6777b538SAndroid Build Coastguard Worker size_t len) {
88*6777b538SAndroid Build Coastguard Worker visitor_->OnStreamFrameData(stream_id, data, len);
89*6777b538SAndroid Build Coastguard Worker }
90*6777b538SAndroid Build Coastguard Worker
OnStreamEnd(spdy::SpdyStreamId stream_id)91*6777b538SAndroid Build Coastguard Worker void BufferedSpdyFramer::OnStreamEnd(spdy::SpdyStreamId stream_id) {
92*6777b538SAndroid Build Coastguard Worker visitor_->OnStreamEnd(stream_id);
93*6777b538SAndroid Build Coastguard Worker }
94*6777b538SAndroid Build Coastguard Worker
OnStreamPadLength(spdy::SpdyStreamId stream_id,size_t value)95*6777b538SAndroid Build Coastguard Worker void BufferedSpdyFramer::OnStreamPadLength(spdy::SpdyStreamId stream_id,
96*6777b538SAndroid Build Coastguard Worker size_t value) {
97*6777b538SAndroid Build Coastguard Worker // Deliver the stream pad length byte for flow control handling.
98*6777b538SAndroid Build Coastguard Worker visitor_->OnStreamPadding(stream_id, 1);
99*6777b538SAndroid Build Coastguard Worker }
100*6777b538SAndroid Build Coastguard Worker
OnStreamPadding(spdy::SpdyStreamId stream_id,size_t len)101*6777b538SAndroid Build Coastguard Worker void BufferedSpdyFramer::OnStreamPadding(spdy::SpdyStreamId stream_id,
102*6777b538SAndroid Build Coastguard Worker size_t len) {
103*6777b538SAndroid Build Coastguard Worker visitor_->OnStreamPadding(stream_id, len);
104*6777b538SAndroid Build Coastguard Worker }
105*6777b538SAndroid Build Coastguard Worker
OnHeaderFrameStart(spdy::SpdyStreamId stream_id)106*6777b538SAndroid Build Coastguard Worker spdy::SpdyHeadersHandlerInterface* BufferedSpdyFramer::OnHeaderFrameStart(
107*6777b538SAndroid Build Coastguard Worker spdy::SpdyStreamId stream_id) {
108*6777b538SAndroid Build Coastguard Worker coalescer_ =
109*6777b538SAndroid Build Coastguard Worker std::make_unique<HeaderCoalescer>(max_header_list_size_, net_log_);
110*6777b538SAndroid Build Coastguard Worker return coalescer_.get();
111*6777b538SAndroid Build Coastguard Worker }
112*6777b538SAndroid Build Coastguard Worker
OnHeaderFrameEnd(spdy::SpdyStreamId stream_id)113*6777b538SAndroid Build Coastguard Worker void BufferedSpdyFramer::OnHeaderFrameEnd(spdy::SpdyStreamId stream_id) {
114*6777b538SAndroid Build Coastguard Worker if (coalescer_->error_seen()) {
115*6777b538SAndroid Build Coastguard Worker visitor_->OnStreamError(stream_id,
116*6777b538SAndroid Build Coastguard Worker "Could not parse Spdy Control Frame Header.");
117*6777b538SAndroid Build Coastguard Worker control_frame_fields_.reset();
118*6777b538SAndroid Build Coastguard Worker return;
119*6777b538SAndroid Build Coastguard Worker }
120*6777b538SAndroid Build Coastguard Worker DCHECK(control_frame_fields_.get());
121*6777b538SAndroid Build Coastguard Worker switch (control_frame_fields_->type) {
122*6777b538SAndroid Build Coastguard Worker case spdy::SpdyFrameType::HEADERS:
123*6777b538SAndroid Build Coastguard Worker visitor_->OnHeaders(
124*6777b538SAndroid Build Coastguard Worker control_frame_fields_->stream_id, control_frame_fields_->has_priority,
125*6777b538SAndroid Build Coastguard Worker control_frame_fields_->weight,
126*6777b538SAndroid Build Coastguard Worker control_frame_fields_->parent_stream_id,
127*6777b538SAndroid Build Coastguard Worker control_frame_fields_->exclusive, control_frame_fields_->fin,
128*6777b538SAndroid Build Coastguard Worker coalescer_->release_headers(),
129*6777b538SAndroid Build Coastguard Worker control_frame_fields_->recv_first_byte_time);
130*6777b538SAndroid Build Coastguard Worker break;
131*6777b538SAndroid Build Coastguard Worker case spdy::SpdyFrameType::PUSH_PROMISE:
132*6777b538SAndroid Build Coastguard Worker visitor_->OnPushPromise(control_frame_fields_->stream_id,
133*6777b538SAndroid Build Coastguard Worker control_frame_fields_->promised_stream_id,
134*6777b538SAndroid Build Coastguard Worker coalescer_->release_headers());
135*6777b538SAndroid Build Coastguard Worker break;
136*6777b538SAndroid Build Coastguard Worker default:
137*6777b538SAndroid Build Coastguard Worker DCHECK(false) << "Unexpect control frame type: "
138*6777b538SAndroid Build Coastguard Worker << control_frame_fields_->type;
139*6777b538SAndroid Build Coastguard Worker break;
140*6777b538SAndroid Build Coastguard Worker }
141*6777b538SAndroid Build Coastguard Worker control_frame_fields_.reset(nullptr);
142*6777b538SAndroid Build Coastguard Worker }
143*6777b538SAndroid Build Coastguard Worker
OnSettings()144*6777b538SAndroid Build Coastguard Worker void BufferedSpdyFramer::OnSettings() {
145*6777b538SAndroid Build Coastguard Worker visitor_->OnSettings();
146*6777b538SAndroid Build Coastguard Worker }
147*6777b538SAndroid Build Coastguard Worker
OnSetting(spdy::SpdySettingsId id,uint32_t value)148*6777b538SAndroid Build Coastguard Worker void BufferedSpdyFramer::OnSetting(spdy::SpdySettingsId id, uint32_t value) {
149*6777b538SAndroid Build Coastguard Worker visitor_->OnSetting(id, value);
150*6777b538SAndroid Build Coastguard Worker }
151*6777b538SAndroid Build Coastguard Worker
OnSettingsAck()152*6777b538SAndroid Build Coastguard Worker void BufferedSpdyFramer::OnSettingsAck() {
153*6777b538SAndroid Build Coastguard Worker visitor_->OnSettingsAck();
154*6777b538SAndroid Build Coastguard Worker }
155*6777b538SAndroid Build Coastguard Worker
OnSettingsEnd()156*6777b538SAndroid Build Coastguard Worker void BufferedSpdyFramer::OnSettingsEnd() {
157*6777b538SAndroid Build Coastguard Worker visitor_->OnSettingsEnd();
158*6777b538SAndroid Build Coastguard Worker }
159*6777b538SAndroid Build Coastguard Worker
OnPing(spdy::SpdyPingId unique_id,bool is_ack)160*6777b538SAndroid Build Coastguard Worker void BufferedSpdyFramer::OnPing(spdy::SpdyPingId unique_id, bool is_ack) {
161*6777b538SAndroid Build Coastguard Worker visitor_->OnPing(unique_id, is_ack);
162*6777b538SAndroid Build Coastguard Worker }
163*6777b538SAndroid Build Coastguard Worker
OnRstStream(spdy::SpdyStreamId stream_id,spdy::SpdyErrorCode error_code)164*6777b538SAndroid Build Coastguard Worker void BufferedSpdyFramer::OnRstStream(spdy::SpdyStreamId stream_id,
165*6777b538SAndroid Build Coastguard Worker spdy::SpdyErrorCode error_code) {
166*6777b538SAndroid Build Coastguard Worker visitor_->OnRstStream(stream_id, error_code);
167*6777b538SAndroid Build Coastguard Worker }
OnGoAway(spdy::SpdyStreamId last_accepted_stream_id,spdy::SpdyErrorCode error_code)168*6777b538SAndroid Build Coastguard Worker void BufferedSpdyFramer::OnGoAway(spdy::SpdyStreamId last_accepted_stream_id,
169*6777b538SAndroid Build Coastguard Worker spdy::SpdyErrorCode error_code) {
170*6777b538SAndroid Build Coastguard Worker DCHECK(!goaway_fields_);
171*6777b538SAndroid Build Coastguard Worker goaway_fields_ = std::make_unique<GoAwayFields>();
172*6777b538SAndroid Build Coastguard Worker goaway_fields_->last_accepted_stream_id = last_accepted_stream_id;
173*6777b538SAndroid Build Coastguard Worker goaway_fields_->error_code = error_code;
174*6777b538SAndroid Build Coastguard Worker }
175*6777b538SAndroid Build Coastguard Worker
OnGoAwayFrameData(const char * goaway_data,size_t len)176*6777b538SAndroid Build Coastguard Worker bool BufferedSpdyFramer::OnGoAwayFrameData(const char* goaway_data,
177*6777b538SAndroid Build Coastguard Worker size_t len) {
178*6777b538SAndroid Build Coastguard Worker if (len > 0) {
179*6777b538SAndroid Build Coastguard Worker if (goaway_fields_->debug_data.size() < kGoAwayDebugDataMaxSize) {
180*6777b538SAndroid Build Coastguard Worker goaway_fields_->debug_data.append(
181*6777b538SAndroid Build Coastguard Worker goaway_data, std::min(len, kGoAwayDebugDataMaxSize -
182*6777b538SAndroid Build Coastguard Worker goaway_fields_->debug_data.size()));
183*6777b538SAndroid Build Coastguard Worker }
184*6777b538SAndroid Build Coastguard Worker return true;
185*6777b538SAndroid Build Coastguard Worker }
186*6777b538SAndroid Build Coastguard Worker visitor_->OnGoAway(goaway_fields_->last_accepted_stream_id,
187*6777b538SAndroid Build Coastguard Worker goaway_fields_->error_code, goaway_fields_->debug_data);
188*6777b538SAndroid Build Coastguard Worker goaway_fields_.reset();
189*6777b538SAndroid Build Coastguard Worker return true;
190*6777b538SAndroid Build Coastguard Worker }
191*6777b538SAndroid Build Coastguard Worker
OnWindowUpdate(spdy::SpdyStreamId stream_id,int delta_window_size)192*6777b538SAndroid Build Coastguard Worker void BufferedSpdyFramer::OnWindowUpdate(spdy::SpdyStreamId stream_id,
193*6777b538SAndroid Build Coastguard Worker int delta_window_size) {
194*6777b538SAndroid Build Coastguard Worker visitor_->OnWindowUpdate(stream_id, delta_window_size);
195*6777b538SAndroid Build Coastguard Worker }
196*6777b538SAndroid Build Coastguard Worker
OnPushPromise(spdy::SpdyStreamId stream_id,spdy::SpdyStreamId promised_stream_id,bool end)197*6777b538SAndroid Build Coastguard Worker void BufferedSpdyFramer::OnPushPromise(spdy::SpdyStreamId stream_id,
198*6777b538SAndroid Build Coastguard Worker spdy::SpdyStreamId promised_stream_id,
199*6777b538SAndroid Build Coastguard Worker bool end) {
200*6777b538SAndroid Build Coastguard Worker frames_received_++;
201*6777b538SAndroid Build Coastguard Worker DCHECK(!control_frame_fields_.get());
202*6777b538SAndroid Build Coastguard Worker control_frame_fields_ = std::make_unique<ControlFrameFields>();
203*6777b538SAndroid Build Coastguard Worker control_frame_fields_->type = spdy::SpdyFrameType::PUSH_PROMISE;
204*6777b538SAndroid Build Coastguard Worker control_frame_fields_->stream_id = stream_id;
205*6777b538SAndroid Build Coastguard Worker control_frame_fields_->promised_stream_id = promised_stream_id;
206*6777b538SAndroid Build Coastguard Worker control_frame_fields_->recv_first_byte_time = time_func_();
207*6777b538SAndroid Build Coastguard Worker }
208*6777b538SAndroid Build Coastguard Worker
OnAltSvc(spdy::SpdyStreamId stream_id,std::string_view origin,const spdy::SpdyAltSvcWireFormat::AlternativeServiceVector & altsvc_vector)209*6777b538SAndroid Build Coastguard Worker void BufferedSpdyFramer::OnAltSvc(
210*6777b538SAndroid Build Coastguard Worker spdy::SpdyStreamId stream_id,
211*6777b538SAndroid Build Coastguard Worker std::string_view origin,
212*6777b538SAndroid Build Coastguard Worker const spdy::SpdyAltSvcWireFormat::AlternativeServiceVector& altsvc_vector) {
213*6777b538SAndroid Build Coastguard Worker visitor_->OnAltSvc(stream_id, origin, altsvc_vector);
214*6777b538SAndroid Build Coastguard Worker }
215*6777b538SAndroid Build Coastguard Worker
OnContinuation(spdy::SpdyStreamId stream_id,size_t payload_length,bool end)216*6777b538SAndroid Build Coastguard Worker void BufferedSpdyFramer::OnContinuation(spdy::SpdyStreamId stream_id,
217*6777b538SAndroid Build Coastguard Worker size_t payload_length,
218*6777b538SAndroid Build Coastguard Worker bool end) {}
219*6777b538SAndroid Build Coastguard Worker
OnUnknownFrame(spdy::SpdyStreamId stream_id,uint8_t frame_type)220*6777b538SAndroid Build Coastguard Worker bool BufferedSpdyFramer::OnUnknownFrame(spdy::SpdyStreamId stream_id,
221*6777b538SAndroid Build Coastguard Worker uint8_t frame_type) {
222*6777b538SAndroid Build Coastguard Worker return visitor_->OnUnknownFrame(stream_id, frame_type);
223*6777b538SAndroid Build Coastguard Worker }
224*6777b538SAndroid Build Coastguard Worker
ProcessInput(const char * data,size_t len)225*6777b538SAndroid Build Coastguard Worker size_t BufferedSpdyFramer::ProcessInput(const char* data, size_t len) {
226*6777b538SAndroid Build Coastguard Worker return deframer_.ProcessInput(data, len);
227*6777b538SAndroid Build Coastguard Worker }
228*6777b538SAndroid Build Coastguard Worker
UpdateHeaderDecoderTableSize(uint32_t value)229*6777b538SAndroid Build Coastguard Worker void BufferedSpdyFramer::UpdateHeaderDecoderTableSize(uint32_t value) {
230*6777b538SAndroid Build Coastguard Worker deframer_.GetHpackDecoder().ApplyHeaderTableSizeSetting(value);
231*6777b538SAndroid Build Coastguard Worker }
232*6777b538SAndroid Build Coastguard Worker
233*6777b538SAndroid Build Coastguard Worker http2::Http2DecoderAdapter::SpdyFramerError
spdy_framer_error() const234*6777b538SAndroid Build Coastguard Worker BufferedSpdyFramer::spdy_framer_error() const {
235*6777b538SAndroid Build Coastguard Worker return deframer_.spdy_framer_error();
236*6777b538SAndroid Build Coastguard Worker }
237*6777b538SAndroid Build Coastguard Worker
state() const238*6777b538SAndroid Build Coastguard Worker http2::Http2DecoderAdapter::SpdyState BufferedSpdyFramer::state() const {
239*6777b538SAndroid Build Coastguard Worker return deframer_.state();
240*6777b538SAndroid Build Coastguard Worker }
241*6777b538SAndroid Build Coastguard Worker
MessageFullyRead()242*6777b538SAndroid Build Coastguard Worker bool BufferedSpdyFramer::MessageFullyRead() {
243*6777b538SAndroid Build Coastguard Worker return state() == http2::Http2DecoderAdapter::SPDY_FRAME_COMPLETE;
244*6777b538SAndroid Build Coastguard Worker }
245*6777b538SAndroid Build Coastguard Worker
HasError()246*6777b538SAndroid Build Coastguard Worker bool BufferedSpdyFramer::HasError() {
247*6777b538SAndroid Build Coastguard Worker return deframer_.HasError();
248*6777b538SAndroid Build Coastguard Worker }
249*6777b538SAndroid Build Coastguard Worker
250*6777b538SAndroid Build Coastguard Worker // TODO(jgraettinger): Eliminate uses of this method (prefer
251*6777b538SAndroid Build Coastguard Worker // spdy::SpdyRstStreamIR).
CreateRstStream(spdy::SpdyStreamId stream_id,spdy::SpdyErrorCode error_code) const252*6777b538SAndroid Build Coastguard Worker std::unique_ptr<spdy::SpdySerializedFrame> BufferedSpdyFramer::CreateRstStream(
253*6777b538SAndroid Build Coastguard Worker spdy::SpdyStreamId stream_id,
254*6777b538SAndroid Build Coastguard Worker spdy::SpdyErrorCode error_code) const {
255*6777b538SAndroid Build Coastguard Worker spdy::SpdyRstStreamIR rst_ir(stream_id, error_code);
256*6777b538SAndroid Build Coastguard Worker return std::make_unique<spdy::SpdySerializedFrame>(
257*6777b538SAndroid Build Coastguard Worker spdy_framer_.SerializeRstStream(rst_ir));
258*6777b538SAndroid Build Coastguard Worker }
259*6777b538SAndroid Build Coastguard Worker
260*6777b538SAndroid Build Coastguard Worker // TODO(jgraettinger): Eliminate uses of this method (prefer
261*6777b538SAndroid Build Coastguard Worker // spdy::SpdySettingsIR).
CreateSettings(const spdy::SettingsMap & values) const262*6777b538SAndroid Build Coastguard Worker std::unique_ptr<spdy::SpdySerializedFrame> BufferedSpdyFramer::CreateSettings(
263*6777b538SAndroid Build Coastguard Worker const spdy::SettingsMap& values) const {
264*6777b538SAndroid Build Coastguard Worker spdy::SpdySettingsIR settings_ir;
265*6777b538SAndroid Build Coastguard Worker for (const auto& it : values) {
266*6777b538SAndroid Build Coastguard Worker settings_ir.AddSetting(it.first, it.second);
267*6777b538SAndroid Build Coastguard Worker }
268*6777b538SAndroid Build Coastguard Worker return std::make_unique<spdy::SpdySerializedFrame>(
269*6777b538SAndroid Build Coastguard Worker spdy_framer_.SerializeSettings(settings_ir));
270*6777b538SAndroid Build Coastguard Worker }
271*6777b538SAndroid Build Coastguard Worker
272*6777b538SAndroid Build Coastguard Worker // TODO(jgraettinger): Eliminate uses of this method (prefer spdy::SpdyPingIR).
CreatePingFrame(spdy::SpdyPingId unique_id,bool is_ack) const273*6777b538SAndroid Build Coastguard Worker std::unique_ptr<spdy::SpdySerializedFrame> BufferedSpdyFramer::CreatePingFrame(
274*6777b538SAndroid Build Coastguard Worker spdy::SpdyPingId unique_id,
275*6777b538SAndroid Build Coastguard Worker bool is_ack) const {
276*6777b538SAndroid Build Coastguard Worker spdy::SpdyPingIR ping_ir(unique_id);
277*6777b538SAndroid Build Coastguard Worker ping_ir.set_is_ack(is_ack);
278*6777b538SAndroid Build Coastguard Worker return std::make_unique<spdy::SpdySerializedFrame>(
279*6777b538SAndroid Build Coastguard Worker spdy_framer_.SerializePing(ping_ir));
280*6777b538SAndroid Build Coastguard Worker }
281*6777b538SAndroid Build Coastguard Worker
282*6777b538SAndroid Build Coastguard Worker // TODO(jgraettinger): Eliminate uses of this method (prefer
283*6777b538SAndroid Build Coastguard Worker // spdy::SpdyWindowUpdateIR).
284*6777b538SAndroid Build Coastguard Worker std::unique_ptr<spdy::SpdySerializedFrame>
CreateWindowUpdate(spdy::SpdyStreamId stream_id,uint32_t delta_window_size) const285*6777b538SAndroid Build Coastguard Worker BufferedSpdyFramer::CreateWindowUpdate(spdy::SpdyStreamId stream_id,
286*6777b538SAndroid Build Coastguard Worker uint32_t delta_window_size) const {
287*6777b538SAndroid Build Coastguard Worker spdy::SpdyWindowUpdateIR update_ir(stream_id, delta_window_size);
288*6777b538SAndroid Build Coastguard Worker return std::make_unique<spdy::SpdySerializedFrame>(
289*6777b538SAndroid Build Coastguard Worker spdy_framer_.SerializeWindowUpdate(update_ir));
290*6777b538SAndroid Build Coastguard Worker }
291*6777b538SAndroid Build Coastguard Worker
292*6777b538SAndroid Build Coastguard Worker // TODO(jgraettinger): Eliminate uses of this method (prefer spdy::SpdyDataIR).
CreateDataFrame(spdy::SpdyStreamId stream_id,const char * data,uint32_t len,spdy::SpdyDataFlags flags)293*6777b538SAndroid Build Coastguard Worker std::unique_ptr<spdy::SpdySerializedFrame> BufferedSpdyFramer::CreateDataFrame(
294*6777b538SAndroid Build Coastguard Worker spdy::SpdyStreamId stream_id,
295*6777b538SAndroid Build Coastguard Worker const char* data,
296*6777b538SAndroid Build Coastguard Worker uint32_t len,
297*6777b538SAndroid Build Coastguard Worker spdy::SpdyDataFlags flags) {
298*6777b538SAndroid Build Coastguard Worker spdy::SpdyDataIR data_ir(stream_id, std::string_view(data, len));
299*6777b538SAndroid Build Coastguard Worker data_ir.set_fin((flags & spdy::DATA_FLAG_FIN) != 0);
300*6777b538SAndroid Build Coastguard Worker return std::make_unique<spdy::SpdySerializedFrame>(
301*6777b538SAndroid Build Coastguard Worker spdy_framer_.SerializeData(data_ir));
302*6777b538SAndroid Build Coastguard Worker }
303*6777b538SAndroid Build Coastguard Worker
304*6777b538SAndroid Build Coastguard Worker // TODO(jgraettinger): Eliminate uses of this method (prefer
305*6777b538SAndroid Build Coastguard Worker // spdy::SpdyPriorityIR).
CreatePriority(spdy::SpdyStreamId stream_id,spdy::SpdyStreamId dependency_id,int weight,bool exclusive) const306*6777b538SAndroid Build Coastguard Worker std::unique_ptr<spdy::SpdySerializedFrame> BufferedSpdyFramer::CreatePriority(
307*6777b538SAndroid Build Coastguard Worker spdy::SpdyStreamId stream_id,
308*6777b538SAndroid Build Coastguard Worker spdy::SpdyStreamId dependency_id,
309*6777b538SAndroid Build Coastguard Worker int weight,
310*6777b538SAndroid Build Coastguard Worker bool exclusive) const {
311*6777b538SAndroid Build Coastguard Worker spdy::SpdyPriorityIR priority_ir(stream_id, dependency_id, weight, exclusive);
312*6777b538SAndroid Build Coastguard Worker return std::make_unique<spdy::SpdySerializedFrame>(
313*6777b538SAndroid Build Coastguard Worker spdy_framer_.SerializePriority(priority_ir));
314*6777b538SAndroid Build Coastguard Worker }
315*6777b538SAndroid Build Coastguard Worker
UpdateHeaderEncoderTableSize(uint32_t value)316*6777b538SAndroid Build Coastguard Worker void BufferedSpdyFramer::UpdateHeaderEncoderTableSize(uint32_t value) {
317*6777b538SAndroid Build Coastguard Worker spdy_framer_.UpdateHeaderEncoderTableSize(value);
318*6777b538SAndroid Build Coastguard Worker }
319*6777b538SAndroid Build Coastguard Worker
header_encoder_table_size() const320*6777b538SAndroid Build Coastguard Worker uint32_t BufferedSpdyFramer::header_encoder_table_size() const {
321*6777b538SAndroid Build Coastguard Worker return spdy_framer_.header_encoder_table_size();
322*6777b538SAndroid Build Coastguard Worker }
323*6777b538SAndroid Build Coastguard Worker
324*6777b538SAndroid Build Coastguard Worker BufferedSpdyFramer::ControlFrameFields::ControlFrameFields() = default;
325*6777b538SAndroid Build Coastguard Worker
326*6777b538SAndroid Build Coastguard Worker } // namespace net
327