blob: 4513f04a447951f6318f86d2afa9bc814e57438e [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// Copyright (c) 2018 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/third_party/quiche/src/quic/core/http/http_decoder.h"
bnc70914262019-03-16 12:49:50 -07006
QUICHE teama6ef0a62019-03-07 20:34:33 -05007#include "net/third_party/quiche/src/quic/core/quic_data_reader.h"
8#include "net/third_party/quiche/src/quic/platform/api/quic_bug_tracker.h"
9#include "net/third_party/quiche/src/quic/platform/api/quic_fallthrough.h"
10
11namespace quic {
12
13namespace {
14
15// Create a mask that sets the last |num_bits| to 1 and the rest to 0.
16inline uint8_t GetMaskFromNumBits(uint8_t num_bits) {
17 return (1u << num_bits) - 1;
18}
19
20// Extract |num_bits| from |flags| offset by |offset|.
21uint8_t ExtractBits(uint8_t flags, uint8_t num_bits, uint8_t offset) {
22 return (flags >> offset) & GetMaskFromNumBits(num_bits);
23}
24
renjietang4ab9d9f2019-04-10 14:30:26 -070025// Length of the weight field of a priority frame.
26static const size_t kPriorityWeightLength = 1;
27// Length of a priority frame's first byte.
28static const size_t kPriorityFirstByteLength = 1;
QUICHE teama6ef0a62019-03-07 20:34:33 -050029
30} // namespace
31
32HttpDecoder::HttpDecoder()
33 : visitor_(nullptr),
renjietangfcd91c02019-04-22 10:40:35 -070034 state_(STATE_READING_FRAME_TYPE),
QUICHE teama6ef0a62019-03-07 20:34:33 -050035 current_frame_type_(0),
renjietangbb98cbc2019-04-23 13:13:56 -070036 current_length_field_length_(0),
QUICHE teama6ef0a62019-03-07 20:34:33 -050037 remaining_length_field_length_(0),
38 current_frame_length_(0),
39 remaining_frame_length_(0),
renjietang2d475cf2019-04-18 17:03:37 -070040 current_type_field_length_(0),
41 remaining_type_field_length_(0),
QUICHE teama6ef0a62019-03-07 20:34:33 -050042 error_(QUIC_NO_ERROR),
bncfa0c90c2019-03-13 14:14:28 -070043 error_detail_("") {}
QUICHE teama6ef0a62019-03-07 20:34:33 -050044
45HttpDecoder::~HttpDecoder() {}
46
47QuicByteCount HttpDecoder::ProcessInput(const char* data, QuicByteCount len) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050048 QuicDataReader reader(data, len);
bnc70914262019-03-16 12:49:50 -070049 while (error_ == QUIC_NO_ERROR &&
50 (reader.BytesRemaining() != 0 || state_ == STATE_FINISH_PARSING)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050051 switch (state_) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050052 case STATE_READING_FRAME_TYPE:
53 ReadFrameType(&reader);
54 break;
renjietangfcd91c02019-04-22 10:40:35 -070055 case STATE_READING_FRAME_LENGTH:
56 ReadFrameLength(&reader);
57 break;
QUICHE teama6ef0a62019-03-07 20:34:33 -050058 case STATE_READING_FRAME_PAYLOAD:
59 ReadFramePayload(&reader);
60 break;
bnc70914262019-03-16 12:49:50 -070061 case STATE_FINISH_PARSING:
62 FinishParsing();
63 break;
QUICHE teama6ef0a62019-03-07 20:34:33 -050064 case STATE_ERROR:
65 break;
66 default:
67 QUIC_BUG << "Invalid state: " << state_;
68 }
69 }
70
71 if (error_ != QUIC_NO_ERROR) {
72 return 0;
73 }
74
75 return len - reader.BytesRemaining();
76}
77
QUICHE teama6ef0a62019-03-07 20:34:33 -050078void HttpDecoder::ReadFrameType(QuicDataReader* reader) {
79 DCHECK_NE(0u, reader->BytesRemaining());
renjietang2d475cf2019-04-18 17:03:37 -070080 if (current_type_field_length_ == 0) {
81 // A new frame is coming.
82 current_type_field_length_ = reader->PeekVarInt62Length();
83 if (current_type_field_length_ == 0) {
84 RaiseError(QUIC_INTERNAL_ERROR, "Unable to read frame type length");
85 visitor_->OnError(this);
86 return;
87 }
88 if (current_type_field_length_ <= reader->BytesRemaining()) {
89 // The reader has all type data needed, so no need to buffer.
90 if (!reader->ReadVarInt62(&current_frame_type_)) {
91 RaiseError(QUIC_INTERNAL_ERROR, "Unable to read frame type");
92 return;
93 }
94 } else {
95 // Buffer a new type field.
96 remaining_type_field_length_ = current_type_field_length_;
97 BufferFrameType(reader);
98 return;
99 }
100 } else {
101 // Buffer the existing type field.
102 BufferFrameType(reader);
103 // The frame is still not buffered completely.
104 if (remaining_type_field_length_ != 0) {
105 return;
106 }
107 QuicDataReader type_reader(type_buffer_.data(), current_type_field_length_);
108 if (!type_reader.ReadVarInt62(&current_frame_type_)) {
109 RaiseError(QUIC_INTERNAL_ERROR, "Unable to read buffered frame type");
110 visitor_->OnError(this);
111 return;
112 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500113 }
114
renjietangfcd91c02019-04-22 10:40:35 -0700115 state_ = STATE_READING_FRAME_LENGTH;
116}
117
118void HttpDecoder::ReadFrameLength(QuicDataReader* reader) {
119 DCHECK_NE(0u, reader->BytesRemaining());
renjietangbb98cbc2019-04-23 13:13:56 -0700120 if (current_length_field_length_ == 0) {
121 // A new frame is coming.
122 current_length_field_length_ = reader->PeekVarInt62Length();
123 if (current_length_field_length_ == 0) {
124 RaiseError(QUIC_INTERNAL_ERROR,
125 "Unable to read the length of frame length");
126 visitor_->OnError(this);
127 return;
128 }
129 if (current_length_field_length_ <= reader->BytesRemaining()) {
130 // The reader has all length data needed, so no need to buffer.
131 if (!reader->ReadVarInt62(&current_frame_length_)) {
132 RaiseError(QUIC_INTERNAL_ERROR, "Unable to read frame length");
133 return;
134 }
135 } else {
136 // Buffer a new length field.
137 remaining_length_field_length_ = current_length_field_length_;
138 BufferFrameLength(reader);
139 return;
140 }
141 } else {
142 // Buffer the existing length field.
143 BufferFrameLength(reader);
144 // The frame is still not buffered completely.
145 if (remaining_length_field_length_ != 0) {
146 return;
147 }
148 QuicDataReader length_reader(length_buffer_.data(),
149 current_length_field_length_);
150 if (!length_reader.ReadVarInt62(&current_frame_length_)) {
151 RaiseError(QUIC_INTERNAL_ERROR, "Unable to read buffered frame length");
152 visitor_->OnError(this);
153 return;
154 }
renjietangfcd91c02019-04-22 10:40:35 -0700155 }
156
renjietang4ab9d9f2019-04-10 14:30:26 -0700157 if (current_frame_length_ > MaxFrameLength(current_frame_type_)) {
158 RaiseError(QUIC_INTERNAL_ERROR, "Frame is too large");
159 visitor_->OnError(this);
160 return;
161 }
162
bnc70914262019-03-16 12:49:50 -0700163 // Calling the following two visitor methods does not require parsing of any
164 // frame payload.
165 if (current_frame_type_ == 0x0) {
renjietang546a6282019-06-03 10:21:21 -0700166 if (!visitor_->OnDataFrameStart(Http3FrameLengths(
167 current_length_field_length_ + current_type_field_length_,
168 current_frame_length_))) {
169 RaiseError(QUIC_INTERNAL_ERROR, "Visitor shut down.");
170 return;
171 }
bnc70914262019-03-16 12:49:50 -0700172 } else if (current_frame_type_ == 0x1) {
renjietang546a6282019-06-03 10:21:21 -0700173 if (!visitor_->OnHeadersFrameStart(Http3FrameLengths(
174 current_length_field_length_ + current_type_field_length_,
175 current_frame_length_))) {
176 RaiseError(QUIC_INTERNAL_ERROR, "Visitor shut down.");
177 return;
178 }
renjietangf41bf642019-04-02 11:45:34 -0700179 } else if (current_frame_type_ == 0x4) {
renjietang546a6282019-06-03 10:21:21 -0700180 if (!visitor_->OnSettingsFrameStart(Http3FrameLengths(
181 current_length_field_length_ + current_type_field_length_,
182 current_frame_length_))) {
183 RaiseError(QUIC_INTERNAL_ERROR, "Visitor shut down.");
184 return;
185 }
bnc70914262019-03-16 12:49:50 -0700186 }
187
renjietangfcd91c02019-04-22 10:40:35 -0700188 remaining_frame_length_ = current_frame_length_;
bnc70914262019-03-16 12:49:50 -0700189 state_ = (remaining_frame_length_ == 0) ? STATE_FINISH_PARSING
190 : STATE_READING_FRAME_PAYLOAD;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500191}
192
193void HttpDecoder::ReadFramePayload(QuicDataReader* reader) {
194 DCHECK_NE(0u, reader->BytesRemaining());
bnc70914262019-03-16 12:49:50 -0700195 DCHECK_NE(0u, remaining_frame_length_);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500196 switch (current_frame_type_) {
197 case 0x0: { // DATA
QUICHE teama6ef0a62019-03-07 20:34:33 -0500198 QuicByteCount bytes_to_read = std::min<QuicByteCount>(
199 remaining_frame_length_, reader->BytesRemaining());
200 QuicStringPiece payload;
201 if (!reader->ReadStringPiece(&payload, bytes_to_read)) {
202 RaiseError(QUIC_INTERNAL_ERROR, "Unable to read data");
203 return;
204 }
bnc70914262019-03-16 12:49:50 -0700205 DCHECK(!payload.empty());
renjietang546a6282019-06-03 10:21:21 -0700206 if (!visitor_->OnDataFramePayload(payload)) {
207 RaiseError(QUIC_INTERNAL_ERROR, "Visitor shut down.");
208 return;
209 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500210 remaining_frame_length_ -= payload.length();
bnc70914262019-03-16 12:49:50 -0700211 break;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500212 }
213 case 0x1: { // HEADERS
QUICHE teama6ef0a62019-03-07 20:34:33 -0500214 QuicByteCount bytes_to_read = std::min<QuicByteCount>(
215 remaining_frame_length_, reader->BytesRemaining());
216 QuicStringPiece payload;
217 if (!reader->ReadStringPiece(&payload, bytes_to_read)) {
218 RaiseError(QUIC_INTERNAL_ERROR, "Unable to read data");
219 return;
220 }
bnc70914262019-03-16 12:49:50 -0700221 DCHECK(!payload.empty());
renjietang546a6282019-06-03 10:21:21 -0700222 if (!visitor_->OnHeadersFramePayload(payload)) {
223 RaiseError(QUIC_INTERNAL_ERROR, "Visitor shut down.");
224 return;
225 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500226 remaining_frame_length_ -= payload.length();
bnc70914262019-03-16 12:49:50 -0700227 break;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500228 }
229 case 0x2: { // PRIORITY
230 // TODO(rch): avoid buffering if the entire frame is present, and
231 // instead parse directly out of |reader|.
232 BufferFramePayload(reader);
bnc70914262019-03-16 12:49:50 -0700233 break;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500234 }
235 case 0x3: { // CANCEL_PUSH
QUICHE teama6ef0a62019-03-07 20:34:33 -0500236 BufferFramePayload(reader);
bnc70914262019-03-16 12:49:50 -0700237 break;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500238 }
239 case 0x4: { // SETTINGS
QUICHE teama6ef0a62019-03-07 20:34:33 -0500240 BufferFramePayload(reader);
bnc70914262019-03-16 12:49:50 -0700241 break;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500242 }
243 case 0x5: { // PUSH_PROMISE
244 if (current_frame_length_ == remaining_frame_length_) {
245 QuicByteCount bytes_remaining = reader->BytesRemaining();
246 PushId push_id;
247 // TODO(rch): Handle partial delivery of this field.
248 if (!reader->ReadVarInt62(&push_id)) {
249 RaiseError(QUIC_INTERNAL_ERROR, "Unable to read push_id");
250 return;
251 }
252 remaining_frame_length_ -= bytes_remaining - reader->BytesRemaining();
renjietang546a6282019-06-03 10:21:21 -0700253 if (!visitor_->OnPushPromiseFrameStart(push_id)) {
254 RaiseError(QUIC_INTERNAL_ERROR, "Visitor shut down.");
255 return;
256 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500257 }
bnc70914262019-03-16 12:49:50 -0700258 DCHECK_LT(remaining_frame_length_, current_frame_length_);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500259 QuicByteCount bytes_to_read = std::min<QuicByteCount>(
260 remaining_frame_length_, reader->BytesRemaining());
261 if (bytes_to_read == 0) {
bnc70914262019-03-16 12:49:50 -0700262 break;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500263 }
264 QuicStringPiece payload;
265 if (!reader->ReadStringPiece(&payload, bytes_to_read)) {
266 RaiseError(QUIC_INTERNAL_ERROR, "Unable to read data");
267 return;
268 }
bnc70914262019-03-16 12:49:50 -0700269 DCHECK(!payload.empty());
renjietang546a6282019-06-03 10:21:21 -0700270 if (!visitor_->OnPushPromiseFramePayload(payload)) {
271 RaiseError(QUIC_INTERNAL_ERROR, "Visitor shut down.");
272 return;
273 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500274 remaining_frame_length_ -= payload.length();
bnc70914262019-03-16 12:49:50 -0700275 break;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500276 }
277 case 0x7: { // GOAWAY
278 BufferFramePayload(reader);
bnc70914262019-03-16 12:49:50 -0700279 break;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500280 }
281
282 case 0xD: { // MAX_PUSH_ID
283 // TODO(rch): Handle partial delivery.
284 BufferFramePayload(reader);
bnc70914262019-03-16 12:49:50 -0700285 break;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500286 }
287
288 case 0xE: { // DUPLICATE_PUSH
289 BufferFramePayload(reader);
bnc70914262019-03-16 12:49:50 -0700290 break;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500291 }
292 // Reserved frame types.
293 // TODO(rch): Since these are actually the same behavior as the
294 // default, we probably don't need to special case them here?
295 case 0xB:
296 QUIC_FALLTHROUGH_INTENDED;
297 case 0xB + 0x1F:
298 QUIC_FALLTHROUGH_INTENDED;
299 case 0xB + 0x1F * 2:
300 QUIC_FALLTHROUGH_INTENDED;
301 case 0xB + 0x1F * 3:
302 QUIC_FALLTHROUGH_INTENDED;
303 case 0xB + 0x1F * 4:
304 QUIC_FALLTHROUGH_INTENDED;
305 case 0xB + 0x1F * 5:
306 QUIC_FALLTHROUGH_INTENDED;
307 case 0xB + 0x1F * 6:
308 QUIC_FALLTHROUGH_INTENDED;
309 case 0xB + 0x1F * 7:
310 QUIC_FALLTHROUGH_INTENDED;
311 default:
312 DiscardFramePayload(reader);
renjietangfcd91c02019-04-22 10:40:35 -0700313 return;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500314 }
bnc70914262019-03-16 12:49:50 -0700315
316 if (remaining_frame_length_ == 0) {
317 state_ = STATE_FINISH_PARSING;
318 }
319}
320
321void HttpDecoder::FinishParsing() {
322 DCHECK_EQ(0u, remaining_frame_length_);
323 switch (current_frame_type_) {
324 case 0x0: { // DATA
renjietang546a6282019-06-03 10:21:21 -0700325 if (!visitor_->OnDataFrameEnd()) {
326 RaiseError(QUIC_INTERNAL_ERROR, "Visitor shut down.");
327 return;
328 }
bnc70914262019-03-16 12:49:50 -0700329 break;
330 }
331 case 0x1: { // HEADERS
renjietang546a6282019-06-03 10:21:21 -0700332 if (!visitor_->OnHeadersFrameEnd()) {
333 RaiseError(QUIC_INTERNAL_ERROR, "Visitor shut down.");
334 return;
335 }
bnc70914262019-03-16 12:49:50 -0700336 break;
337 }
338 case 0x2: { // PRIORITY
339 // TODO(rch): avoid buffering if the entire frame is present, and
340 // instead parse directly out of |reader|.
341 PriorityFrame frame;
342 QuicDataReader reader(buffer_.data(), current_frame_length_);
343 if (!ParsePriorityFrame(&reader, &frame)) {
344 return;
345 }
renjietang546a6282019-06-03 10:21:21 -0700346 if (!visitor_->OnPriorityFrame(frame)) {
347 RaiseError(QUIC_INTERNAL_ERROR, "Visitor shut down.");
348 return;
349 }
bnc70914262019-03-16 12:49:50 -0700350 break;
351 }
352 case 0x3: { // CANCEL_PUSH
353 // TODO(rch): Handle partial delivery.
354 CancelPushFrame frame;
355 QuicDataReader reader(buffer_.data(), current_frame_length_);
356 if (!reader.ReadVarInt62(&frame.push_id)) {
357 RaiseError(QUIC_INTERNAL_ERROR, "Unable to read push_id");
358 return;
359 }
renjietang546a6282019-06-03 10:21:21 -0700360 if (!visitor_->OnCancelPushFrame(frame)) {
361 RaiseError(QUIC_INTERNAL_ERROR, "Visitor shut down.");
362 return;
363 }
bnc70914262019-03-16 12:49:50 -0700364 break;
365 }
366 case 0x4: { // SETTINGS
bnc70914262019-03-16 12:49:50 -0700367 SettingsFrame frame;
368 QuicDataReader reader(buffer_.data(), current_frame_length_);
369 if (!ParseSettingsFrame(&reader, &frame)) {
370 return;
371 }
renjietang546a6282019-06-03 10:21:21 -0700372 if (!visitor_->OnSettingsFrame(frame)) {
373 RaiseError(QUIC_INTERNAL_ERROR, "Visitor shut down.");
374 return;
375 }
bnc70914262019-03-16 12:49:50 -0700376 break;
377 }
378 case 0x5: { // PUSH_PROMISE
renjietang546a6282019-06-03 10:21:21 -0700379 if (!visitor_->OnPushPromiseFrameEnd()) {
380 RaiseError(QUIC_INTERNAL_ERROR, "Visitor shut down.");
381 return;
382 }
bnc70914262019-03-16 12:49:50 -0700383 break;
384 }
385 case 0x7: { // GOAWAY
386 QuicDataReader reader(buffer_.data(), current_frame_length_);
387 GoAwayFrame frame;
388 static_assert(!std::is_same<decltype(frame.stream_id), uint64_t>::value,
389 "Please remove local |stream_id| variable and pass "
390 "&frame.stream_id directly to ReadVarInt62() when changing "
391 "QuicStreamId from uint32_t to uint64_t.");
392 uint64_t stream_id;
393 if (!reader.ReadVarInt62(&stream_id)) {
394 RaiseError(QUIC_INTERNAL_ERROR, "Unable to read GOAWAY stream_id");
395 return;
396 }
397 frame.stream_id = static_cast<QuicStreamId>(stream_id);
renjietang546a6282019-06-03 10:21:21 -0700398 if (!visitor_->OnGoAwayFrame(frame)) {
399 RaiseError(QUIC_INTERNAL_ERROR, "Visitor shut down.");
400 return;
401 }
bnc70914262019-03-16 12:49:50 -0700402 break;
403 }
404
405 case 0xD: { // MAX_PUSH_ID
406 QuicDataReader reader(buffer_.data(), current_frame_length_);
407 MaxPushIdFrame frame;
408 if (!reader.ReadVarInt62(&frame.push_id)) {
409 RaiseError(QUIC_INTERNAL_ERROR, "Unable to read push_id");
410 return;
411 }
renjietang546a6282019-06-03 10:21:21 -0700412 if (!visitor_->OnMaxPushIdFrame(frame)) {
413 RaiseError(QUIC_INTERNAL_ERROR, "Visitor shut down.");
414 return;
415 }
bnc70914262019-03-16 12:49:50 -0700416 break;
417 }
418
419 case 0xE: { // DUPLICATE_PUSH
420 QuicDataReader reader(buffer_.data(), current_frame_length_);
421 DuplicatePushFrame frame;
422 if (!reader.ReadVarInt62(&frame.push_id)) {
423 RaiseError(QUIC_INTERNAL_ERROR, "Unable to read push_id");
424 return;
425 }
renjietang546a6282019-06-03 10:21:21 -0700426 if (!visitor_->OnDuplicatePushFrame(frame)) {
427 RaiseError(QUIC_INTERNAL_ERROR, "Visitor shut down.");
428 return;
429 }
bnc70914262019-03-16 12:49:50 -0700430 break;
431 }
432 }
433
renjietangbb98cbc2019-04-23 13:13:56 -0700434 current_length_field_length_ = 0;
renjietang2d475cf2019-04-18 17:03:37 -0700435 current_type_field_length_ = 0;
renjietangfcd91c02019-04-22 10:40:35 -0700436 state_ = STATE_READING_FRAME_TYPE;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500437}
438
439void HttpDecoder::DiscardFramePayload(QuicDataReader* reader) {
440 QuicByteCount bytes_to_read = std::min<QuicByteCount>(
441 remaining_frame_length_, reader->BytesRemaining());
442 QuicStringPiece payload;
443 if (!reader->ReadStringPiece(&payload, bytes_to_read)) {
444 RaiseError(QUIC_INTERNAL_ERROR, "Unable to read frame payload");
445 return;
446 }
447 remaining_frame_length_ -= payload.length();
448 if (remaining_frame_length_ == 0) {
renjietangfcd91c02019-04-22 10:40:35 -0700449 state_ = STATE_READING_FRAME_TYPE;
renjietangbb98cbc2019-04-23 13:13:56 -0700450 current_length_field_length_ = 0;
renjietang2d475cf2019-04-18 17:03:37 -0700451 current_type_field_length_ = 0;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500452 }
453}
454
455void HttpDecoder::BufferFramePayload(QuicDataReader* reader) {
456 if (current_frame_length_ == remaining_frame_length_) {
457 buffer_.erase(buffer_.size());
458 buffer_.reserve(current_frame_length_);
459 }
460 QuicByteCount bytes_to_read = std::min<QuicByteCount>(
461 remaining_frame_length_, reader->BytesRemaining());
462 if (!reader->ReadBytes(
463 &(buffer_[0]) + current_frame_length_ - remaining_frame_length_,
464 bytes_to_read)) {
465 RaiseError(QUIC_INTERNAL_ERROR, "Unable to read frame payload");
466 return;
467 }
468 remaining_frame_length_ -= bytes_to_read;
469}
470
471void HttpDecoder::BufferFrameLength(QuicDataReader* reader) {
renjietangbb98cbc2019-04-23 13:13:56 -0700472 if (current_length_field_length_ == remaining_length_field_length_) {
473 length_buffer_.fill(0);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500474 }
475 QuicByteCount bytes_to_read = std::min<QuicByteCount>(
476 remaining_length_field_length_, reader->BytesRemaining());
renjietangbb98cbc2019-04-23 13:13:56 -0700477 if (!reader->ReadBytes(length_buffer_.data() + current_length_field_length_ -
QUICHE teama6ef0a62019-03-07 20:34:33 -0500478 remaining_length_field_length_,
479 bytes_to_read)) {
renjietangbb98cbc2019-04-23 13:13:56 -0700480 RaiseError(QUIC_INTERNAL_ERROR, "Unable to buffer frame length bytes.");
QUICHE teama6ef0a62019-03-07 20:34:33 -0500481 visitor_->OnError(this);
482 return;
483 }
484 remaining_length_field_length_ -= bytes_to_read;
485}
486
renjietang2d475cf2019-04-18 17:03:37 -0700487void HttpDecoder::BufferFrameType(QuicDataReader* reader) {
488 if (current_type_field_length_ == remaining_type_field_length_) {
489 type_buffer_.fill(0);
490 }
491 QuicByteCount bytes_to_read = std::min<QuicByteCount>(
492 remaining_type_field_length_, reader->BytesRemaining());
493 if (!reader->ReadBytes(type_buffer_.data() + current_type_field_length_ -
494 remaining_type_field_length_,
495 bytes_to_read)) {
496 RaiseError(QUIC_INTERNAL_ERROR, "Unable to buffer frame type bytes.");
497 visitor_->OnError(this);
498 return;
499 }
500 remaining_type_field_length_ -= bytes_to_read;
501}
502
vasilvvc48c8712019-03-11 13:38:16 -0700503void HttpDecoder::RaiseError(QuicErrorCode error, std::string error_detail) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500504 state_ = STATE_ERROR;
505 error_ = error;
506 error_detail_ = std::move(error_detail);
507}
508
509bool HttpDecoder::ParsePriorityFrame(QuicDataReader* reader,
510 PriorityFrame* frame) {
511 uint8_t flags;
512 if (!reader->ReadUInt8(&flags)) {
513 RaiseError(QUIC_INTERNAL_ERROR, "Unable to read priority frame flags");
514 return false;
515 }
516
517 frame->prioritized_type =
518 static_cast<PriorityElementType>(ExtractBits(flags, 2, 6));
519 frame->dependency_type =
520 static_cast<PriorityElementType>(ExtractBits(flags, 2, 4));
521 frame->exclusive = flags % 2 == 1;
renjietangec095762019-06-19 14:35:02 -0700522 if (frame->prioritized_type != ROOT_OF_TREE &&
523 !reader->ReadVarInt62(&frame->prioritized_element_id)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500524 RaiseError(QUIC_INTERNAL_ERROR, "Unable to read prioritized_element_id");
525 return false;
526 }
renjietangec095762019-06-19 14:35:02 -0700527 if (frame->dependency_type != ROOT_OF_TREE &&
528 !reader->ReadVarInt62(&frame->element_dependency_id)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500529 RaiseError(QUIC_INTERNAL_ERROR, "Unable to read element_dependency_id");
530 return false;
531 }
532 if (!reader->ReadUInt8(&frame->weight)) {
533 RaiseError(QUIC_INTERNAL_ERROR, "Unable to read priority frame weight");
534 return false;
535 }
536 return true;
537}
538
539bool HttpDecoder::ParseSettingsFrame(QuicDataReader* reader,
540 SettingsFrame* frame) {
541 while (!reader->IsDoneReading()) {
renjietang3b3e3b32019-04-22 18:01:20 -0700542 uint64_t id;
543 if (!reader->ReadVarInt62(&id)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500544 RaiseError(QUIC_INTERNAL_ERROR,
545 "Unable to read settings frame identifier");
546 return false;
547 }
548 uint64_t content;
549 if (!reader->ReadVarInt62(&content)) {
550 RaiseError(QUIC_INTERNAL_ERROR, "Unable to read settings frame content");
551 return false;
552 }
553 frame->values[id] = content;
554 }
555 return true;
556}
557
renjietang4ab9d9f2019-04-10 14:30:26 -0700558QuicByteCount HttpDecoder::MaxFrameLength(uint8_t frame_type) {
559 switch (frame_type) {
560 case 0x2: // PRIORITY
561 return kPriorityFirstByteLength + VARIABLE_LENGTH_INTEGER_LENGTH_8 * 2 +
562 kPriorityWeightLength;
563 case 0x3: // CANCEL_PUSH
564 return sizeof(PushId);
565 case 0x4: // SETTINGS
566 // This limit is arbitrary.
567 return 1024 * 1024;
568 case 0x7: // GOAWAY
569 return sizeof(QuicStreamId);
570 case 0xD: // MAX_PUSH_ID
571 return sizeof(PushId);
572 case 0xE: // DUPLICATE_PUSH
573 return sizeof(PushId);
574 default:
575 // Other frames require no data buffering, so it's safe to have no limit.
576 return std::numeric_limits<QuicByteCount>::max();
577 }
578}
579
QUICHE teama6ef0a62019-03-07 20:34:33 -0500580} // namespace quic