blob: 05d580e20e1a4e12d9b544bff1a720d16dec00f3 [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
QUICHE team5be974e2020-12-29 18:35:24 -05005#include "quic/core/http/http_decoder.h"
renjietang4ab9d9f2019-04-10 14:30:26 -07006
renjietang5843bfd2019-10-10 13:24:57 -07007#include <memory>
bnc463f2352019-10-10 04:49:34 -07008#include <utility>
9
vasilvvfe1c8f32020-10-19 14:10:59 -070010#include "absl/base/macros.h"
vasilvv72b789c2020-10-27 17:39:17 -070011#include "absl/strings/escaping.h"
vasilvva163b382020-12-04 11:47:46 -080012#include "absl/strings/str_cat.h"
vasilvve2707e32020-10-08 12:27:46 -070013#include "absl/strings/string_view.h"
QUICHE team5be974e2020-12-29 18:35:24 -050014#include "quic/core/http/http_encoder.h"
15#include "quic/core/http/http_frames.h"
16#include "quic/core/quic_data_writer.h"
17#include "quic/core/quic_versions.h"
vasilvvb7b2d4f2021-04-05 18:07:13 -070018#include "quic/platform/api/quic_expect_bug.h"
QUICHE team5be974e2020-12-29 18:35:24 -050019#include "quic/platform/api/quic_flags.h"
20#include "quic/platform/api/quic_test.h"
21#include "quic/test_tools/quic_test_utils.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050022
renjietang546a6282019-06-03 10:21:21 -070023using ::testing::_;
bnc9be5c212020-12-11 12:38:20 -080024using ::testing::AnyNumber;
bnc58ac6502019-07-17 07:46:38 -070025using ::testing::Eq;
renjietang546a6282019-06-03 10:21:21 -070026using ::testing::InSequence;
27using ::testing::Return;
QUICHE teama6ef0a62019-03-07 20:34:33 -050028
29namespace quic {
30
bnc62c32b42019-06-24 16:06:41 -070031namespace test {
32
33class HttpDecoderPeer {
34 public:
35 static uint64_t current_frame_type(HttpDecoder* decoder) {
36 return decoder->current_frame_type_;
37 }
38};
39
QUICHE teama6ef0a62019-03-07 20:34:33 -050040class MockVisitor : public HttpDecoder::Visitor {
41 public:
bnc62c32b42019-06-24 16:06:41 -070042 ~MockVisitor() override = default;
QUICHE teama6ef0a62019-03-07 20:34:33 -050043
44 // Called if an error is detected.
wub713afae2020-04-27 07:48:31 -070045 MOCK_METHOD(void, OnError, (HttpDecoder*), (override));
QUICHE teama6ef0a62019-03-07 20:34:33 -050046
wub713afae2020-04-27 07:48:31 -070047 MOCK_METHOD(bool,
48 OnCancelPushFrame,
49 (const CancelPushFrame& frame),
50 (override));
51 MOCK_METHOD(bool,
52 OnMaxPushIdFrame,
53 (const MaxPushIdFrame& frame),
54 (override));
55 MOCK_METHOD(bool, OnGoAwayFrame, (const GoAwayFrame& frame), (override));
56 MOCK_METHOD(bool,
57 OnSettingsFrameStart,
58 (QuicByteCount header_length),
59 (override));
60 MOCK_METHOD(bool, OnSettingsFrame, (const SettingsFrame& frame), (override));
QUICHE teama6ef0a62019-03-07 20:34:33 -050061
wub713afae2020-04-27 07:48:31 -070062 MOCK_METHOD(bool,
63 OnDataFrameStart,
64 (QuicByteCount header_length, QuicByteCount payload_length),
65 (override));
66 MOCK_METHOD(bool,
67 OnDataFramePayload,
vasilvve2707e32020-10-08 12:27:46 -070068 (absl::string_view payload),
wub713afae2020-04-27 07:48:31 -070069 (override));
70 MOCK_METHOD(bool, OnDataFrameEnd, (), (override));
QUICHE teama6ef0a62019-03-07 20:34:33 -050071
wub713afae2020-04-27 07:48:31 -070072 MOCK_METHOD(bool,
73 OnHeadersFrameStart,
74 (QuicByteCount header_length, QuicByteCount payload_length),
75 (override));
76 MOCK_METHOD(bool,
77 OnHeadersFramePayload,
vasilvve2707e32020-10-08 12:27:46 -070078 (absl::string_view payload),
wub713afae2020-04-27 07:48:31 -070079 (override));
80 MOCK_METHOD(bool, OnHeadersFrameEnd, (), (override));
QUICHE teama6ef0a62019-03-07 20:34:33 -050081
wub713afae2020-04-27 07:48:31 -070082 MOCK_METHOD(bool,
83 OnPushPromiseFrameStart,
84 (QuicByteCount header_length),
85 (override));
86 MOCK_METHOD(bool,
87 OnPushPromiseFramePushId,
88 (PushId push_id,
89 QuicByteCount push_id_length,
90 QuicByteCount header_block_length),
91 (override));
92 MOCK_METHOD(bool,
93 OnPushPromiseFramePayload,
vasilvve2707e32020-10-08 12:27:46 -070094 (absl::string_view payload),
wub713afae2020-04-27 07:48:31 -070095 (override));
96 MOCK_METHOD(bool, OnPushPromiseFrameEnd, (), (override));
bncbf3dbe52019-07-17 05:17:41 -070097
wub713afae2020-04-27 07:48:31 -070098 MOCK_METHOD(bool,
99 OnPriorityUpdateFrameStart,
100 (QuicByteCount header_length),
101 (override));
102 MOCK_METHOD(bool,
103 OnPriorityUpdateFrame,
104 (const PriorityUpdateFrame& frame),
105 (override));
bnc51e89622020-01-10 10:40:32 -0800106
wub713afae2020-04-27 07:48:31 -0700107 MOCK_METHOD(bool,
bnc9be5c212020-12-11 12:38:20 -0800108 OnAcceptChFrameStart,
109 (QuicByteCount header_length),
110 (override));
111 MOCK_METHOD(bool, OnAcceptChFrame, (const AcceptChFrame& frame), (override));
vasilvvb7b2d4f2021-04-05 18:07:13 -0700112 MOCK_METHOD(void,
113 OnWebTransportStreamFrameType,
114 (QuicByteCount header_length, WebTransportSessionId session_id),
115 (override));
bnc9be5c212020-12-11 12:38:20 -0800116
117 MOCK_METHOD(bool,
wub713afae2020-04-27 07:48:31 -0700118 OnUnknownFrameStart,
119 (uint64_t frame_type,
120 QuicByteCount header_length,
121 QuicByteCount payload_length),
122 (override));
123 MOCK_METHOD(bool,
124 OnUnknownFramePayload,
vasilvve2707e32020-10-08 12:27:46 -0700125 (absl::string_view payload),
wub713afae2020-04-27 07:48:31 -0700126 (override));
127 MOCK_METHOD(bool, OnUnknownFrameEnd, (), (override));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500128};
129
130class HttpDecoderTest : public QuicTest {
131 public:
bnca9bb4692019-07-09 17:29:48 -0700132 HttpDecoderTest() : decoder_(&visitor_) {
renjietang546a6282019-06-03 10:21:21 -0700133 ON_CALL(visitor_, OnCancelPushFrame(_)).WillByDefault(Return(true));
134 ON_CALL(visitor_, OnMaxPushIdFrame(_)).WillByDefault(Return(true));
135 ON_CALL(visitor_, OnGoAwayFrame(_)).WillByDefault(Return(true));
136 ON_CALL(visitor_, OnSettingsFrameStart(_)).WillByDefault(Return(true));
137 ON_CALL(visitor_, OnSettingsFrame(_)).WillByDefault(Return(true));
bnc32f36f92020-03-27 15:48:45 -0700138 ON_CALL(visitor_, OnDataFrameStart(_, _)).WillByDefault(Return(true));
renjietang546a6282019-06-03 10:21:21 -0700139 ON_CALL(visitor_, OnDataFramePayload(_)).WillByDefault(Return(true));
140 ON_CALL(visitor_, OnDataFrameEnd()).WillByDefault(Return(true));
bnc32f36f92020-03-27 15:48:45 -0700141 ON_CALL(visitor_, OnHeadersFrameStart(_, _)).WillByDefault(Return(true));
renjietang546a6282019-06-03 10:21:21 -0700142 ON_CALL(visitor_, OnHeadersFramePayload(_)).WillByDefault(Return(true));
143 ON_CALL(visitor_, OnHeadersFrameEnd()).WillByDefault(Return(true));
bncf0db6542019-09-23 11:18:28 -0700144 ON_CALL(visitor_, OnPushPromiseFrameStart(_)).WillByDefault(Return(true));
bnc32f36f92020-03-27 15:48:45 -0700145 ON_CALL(visitor_, OnPushPromiseFramePushId(_, _, _))
renjietangf4f47122019-07-22 12:08:53 -0700146 .WillByDefault(Return(true));
renjietang546a6282019-06-03 10:21:21 -0700147 ON_CALL(visitor_, OnPushPromiseFramePayload(_)).WillByDefault(Return(true));
148 ON_CALL(visitor_, OnPushPromiseFrameEnd()).WillByDefault(Return(true));
bnc51e89622020-01-10 10:40:32 -0800149 ON_CALL(visitor_, OnPriorityUpdateFrameStart(_))
150 .WillByDefault(Return(true));
151 ON_CALL(visitor_, OnPriorityUpdateFrame(_)).WillByDefault(Return(true));
bnc9be5c212020-12-11 12:38:20 -0800152 ON_CALL(visitor_, OnAcceptChFrameStart(_)).WillByDefault(Return(true));
153 ON_CALL(visitor_, OnAcceptChFrame(_)).WillByDefault(Return(true));
bnc32f36f92020-03-27 15:48:45 -0700154 ON_CALL(visitor_, OnUnknownFrameStart(_, _, _)).WillByDefault(Return(true));
bncbf3dbe52019-07-17 05:17:41 -0700155 ON_CALL(visitor_, OnUnknownFramePayload(_)).WillByDefault(Return(true));
156 ON_CALL(visitor_, OnUnknownFrameEnd()).WillByDefault(Return(true));
renjietang546a6282019-06-03 10:21:21 -0700157 }
bnc62c32b42019-06-24 16:06:41 -0700158 ~HttpDecoderTest() override = default;
159
160 uint64_t current_frame_type() {
161 return HttpDecoderPeer::current_frame_type(&decoder_);
162 }
renjietang546a6282019-06-03 10:21:21 -0700163
bncb9d07d92019-06-25 17:43:49 -0700164 // Process |input| in a single call to HttpDecoder::ProcessInput().
vasilvve2707e32020-10-08 12:27:46 -0700165 QuicByteCount ProcessInput(absl::string_view input) {
bnc4f6d01a2019-06-25 06:03:54 -0700166 return decoder_.ProcessInput(input.data(), input.size());
167 }
168
169 // Feed |input| to |decoder_| one character at a time,
170 // verifying that each character gets processed.
vasilvve2707e32020-10-08 12:27:46 -0700171 void ProcessInputCharByChar(absl::string_view input) {
bnc4f6d01a2019-06-25 06:03:54 -0700172 for (char c : input) {
173 EXPECT_EQ(1u, decoder_.ProcessInput(&c, 1));
174 }
175 }
176
bncb9d07d92019-06-25 17:43:49 -0700177 // Append garbage to |input|, then process it in a single call to
178 // HttpDecoder::ProcessInput(). Verify that garbage is not read.
vasilvve2707e32020-10-08 12:27:46 -0700179 QuicByteCount ProcessInputWithGarbageAppended(absl::string_view input) {
vasilvva163b382020-12-04 11:47:46 -0800180 std::string input_with_garbage_appended = absl::StrCat(input, "blahblah");
bncb9d07d92019-06-25 17:43:49 -0700181 QuicByteCount processed_bytes = ProcessInput(input_with_garbage_appended);
182
183 // Guaranteed by HttpDecoder::ProcessInput() contract.
vasilvvf8035162021-02-01 14:49:14 -0800184 QUICHE_DCHECK_LE(processed_bytes, input_with_garbage_appended.size());
bncb9d07d92019-06-25 17:43:49 -0700185
186 // Caller should set up visitor to pause decoding
187 // before HttpDecoder would read garbage.
188 EXPECT_LE(processed_bytes, input.size());
189
190 return processed_bytes;
191 }
192
QUICHE teama6ef0a62019-03-07 20:34:33 -0500193 testing::StrictMock<MockVisitor> visitor_;
bnca9bb4692019-07-09 17:29:48 -0700194 HttpDecoder decoder_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500195};
196
197TEST_F(HttpDecoderTest, InitialState) {
bncc5769502019-11-27 10:01:44 -0800198 EXPECT_THAT(decoder_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500199 EXPECT_EQ("", decoder_.error_detail());
200}
201
bncbf3dbe52019-07-17 05:17:41 -0700202TEST_F(HttpDecoderTest, UnknownFrame) {
renjietang2d475cf2019-04-18 17:03:37 -0700203 std::unique_ptr<char[]> input;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500204
bncbf3dbe52019-07-17 05:17:41 -0700205 const QuicByteCount payload_lengths[] = {0, 14, 100};
206 const uint64_t frame_types[] = {
207 0x21, 0x40, 0x5f, 0x7e, 0x9d, // some reserved frame types
renjietang0c9148a2020-09-30 12:59:14 -0700208 0x6f, 0x14 // some unknown, not reserved frame types
bncbf3dbe52019-07-17 05:17:41 -0700209 };
210
211 for (auto payload_length : payload_lengths) {
212 std::string data(payload_length, 'a');
213
214 for (auto frame_type : frame_types) {
215 const QuicByteCount total_length =
216 QuicDataWriter::GetVarInt62Len(frame_type) +
217 QuicDataWriter::GetVarInt62Len(payload_length) + payload_length;
vasilvv0fc587f2019-09-06 13:33:08 -0700218 input = std::make_unique<char[]>(total_length);
bncbf3dbe52019-07-17 05:17:41 -0700219
220 QuicDataWriter writer(total_length, input.get());
221 writer.WriteVarInt62(frame_type);
222 writer.WriteVarInt62(payload_length);
223 const QuicByteCount header_length = writer.length();
224 if (payload_length > 0) {
225 writer.WriteStringPiece(data);
226 }
227
bnc32f36f92020-03-27 15:48:45 -0700228 EXPECT_CALL(visitor_, OnUnknownFrameStart(frame_type, header_length,
229 payload_length));
bncbf3dbe52019-07-17 05:17:41 -0700230 if (payload_length > 0) {
bnc58ac6502019-07-17 07:46:38 -0700231 EXPECT_CALL(visitor_, OnUnknownFramePayload(Eq(data)));
bncbf3dbe52019-07-17 05:17:41 -0700232 }
233 EXPECT_CALL(visitor_, OnUnknownFrameEnd());
234
235 EXPECT_EQ(total_length, decoder_.ProcessInput(input.get(), total_length));
236
bncc5769502019-11-27 10:01:44 -0800237 EXPECT_THAT(decoder_.error(), IsQuicNoError());
bncbf3dbe52019-07-17 05:17:41 -0700238 ASSERT_EQ("", decoder_.error_detail());
239 EXPECT_EQ(frame_type, current_frame_type());
240 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500241 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500242}
243
244TEST_F(HttpDecoderTest, CancelPush) {
bncb9d07d92019-06-25 17:43:49 -0700245 InSequence s;
vasilvv72b789c2020-10-27 17:39:17 -0700246 std::string input = absl::HexStringToBytes(
bnc11907852019-09-20 05:26:08 -0700247 "03" // type (CANCEL_PUSH)
248 "01" // length
249 "01"); // Push Id
QUICHE teama6ef0a62019-03-07 20:34:33 -0500250
bnc92df0922021-04-27 14:23:39 -0700251 if (GetQuicReloadableFlag(quic_error_on_http3_push)) {
252 EXPECT_CALL(visitor_, OnError(&decoder_));
253 EXPECT_EQ(1u, ProcessInput(input));
254 EXPECT_THAT(decoder_.error(), IsError(QUIC_HTTP_FRAME_ERROR));
255 EXPECT_EQ("CANCEL_PUSH frame received.", decoder_.error_detail());
256 return;
257 }
258
bncb9d07d92019-06-25 17:43:49 -0700259 // Visitor pauses processing.
260 EXPECT_CALL(visitor_, OnCancelPushFrame(CancelPushFrame({1})))
261 .WillOnce(Return(false));
262 EXPECT_EQ(input.size(), ProcessInputWithGarbageAppended(input));
bncc5769502019-11-27 10:01:44 -0800263 EXPECT_THAT(decoder_.error(), IsQuicNoError());
bncb9d07d92019-06-25 17:43:49 -0700264 EXPECT_EQ("", decoder_.error_detail());
265
QUICHE teama6ef0a62019-03-07 20:34:33 -0500266 // Process the full frame.
267 EXPECT_CALL(visitor_, OnCancelPushFrame(CancelPushFrame({1})));
bnc4f6d01a2019-06-25 06:03:54 -0700268 EXPECT_EQ(input.size(), ProcessInput(input));
bncc5769502019-11-27 10:01:44 -0800269 EXPECT_THAT(decoder_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500270 EXPECT_EQ("", decoder_.error_detail());
271
bnc4f6d01a2019-06-25 06:03:54 -0700272 // Process the frame incrementally.
QUICHE teama6ef0a62019-03-07 20:34:33 -0500273 EXPECT_CALL(visitor_, OnCancelPushFrame(CancelPushFrame({1})));
bnc4f6d01a2019-06-25 06:03:54 -0700274 ProcessInputCharByChar(input);
bncc5769502019-11-27 10:01:44 -0800275 EXPECT_THAT(decoder_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500276 EXPECT_EQ("", decoder_.error_detail());
277}
278
279TEST_F(HttpDecoderTest, PushPromiseFrame) {
bncb9d07d92019-06-25 17:43:49 -0700280 InSequence s;
vasilvva163b382020-12-04 11:47:46 -0800281 std::string input =
282 absl::StrCat(absl::HexStringToBytes("05" // type (PUSH PROMISE)
283 "0f" // length
284 "C000000000000101"), // push id 257
285 "Headers"); // headers
QUICHE teama6ef0a62019-03-07 20:34:33 -0500286
bnc92df0922021-04-27 14:23:39 -0700287 if (GetQuicReloadableFlag(quic_error_on_http3_push)) {
288 EXPECT_CALL(visitor_, OnError(&decoder_));
289 EXPECT_EQ(1u, ProcessInput(input));
290 EXPECT_THAT(decoder_.error(), IsError(QUIC_HTTP_FRAME_ERROR));
291 EXPECT_EQ("PUSH_PROMISE frame received.", decoder_.error_detail());
292 return;
293 }
294
bncb9d07d92019-06-25 17:43:49 -0700295 // Visitor pauses processing.
bncf0db6542019-09-23 11:18:28 -0700296 EXPECT_CALL(visitor_, OnPushPromiseFrameStart(2)).WillOnce(Return(false));
bnc32f36f92020-03-27 15:48:45 -0700297 EXPECT_CALL(visitor_, OnPushPromiseFramePushId(257, 8, 7))
renjietangf4f47122019-07-22 12:08:53 -0700298 .WillOnce(Return(false));
vasilvve2707e32020-10-08 12:27:46 -0700299 absl::string_view remaining_input(input);
bncb9d07d92019-06-25 17:43:49 -0700300 QuicByteCount processed_bytes =
301 ProcessInputWithGarbageAppended(remaining_input);
bncf0db6542019-09-23 11:18:28 -0700302 EXPECT_EQ(2u, processed_bytes);
303 remaining_input = remaining_input.substr(processed_bytes);
304 processed_bytes = ProcessInputWithGarbageAppended(remaining_input);
305 EXPECT_EQ(8u, processed_bytes);
bncb9d07d92019-06-25 17:43:49 -0700306 remaining_input = remaining_input.substr(processed_bytes);
307
vasilvve2707e32020-10-08 12:27:46 -0700308 EXPECT_CALL(visitor_, OnPushPromiseFramePayload(absl::string_view("Headers")))
bncb9d07d92019-06-25 17:43:49 -0700309 .WillOnce(Return(false));
310 processed_bytes = ProcessInputWithGarbageAppended(remaining_input);
311 EXPECT_EQ(remaining_input.size(), processed_bytes);
312
313 EXPECT_CALL(visitor_, OnPushPromiseFrameEnd()).WillOnce(Return(false));
314 EXPECT_EQ(0u, ProcessInputWithGarbageAppended(""));
bncc5769502019-11-27 10:01:44 -0800315 EXPECT_THAT(decoder_.error(), IsQuicNoError());
bncb9d07d92019-06-25 17:43:49 -0700316 EXPECT_EQ("", decoder_.error_detail());
317
QUICHE teama6ef0a62019-03-07 20:34:33 -0500318 // Process the full frame.
bncf0db6542019-09-23 11:18:28 -0700319 EXPECT_CALL(visitor_, OnPushPromiseFrameStart(2));
bnc32f36f92020-03-27 15:48:45 -0700320 EXPECT_CALL(visitor_, OnPushPromiseFramePushId(257, 8, 7));
dmcardleba2fb7e2019-12-13 07:44:34 -0800321 EXPECT_CALL(visitor_,
vasilvve2707e32020-10-08 12:27:46 -0700322 OnPushPromiseFramePayload(absl::string_view("Headers")));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500323 EXPECT_CALL(visitor_, OnPushPromiseFrameEnd());
bnc4f6d01a2019-06-25 06:03:54 -0700324 EXPECT_EQ(input.size(), ProcessInput(input));
bncc5769502019-11-27 10:01:44 -0800325 EXPECT_THAT(decoder_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500326 EXPECT_EQ("", decoder_.error_detail());
327
bnc4f6d01a2019-06-25 06:03:54 -0700328 // Process the frame incrementally.
bncf0db6542019-09-23 11:18:28 -0700329 EXPECT_CALL(visitor_, OnPushPromiseFrameStart(2));
bnc32f36f92020-03-27 15:48:45 -0700330 EXPECT_CALL(visitor_, OnPushPromiseFramePushId(257, 8, 7));
vasilvve2707e32020-10-08 12:27:46 -0700331 EXPECT_CALL(visitor_, OnPushPromiseFramePayload(absl::string_view("H")));
332 EXPECT_CALL(visitor_, OnPushPromiseFramePayload(absl::string_view("e")));
333 EXPECT_CALL(visitor_, OnPushPromiseFramePayload(absl::string_view("a")));
334 EXPECT_CALL(visitor_, OnPushPromiseFramePayload(absl::string_view("d")));
335 EXPECT_CALL(visitor_, OnPushPromiseFramePayload(absl::string_view("e")));
336 EXPECT_CALL(visitor_, OnPushPromiseFramePayload(absl::string_view("r")));
337 EXPECT_CALL(visitor_, OnPushPromiseFramePayload(absl::string_view("s")));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500338 EXPECT_CALL(visitor_, OnPushPromiseFrameEnd());
bnc4f6d01a2019-06-25 06:03:54 -0700339 ProcessInputCharByChar(input);
bncc5769502019-11-27 10:01:44 -0800340 EXPECT_THAT(decoder_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500341 EXPECT_EQ("", decoder_.error_detail());
renjietang857362b2019-08-09 09:52:35 -0700342
343 // Process push id incrementally and append headers with last byte of push id.
bncf0db6542019-09-23 11:18:28 -0700344 EXPECT_CALL(visitor_, OnPushPromiseFrameStart(2));
bnc32f36f92020-03-27 15:48:45 -0700345 EXPECT_CALL(visitor_, OnPushPromiseFramePushId(257, 8, 7));
dmcardleba2fb7e2019-12-13 07:44:34 -0800346 EXPECT_CALL(visitor_,
vasilvve2707e32020-10-08 12:27:46 -0700347 OnPushPromiseFramePayload(absl::string_view("Headers")));
renjietang857362b2019-08-09 09:52:35 -0700348 EXPECT_CALL(visitor_, OnPushPromiseFrameEnd());
349 ProcessInputCharByChar(input.substr(0, 9));
350 EXPECT_EQ(8u, ProcessInput(input.substr(9)));
bncc5769502019-11-27 10:01:44 -0800351 EXPECT_THAT(decoder_.error(), IsQuicNoError());
renjietang857362b2019-08-09 09:52:35 -0700352 EXPECT_EQ("", decoder_.error_detail());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500353}
354
bncf0db6542019-09-23 11:18:28 -0700355TEST_F(HttpDecoderTest, CorruptPushPromiseFrame) {
bnc92df0922021-04-27 14:23:39 -0700356 if (GetQuicReloadableFlag(quic_error_on_http3_push)) {
357 return;
358 }
359
bncf0db6542019-09-23 11:18:28 -0700360 InSequence s;
361
vasilvv72b789c2020-10-27 17:39:17 -0700362 std::string input = absl::HexStringToBytes(
bncf0db6542019-09-23 11:18:28 -0700363 "05" // type (PUSH_PROMISE)
364 "01" // length
365 "40"); // first byte of two-byte varint push id
366
367 {
368 HttpDecoder decoder(&visitor_);
369 EXPECT_CALL(visitor_, OnPushPromiseFrameStart(2));
370 EXPECT_CALL(visitor_, OnError(&decoder));
371
372 decoder.ProcessInput(input.data(), input.size());
373
bncdfabdfb2020-01-17 17:46:40 -0800374 EXPECT_THAT(decoder.error(), IsError(QUIC_HTTP_FRAME_ERROR));
375 EXPECT_EQ("Unable to read PUSH_PROMISE push_id.", decoder.error_detail());
bncf0db6542019-09-23 11:18:28 -0700376 }
377 {
378 HttpDecoder decoder(&visitor_);
379 EXPECT_CALL(visitor_, OnPushPromiseFrameStart(2));
380 EXPECT_CALL(visitor_, OnError(&decoder));
381
382 for (auto c : input) {
383 decoder.ProcessInput(&c, 1);
384 }
385
bncdfabdfb2020-01-17 17:46:40 -0800386 EXPECT_THAT(decoder.error(), IsError(QUIC_HTTP_FRAME_ERROR));
387 EXPECT_EQ("Unable to read PUSH_PROMISE push_id.", decoder.error_detail());
bncf0db6542019-09-23 11:18:28 -0700388 }
389}
390
QUICHE teama6ef0a62019-03-07 20:34:33 -0500391TEST_F(HttpDecoderTest, MaxPushId) {
bncb9d07d92019-06-25 17:43:49 -0700392 InSequence s;
vasilvv72b789c2020-10-27 17:39:17 -0700393 std::string input = absl::HexStringToBytes(
bnc11907852019-09-20 05:26:08 -0700394 "0D" // type (MAX_PUSH_ID)
395 "01" // length
396 "01"); // Push Id
QUICHE teama6ef0a62019-03-07 20:34:33 -0500397
bncb9d07d92019-06-25 17:43:49 -0700398 // Visitor pauses processing.
399 EXPECT_CALL(visitor_, OnMaxPushIdFrame(MaxPushIdFrame({1})))
400 .WillOnce(Return(false));
401 EXPECT_EQ(input.size(), ProcessInputWithGarbageAppended(input));
bncc5769502019-11-27 10:01:44 -0800402 EXPECT_THAT(decoder_.error(), IsQuicNoError());
bncb9d07d92019-06-25 17:43:49 -0700403 EXPECT_EQ("", decoder_.error_detail());
404
QUICHE teama6ef0a62019-03-07 20:34:33 -0500405 // Process the full frame.
406 EXPECT_CALL(visitor_, OnMaxPushIdFrame(MaxPushIdFrame({1})));
bnc4f6d01a2019-06-25 06:03:54 -0700407 EXPECT_EQ(input.size(), ProcessInput(input));
bncc5769502019-11-27 10:01:44 -0800408 EXPECT_THAT(decoder_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500409 EXPECT_EQ("", decoder_.error_detail());
410
bnc4f6d01a2019-06-25 06:03:54 -0700411 // Process the frame incrementally.
QUICHE teama6ef0a62019-03-07 20:34:33 -0500412 EXPECT_CALL(visitor_, OnMaxPushIdFrame(MaxPushIdFrame({1})));
bnc4f6d01a2019-06-25 06:03:54 -0700413 ProcessInputCharByChar(input);
bncc5769502019-11-27 10:01:44 -0800414 EXPECT_THAT(decoder_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500415 EXPECT_EQ("", decoder_.error_detail());
416}
417
QUICHE teama6ef0a62019-03-07 20:34:33 -0500418TEST_F(HttpDecoderTest, SettingsFrame) {
bncb9d07d92019-06-25 17:43:49 -0700419 InSequence s;
vasilvv72b789c2020-10-27 17:39:17 -0700420 std::string input = absl::HexStringToBytes(
bnc11907852019-09-20 05:26:08 -0700421 "04" // type (SETTINGS)
422 "07" // length
bnc2e6967f2019-10-03 12:34:33 -0700423 "01" // identifier (SETTINGS_QPACK_MAX_TABLE_CAPACITY)
bnc11907852019-09-20 05:26:08 -0700424 "02" // content
425 "06" // identifier (SETTINGS_MAX_HEADER_LIST_SIZE)
426 "05" // content
427 "4100" // identifier, encoded on 2 bytes (0x40), value is 256 (0x100)
428 "04"); // content
QUICHE teama6ef0a62019-03-07 20:34:33 -0500429
430 SettingsFrame frame;
bnc2e6967f2019-10-03 12:34:33 -0700431 frame.values[1] = 2;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500432 frame.values[6] = 5;
renjietang3b3e3b32019-04-22 18:01:20 -0700433 frame.values[256] = 4;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500434
bncb9d07d92019-06-25 17:43:49 -0700435 // Visitor pauses processing.
vasilvve2707e32020-10-08 12:27:46 -0700436 absl::string_view remaining_input(input);
bnca2b13be2019-07-31 12:04:20 -0700437 EXPECT_CALL(visitor_, OnSettingsFrameStart(2)).WillOnce(Return(false));
bncb9d07d92019-06-25 17:43:49 -0700438 QuicByteCount processed_bytes =
439 ProcessInputWithGarbageAppended(remaining_input);
440 EXPECT_EQ(2u, processed_bytes);
441 remaining_input = remaining_input.substr(processed_bytes);
442
443 EXPECT_CALL(visitor_, OnSettingsFrame(frame)).WillOnce(Return(false));
444 processed_bytes = ProcessInputWithGarbageAppended(remaining_input);
445 EXPECT_EQ(remaining_input.size(), processed_bytes);
bncc5769502019-11-27 10:01:44 -0800446 EXPECT_THAT(decoder_.error(), IsQuicNoError());
bncb9d07d92019-06-25 17:43:49 -0700447 EXPECT_EQ("", decoder_.error_detail());
448
QUICHE teama6ef0a62019-03-07 20:34:33 -0500449 // Process the full frame.
bnca2b13be2019-07-31 12:04:20 -0700450 EXPECT_CALL(visitor_, OnSettingsFrameStart(2));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500451 EXPECT_CALL(visitor_, OnSettingsFrame(frame));
bnc4f6d01a2019-06-25 06:03:54 -0700452 EXPECT_EQ(input.size(), ProcessInput(input));
bncc5769502019-11-27 10:01:44 -0800453 EXPECT_THAT(decoder_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500454 EXPECT_EQ("", decoder_.error_detail());
455
bnc4f6d01a2019-06-25 06:03:54 -0700456 // Process the frame incrementally.
bnca2b13be2019-07-31 12:04:20 -0700457 EXPECT_CALL(visitor_, OnSettingsFrameStart(2));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500458 EXPECT_CALL(visitor_, OnSettingsFrame(frame));
bnc4f6d01a2019-06-25 06:03:54 -0700459 ProcessInputCharByChar(input);
bncc5769502019-11-27 10:01:44 -0800460 EXPECT_THAT(decoder_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500461 EXPECT_EQ("", decoder_.error_detail());
462}
463
bnc8983c0f2019-08-08 06:12:10 -0700464TEST_F(HttpDecoderTest, CorruptSettingsFrame) {
465 const char* const kPayload =
466 "\x42\x11" // two-byte id
467 "\x80\x22\x33\x44" // four-byte value
468 "\x58\x39" // two-byte id
469 "\xf0\x22\x33\x44\x55\x66\x77\x88"; // eight-byte value
470 struct {
471 size_t payload_length;
472 const char* const error_message;
473 } kTestData[] = {
bncdfabdfb2020-01-17 17:46:40 -0800474 {1, "Unable to read setting identifier."},
475 {5, "Unable to read setting value."},
476 {7, "Unable to read setting identifier."},
477 {12, "Unable to read setting value."},
bnc8983c0f2019-08-08 06:12:10 -0700478 };
479
480 for (const auto& test_data : kTestData) {
481 std::string input;
482 input.push_back(4u); // type SETTINGS
483 input.push_back(test_data.payload_length);
484 const size_t header_length = input.size();
485 input.append(kPayload, test_data.payload_length);
486
487 HttpDecoder decoder(&visitor_);
488 EXPECT_CALL(visitor_, OnSettingsFrameStart(header_length));
489 EXPECT_CALL(visitor_, OnError(&decoder));
490
491 QuicByteCount processed_bytes =
492 decoder.ProcessInput(input.data(), input.size());
493 EXPECT_EQ(input.size(), processed_bytes);
bncdfabdfb2020-01-17 17:46:40 -0800494 EXPECT_THAT(decoder.error(), IsError(QUIC_HTTP_FRAME_ERROR));
bnc8983c0f2019-08-08 06:12:10 -0700495 EXPECT_EQ(test_data.error_message, decoder.error_detail());
496 }
497}
bnc93ea18d2019-08-22 09:57:43 -0700498
499TEST_F(HttpDecoderTest, DuplicateSettingsIdentifier) {
vasilvv72b789c2020-10-27 17:39:17 -0700500 std::string input = absl::HexStringToBytes(
bnc11907852019-09-20 05:26:08 -0700501 "04" // type (SETTINGS)
502 "04" // length
503 "01" // identifier
504 "01" // content
505 "01" // identifier
506 "02"); // content
bnc93ea18d2019-08-22 09:57:43 -0700507
508 EXPECT_CALL(visitor_, OnSettingsFrameStart(2));
509 EXPECT_CALL(visitor_, OnError(&decoder_));
510
511 EXPECT_EQ(input.size(), ProcessInput(input));
512
bncf72ef0b2020-04-02 06:59:32 -0700513 EXPECT_THAT(decoder_.error(),
514 IsError(QUIC_HTTP_DUPLICATE_SETTING_IDENTIFIER));
bncdfabdfb2020-01-17 17:46:40 -0800515 EXPECT_EQ("Duplicate setting identifier.", decoder_.error_detail());
bnc93ea18d2019-08-22 09:57:43 -0700516}
517
QUICHE teama6ef0a62019-03-07 20:34:33 -0500518TEST_F(HttpDecoderTest, DataFrame) {
bncb9d07d92019-06-25 17:43:49 -0700519 InSequence s;
vasilvva163b382020-12-04 11:47:46 -0800520 std::string input = absl::StrCat(absl::HexStringToBytes("00" // type (DATA)
521 "05"), // length
522 "Data!"); // data
QUICHE teama6ef0a62019-03-07 20:34:33 -0500523
bncb9d07d92019-06-25 17:43:49 -0700524 // Visitor pauses processing.
bnc32f36f92020-03-27 15:48:45 -0700525 EXPECT_CALL(visitor_, OnDataFrameStart(2, 5)).WillOnce(Return(false));
vasilvve2707e32020-10-08 12:27:46 -0700526 absl::string_view remaining_input(input);
bncb9d07d92019-06-25 17:43:49 -0700527 QuicByteCount processed_bytes =
528 ProcessInputWithGarbageAppended(remaining_input);
529 EXPECT_EQ(2u, processed_bytes);
530 remaining_input = remaining_input.substr(processed_bytes);
531
vasilvve2707e32020-10-08 12:27:46 -0700532 EXPECT_CALL(visitor_, OnDataFramePayload(absl::string_view("Data!")))
bncb9d07d92019-06-25 17:43:49 -0700533 .WillOnce(Return(false));
534 processed_bytes = ProcessInputWithGarbageAppended(remaining_input);
535 EXPECT_EQ(remaining_input.size(), processed_bytes);
536
537 EXPECT_CALL(visitor_, OnDataFrameEnd()).WillOnce(Return(false));
538 EXPECT_EQ(0u, ProcessInputWithGarbageAppended(""));
bncc5769502019-11-27 10:01:44 -0800539 EXPECT_THAT(decoder_.error(), IsQuicNoError());
bncb9d07d92019-06-25 17:43:49 -0700540 EXPECT_EQ("", decoder_.error_detail());
541
QUICHE teama6ef0a62019-03-07 20:34:33 -0500542 // Process the full frame.
bnc32f36f92020-03-27 15:48:45 -0700543 EXPECT_CALL(visitor_, OnDataFrameStart(2, 5));
vasilvve2707e32020-10-08 12:27:46 -0700544 EXPECT_CALL(visitor_, OnDataFramePayload(absl::string_view("Data!")));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500545 EXPECT_CALL(visitor_, OnDataFrameEnd());
bnc4f6d01a2019-06-25 06:03:54 -0700546 EXPECT_EQ(input.size(), ProcessInput(input));
bncc5769502019-11-27 10:01:44 -0800547 EXPECT_THAT(decoder_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500548 EXPECT_EQ("", decoder_.error_detail());
549
bnc4f6d01a2019-06-25 06:03:54 -0700550 // Process the frame incrementally.
bnc32f36f92020-03-27 15:48:45 -0700551 EXPECT_CALL(visitor_, OnDataFrameStart(2, 5));
vasilvve2707e32020-10-08 12:27:46 -0700552 EXPECT_CALL(visitor_, OnDataFramePayload(absl::string_view("D")));
553 EXPECT_CALL(visitor_, OnDataFramePayload(absl::string_view("a")));
554 EXPECT_CALL(visitor_, OnDataFramePayload(absl::string_view("t")));
555 EXPECT_CALL(visitor_, OnDataFramePayload(absl::string_view("a")));
556 EXPECT_CALL(visitor_, OnDataFramePayload(absl::string_view("!")));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500557 EXPECT_CALL(visitor_, OnDataFrameEnd());
bnc4f6d01a2019-06-25 06:03:54 -0700558 ProcessInputCharByChar(input);
bncc5769502019-11-27 10:01:44 -0800559 EXPECT_THAT(decoder_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500560 EXPECT_EQ("", decoder_.error_detail());
561}
562
563TEST_F(HttpDecoderTest, FrameHeaderPartialDelivery) {
bncb9d07d92019-06-25 17:43:49 -0700564 InSequence s;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500565 // A large input that will occupy more than 1 byte in the length field.
vasilvvc48c8712019-03-11 13:38:16 -0700566 std::string input(2048, 'x');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500567 std::unique_ptr<char[]> buffer;
568 QuicByteCount header_length =
bnc46942722019-10-29 11:56:21 -0700569 HttpEncoder::SerializeDataFrameHeader(input.length(), &buffer);
vasilvvc48c8712019-03-11 13:38:16 -0700570 std::string header = std::string(buffer.get(), header_length);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500571 // Partially send only 1 byte of the header to process.
572 EXPECT_EQ(1u, decoder_.ProcessInput(header.data(), 1));
bncc5769502019-11-27 10:01:44 -0800573 EXPECT_THAT(decoder_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500574 EXPECT_EQ("", decoder_.error_detail());
575
576 // Send the rest of the header.
bnc32f36f92020-03-27 15:48:45 -0700577 EXPECT_CALL(visitor_, OnDataFrameStart(3, input.length()));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500578 EXPECT_EQ(header_length - 1,
579 decoder_.ProcessInput(header.data() + 1, header_length - 1));
bncc5769502019-11-27 10:01:44 -0800580 EXPECT_THAT(decoder_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500581 EXPECT_EQ("", decoder_.error_detail());
582
583 // Send data.
vasilvve2707e32020-10-08 12:27:46 -0700584 EXPECT_CALL(visitor_, OnDataFramePayload(absl::string_view(input)));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500585 EXPECT_CALL(visitor_, OnDataFrameEnd());
586 EXPECT_EQ(2048u, decoder_.ProcessInput(input.data(), 2048));
bncc5769502019-11-27 10:01:44 -0800587 EXPECT_THAT(decoder_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500588 EXPECT_EQ("", decoder_.error_detail());
589}
590
renjietang2d475cf2019-04-18 17:03:37 -0700591TEST_F(HttpDecoderTest, PartialDeliveryOfLargeFrameType) {
bncbf3dbe52019-07-17 05:17:41 -0700592 // Use a reserved type that takes four bytes as a varint.
593 const uint64_t frame_type = 0x1f * 0x222 + 0x21;
594 const QuicByteCount payload_length = 0;
bnca2b13be2019-07-31 12:04:20 -0700595 const QuicByteCount header_length =
bncbf3dbe52019-07-17 05:17:41 -0700596 QuicDataWriter::GetVarInt62Len(frame_type) +
597 QuicDataWriter::GetVarInt62Len(payload_length);
598
vasilvv0fc587f2019-09-06 13:33:08 -0700599 auto input = std::make_unique<char[]>(header_length);
bnca2b13be2019-07-31 12:04:20 -0700600 QuicDataWriter writer(header_length, input.get());
bncbf3dbe52019-07-17 05:17:41 -0700601 writer.WriteVarInt62(frame_type);
602 writer.WriteVarInt62(payload_length);
603
bnc32f36f92020-03-27 15:48:45 -0700604 EXPECT_CALL(visitor_,
605 OnUnknownFrameStart(frame_type, header_length, payload_length));
bncbf3dbe52019-07-17 05:17:41 -0700606 EXPECT_CALL(visitor_, OnUnknownFrameEnd());
renjietang2d475cf2019-04-18 17:03:37 -0700607
608 auto raw_input = input.get();
bnca2b13be2019-07-31 12:04:20 -0700609 for (uint64_t i = 0; i < header_length; ++i) {
renjietang2d475cf2019-04-18 17:03:37 -0700610 char c = raw_input[i];
611 EXPECT_EQ(1u, decoder_.ProcessInput(&c, 1));
612 }
bncbf3dbe52019-07-17 05:17:41 -0700613
bncc5769502019-11-27 10:01:44 -0800614 EXPECT_THAT(decoder_.error(), IsQuicNoError());
renjietang2d475cf2019-04-18 17:03:37 -0700615 EXPECT_EQ("", decoder_.error_detail());
bncbf3dbe52019-07-17 05:17:41 -0700616 EXPECT_EQ(frame_type, current_frame_type());
renjietang2d475cf2019-04-18 17:03:37 -0700617}
618
QUICHE teama6ef0a62019-03-07 20:34:33 -0500619TEST_F(HttpDecoderTest, GoAway) {
bncb9d07d92019-06-25 17:43:49 -0700620 InSequence s;
vasilvv72b789c2020-10-27 17:39:17 -0700621 std::string input = absl::HexStringToBytes(
bnc11907852019-09-20 05:26:08 -0700622 "07" // type (GOAWAY)
623 "01" // length
bnc8b6881b2020-07-21 10:44:43 -0700624 "01"); // ID
QUICHE teama6ef0a62019-03-07 20:34:33 -0500625
bncb9d07d92019-06-25 17:43:49 -0700626 // Visitor pauses processing.
627 EXPECT_CALL(visitor_, OnGoAwayFrame(GoAwayFrame({1})))
628 .WillOnce(Return(false));
629 EXPECT_EQ(input.size(), ProcessInputWithGarbageAppended(input));
bncc5769502019-11-27 10:01:44 -0800630 EXPECT_THAT(decoder_.error(), IsQuicNoError());
bncb9d07d92019-06-25 17:43:49 -0700631 EXPECT_EQ("", decoder_.error_detail());
632
QUICHE teama6ef0a62019-03-07 20:34:33 -0500633 // Process the full frame.
634 EXPECT_CALL(visitor_, OnGoAwayFrame(GoAwayFrame({1})));
bnc4f6d01a2019-06-25 06:03:54 -0700635 EXPECT_EQ(input.size(), ProcessInput(input));
bncc5769502019-11-27 10:01:44 -0800636 EXPECT_THAT(decoder_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500637 EXPECT_EQ("", decoder_.error_detail());
638
bnc4f6d01a2019-06-25 06:03:54 -0700639 // Process the frame incrementally.
QUICHE teama6ef0a62019-03-07 20:34:33 -0500640 EXPECT_CALL(visitor_, OnGoAwayFrame(GoAwayFrame({1})));
bnc4f6d01a2019-06-25 06:03:54 -0700641 ProcessInputCharByChar(input);
bncc5769502019-11-27 10:01:44 -0800642 EXPECT_THAT(decoder_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500643 EXPECT_EQ("", decoder_.error_detail());
644}
645
646TEST_F(HttpDecoderTest, HeadersFrame) {
bncb9d07d92019-06-25 17:43:49 -0700647 InSequence s;
vasilvv72b789c2020-10-27 17:39:17 -0700648 std::string input =
vasilvva163b382020-12-04 11:47:46 -0800649 absl::StrCat(absl::HexStringToBytes("01" // type (HEADERS)
650 "07"), // length
651 "Headers"); // headers
QUICHE teama6ef0a62019-03-07 20:34:33 -0500652
bncb9d07d92019-06-25 17:43:49 -0700653 // Visitor pauses processing.
bnc32f36f92020-03-27 15:48:45 -0700654 EXPECT_CALL(visitor_, OnHeadersFrameStart(2, 7)).WillOnce(Return(false));
vasilvve2707e32020-10-08 12:27:46 -0700655 absl::string_view remaining_input(input);
bncb9d07d92019-06-25 17:43:49 -0700656 QuicByteCount processed_bytes =
657 ProcessInputWithGarbageAppended(remaining_input);
658 EXPECT_EQ(2u, processed_bytes);
659 remaining_input = remaining_input.substr(processed_bytes);
660
vasilvve2707e32020-10-08 12:27:46 -0700661 EXPECT_CALL(visitor_, OnHeadersFramePayload(absl::string_view("Headers")))
bncb9d07d92019-06-25 17:43:49 -0700662 .WillOnce(Return(false));
663 processed_bytes = ProcessInputWithGarbageAppended(remaining_input);
664 EXPECT_EQ(remaining_input.size(), processed_bytes);
665
666 EXPECT_CALL(visitor_, OnHeadersFrameEnd()).WillOnce(Return(false));
667 EXPECT_EQ(0u, ProcessInputWithGarbageAppended(""));
bncc5769502019-11-27 10:01:44 -0800668 EXPECT_THAT(decoder_.error(), IsQuicNoError());
bncb9d07d92019-06-25 17:43:49 -0700669 EXPECT_EQ("", decoder_.error_detail());
670
QUICHE teama6ef0a62019-03-07 20:34:33 -0500671 // Process the full frame.
bnc32f36f92020-03-27 15:48:45 -0700672 EXPECT_CALL(visitor_, OnHeadersFrameStart(2, 7));
vasilvve2707e32020-10-08 12:27:46 -0700673 EXPECT_CALL(visitor_, OnHeadersFramePayload(absl::string_view("Headers")));
bnca322c042019-04-12 08:56:59 -0700674 EXPECT_CALL(visitor_, OnHeadersFrameEnd());
bnc4f6d01a2019-06-25 06:03:54 -0700675 EXPECT_EQ(input.size(), ProcessInput(input));
bncc5769502019-11-27 10:01:44 -0800676 EXPECT_THAT(decoder_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500677 EXPECT_EQ("", decoder_.error_detail());
678
bnc4f6d01a2019-06-25 06:03:54 -0700679 // Process the frame incrementally.
bnc32f36f92020-03-27 15:48:45 -0700680 EXPECT_CALL(visitor_, OnHeadersFrameStart(2, 7));
vasilvve2707e32020-10-08 12:27:46 -0700681 EXPECT_CALL(visitor_, OnHeadersFramePayload(absl::string_view("H")));
682 EXPECT_CALL(visitor_, OnHeadersFramePayload(absl::string_view("e")));
683 EXPECT_CALL(visitor_, OnHeadersFramePayload(absl::string_view("a")));
684 EXPECT_CALL(visitor_, OnHeadersFramePayload(absl::string_view("d")));
685 EXPECT_CALL(visitor_, OnHeadersFramePayload(absl::string_view("e")));
686 EXPECT_CALL(visitor_, OnHeadersFramePayload(absl::string_view("r")));
687 EXPECT_CALL(visitor_, OnHeadersFramePayload(absl::string_view("s")));
bnca322c042019-04-12 08:56:59 -0700688 EXPECT_CALL(visitor_, OnHeadersFrameEnd());
bnc4f6d01a2019-06-25 06:03:54 -0700689 ProcessInputCharByChar(input);
bncc5769502019-11-27 10:01:44 -0800690 EXPECT_THAT(decoder_.error(), IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500691 EXPECT_EQ("", decoder_.error_detail());
692}
693
bnc70914262019-03-16 12:49:50 -0700694TEST_F(HttpDecoderTest, EmptyDataFrame) {
bncb9d07d92019-06-25 17:43:49 -0700695 InSequence s;
vasilvv72b789c2020-10-27 17:39:17 -0700696 std::string input = absl::HexStringToBytes(
bnc11907852019-09-20 05:26:08 -0700697 "00" // type (DATA)
698 "00"); // length
bnc70914262019-03-16 12:49:50 -0700699
bncb9d07d92019-06-25 17:43:49 -0700700 // Visitor pauses processing.
bnc32f36f92020-03-27 15:48:45 -0700701 EXPECT_CALL(visitor_, OnDataFrameStart(2, 0)).WillOnce(Return(false));
bncb9d07d92019-06-25 17:43:49 -0700702 EXPECT_EQ(input.size(), ProcessInputWithGarbageAppended(input));
703
704 EXPECT_CALL(visitor_, OnDataFrameEnd()).WillOnce(Return(false));
705 EXPECT_EQ(0u, ProcessInputWithGarbageAppended(""));
bncc5769502019-11-27 10:01:44 -0800706 EXPECT_THAT(decoder_.error(), IsQuicNoError());
bncb9d07d92019-06-25 17:43:49 -0700707 EXPECT_EQ("", decoder_.error_detail());
708
bnc70914262019-03-16 12:49:50 -0700709 // Process the full frame.
bnc32f36f92020-03-27 15:48:45 -0700710 EXPECT_CALL(visitor_, OnDataFrameStart(2, 0));
bnc70914262019-03-16 12:49:50 -0700711 EXPECT_CALL(visitor_, OnDataFrameEnd());
bnc4f6d01a2019-06-25 06:03:54 -0700712 EXPECT_EQ(input.size(), ProcessInput(input));
bncc5769502019-11-27 10:01:44 -0800713 EXPECT_THAT(decoder_.error(), IsQuicNoError());
bnc70914262019-03-16 12:49:50 -0700714 EXPECT_EQ("", decoder_.error_detail());
715
bnc4f6d01a2019-06-25 06:03:54 -0700716 // Process the frame incrementally.
bnc32f36f92020-03-27 15:48:45 -0700717 EXPECT_CALL(visitor_, OnDataFrameStart(2, 0));
bnc70914262019-03-16 12:49:50 -0700718 EXPECT_CALL(visitor_, OnDataFrameEnd());
bnc4f6d01a2019-06-25 06:03:54 -0700719 ProcessInputCharByChar(input);
bncc5769502019-11-27 10:01:44 -0800720 EXPECT_THAT(decoder_.error(), IsQuicNoError());
bnc70914262019-03-16 12:49:50 -0700721 EXPECT_EQ("", decoder_.error_detail());
722}
723
724TEST_F(HttpDecoderTest, EmptyHeadersFrame) {
bncb9d07d92019-06-25 17:43:49 -0700725 InSequence s;
vasilvv72b789c2020-10-27 17:39:17 -0700726 std::string input = absl::HexStringToBytes(
bnc11907852019-09-20 05:26:08 -0700727 "01" // type (HEADERS)
728 "00"); // length
bnc70914262019-03-16 12:49:50 -0700729
bncb9d07d92019-06-25 17:43:49 -0700730 // Visitor pauses processing.
bnc32f36f92020-03-27 15:48:45 -0700731 EXPECT_CALL(visitor_, OnHeadersFrameStart(2, 0)).WillOnce(Return(false));
bncb9d07d92019-06-25 17:43:49 -0700732 EXPECT_EQ(input.size(), ProcessInputWithGarbageAppended(input));
733
734 EXPECT_CALL(visitor_, OnHeadersFrameEnd()).WillOnce(Return(false));
735 EXPECT_EQ(0u, ProcessInputWithGarbageAppended(""));
bncc5769502019-11-27 10:01:44 -0800736 EXPECT_THAT(decoder_.error(), IsQuicNoError());
bncb9d07d92019-06-25 17:43:49 -0700737 EXPECT_EQ("", decoder_.error_detail());
738
bnc70914262019-03-16 12:49:50 -0700739 // Process the full frame.
bnc32f36f92020-03-27 15:48:45 -0700740 EXPECT_CALL(visitor_, OnHeadersFrameStart(2, 0));
bnca322c042019-04-12 08:56:59 -0700741 EXPECT_CALL(visitor_, OnHeadersFrameEnd());
bnc4f6d01a2019-06-25 06:03:54 -0700742 EXPECT_EQ(input.size(), ProcessInput(input));
bncc5769502019-11-27 10:01:44 -0800743 EXPECT_THAT(decoder_.error(), IsQuicNoError());
bnc70914262019-03-16 12:49:50 -0700744 EXPECT_EQ("", decoder_.error_detail());
745
bnc4f6d01a2019-06-25 06:03:54 -0700746 // Process the frame incrementally.
bnc32f36f92020-03-27 15:48:45 -0700747 EXPECT_CALL(visitor_, OnHeadersFrameStart(2, 0));
bnca322c042019-04-12 08:56:59 -0700748 EXPECT_CALL(visitor_, OnHeadersFrameEnd());
bnc4f6d01a2019-06-25 06:03:54 -0700749 ProcessInputCharByChar(input);
bncc5769502019-11-27 10:01:44 -0800750 EXPECT_THAT(decoder_.error(), IsQuicNoError());
bnc70914262019-03-16 12:49:50 -0700751 EXPECT_EQ("", decoder_.error_detail());
752}
753
754TEST_F(HttpDecoderTest, PushPromiseFrameNoHeaders) {
bnc92df0922021-04-27 14:23:39 -0700755 if (GetQuicReloadableFlag(quic_error_on_http3_push)) {
756 return;
757 }
758
bncb9d07d92019-06-25 17:43:49 -0700759 InSequence s;
vasilvv72b789c2020-10-27 17:39:17 -0700760 std::string input = absl::HexStringToBytes(
bnc11907852019-09-20 05:26:08 -0700761 "05" // type (PUSH_PROMISE)
762 "01" // length
763 "01"); // Push Id
bnc70914262019-03-16 12:49:50 -0700764
bncb9d07d92019-06-25 17:43:49 -0700765 // Visitor pauses processing.
bncf0db6542019-09-23 11:18:28 -0700766 EXPECT_CALL(visitor_, OnPushPromiseFrameStart(2));
bnc32f36f92020-03-27 15:48:45 -0700767 EXPECT_CALL(visitor_, OnPushPromiseFramePushId(1, 1, 0))
768 .WillOnce(Return(false));
bncb9d07d92019-06-25 17:43:49 -0700769 EXPECT_EQ(input.size(), ProcessInputWithGarbageAppended(input));
770
771 EXPECT_CALL(visitor_, OnPushPromiseFrameEnd()).WillOnce(Return(false));
772 EXPECT_EQ(0u, ProcessInputWithGarbageAppended(""));
bncc5769502019-11-27 10:01:44 -0800773 EXPECT_THAT(decoder_.error(), IsQuicNoError());
bncb9d07d92019-06-25 17:43:49 -0700774 EXPECT_EQ("", decoder_.error_detail());
775
bnc70914262019-03-16 12:49:50 -0700776 // Process the full frame.
bncf0db6542019-09-23 11:18:28 -0700777 EXPECT_CALL(visitor_, OnPushPromiseFrameStart(2));
bnc32f36f92020-03-27 15:48:45 -0700778 EXPECT_CALL(visitor_, OnPushPromiseFramePushId(1, 1, 0));
bnc70914262019-03-16 12:49:50 -0700779 EXPECT_CALL(visitor_, OnPushPromiseFrameEnd());
bnc4f6d01a2019-06-25 06:03:54 -0700780 EXPECT_EQ(input.size(), ProcessInput(input));
bncc5769502019-11-27 10:01:44 -0800781 EXPECT_THAT(decoder_.error(), IsQuicNoError());
bnc70914262019-03-16 12:49:50 -0700782 EXPECT_EQ("", decoder_.error_detail());
783
bnc4f6d01a2019-06-25 06:03:54 -0700784 // Process the frame incrementally.
bncf0db6542019-09-23 11:18:28 -0700785 EXPECT_CALL(visitor_, OnPushPromiseFrameStart(2));
bnc32f36f92020-03-27 15:48:45 -0700786 EXPECT_CALL(visitor_, OnPushPromiseFramePushId(1, 1, 0));
bnc70914262019-03-16 12:49:50 -0700787 EXPECT_CALL(visitor_, OnPushPromiseFrameEnd());
bnc4f6d01a2019-06-25 06:03:54 -0700788 ProcessInputCharByChar(input);
bncc5769502019-11-27 10:01:44 -0800789 EXPECT_THAT(decoder_.error(), IsQuicNoError());
bnc70914262019-03-16 12:49:50 -0700790 EXPECT_EQ("", decoder_.error_detail());
791}
792
renjietang4ab9d9f2019-04-10 14:30:26 -0700793TEST_F(HttpDecoderTest, MalformedFrameWithOverlyLargePayload) {
bnc92df0922021-04-27 14:23:39 -0700794 if (GetQuicReloadableFlag(quic_error_on_http3_push)) {
795 return;
796 }
797
vasilvv72b789c2020-10-27 17:39:17 -0700798 std::string input = absl::HexStringToBytes(
bnc11907852019-09-20 05:26:08 -0700799 "03" // type (CANCEL_PUSH)
800 "10" // length
801 "15"); // malformed payload
renjietang4ab9d9f2019-04-10 14:30:26 -0700802 // Process the full frame.
803 EXPECT_CALL(visitor_, OnError(&decoder_));
bncb9d07d92019-06-25 17:43:49 -0700804 EXPECT_EQ(2u, ProcessInput(input));
bncdfabdfb2020-01-17 17:46:40 -0800805 EXPECT_THAT(decoder_.error(), IsError(QUIC_HTTP_FRAME_TOO_LARGE));
806 EXPECT_EQ("Frame is too large.", decoder_.error_detail());
renjietang4ab9d9f2019-04-10 14:30:26 -0700807}
808
809TEST_F(HttpDecoderTest, MalformedSettingsFrame) {
810 char input[30];
811 QuicDataWriter writer(30, input);
renjietang4ab9d9f2019-04-10 14:30:26 -0700812 // Write type SETTINGS.
813 writer.WriteUInt8(0x04);
renjietangfcd91c02019-04-22 10:40:35 -0700814 // Write length.
815 writer.WriteVarInt62(2048 * 1024);
renjietang4ab9d9f2019-04-10 14:30:26 -0700816
817 writer.WriteStringPiece("Malformed payload");
818 EXPECT_CALL(visitor_, OnError(&decoder_));
vasilvvfe1c8f32020-10-19 14:10:59 -0700819 EXPECT_EQ(5u, decoder_.ProcessInput(input, ABSL_ARRAYSIZE(input)));
bncdfabdfb2020-01-17 17:46:40 -0800820 EXPECT_THAT(decoder_.error(), IsError(QUIC_HTTP_FRAME_TOO_LARGE));
821 EXPECT_EQ("Frame is too large.", decoder_.error_detail());
renjietang4ab9d9f2019-04-10 14:30:26 -0700822}
823
renjietang0c9148a2020-09-30 12:59:14 -0700824TEST_F(HttpDecoderTest, Http2Frame) {
vasilvv72b789c2020-10-27 17:39:17 -0700825 std::string input = absl::HexStringToBytes(
renjietang0c9148a2020-09-30 12:59:14 -0700826 "06" // PING in HTTP/2 but not supported in HTTP/3.
827 "05" // length
828 "15"); // random payload
829
830 // Process the full frame.
831 EXPECT_CALL(visitor_, OnError(&decoder_));
832 EXPECT_EQ(1u, ProcessInput(input));
833 EXPECT_THAT(decoder_.error(), IsError(QUIC_HTTP_RECEIVE_SPDY_FRAME));
834 EXPECT_EQ("HTTP/2 frame received in a HTTP/3 connection: 6",
835 decoder_.error_detail());
836}
837
bncb9d07d92019-06-25 17:43:49 -0700838TEST_F(HttpDecoderTest, HeadersPausedThenData) {
839 InSequence s;
vasilvv72b789c2020-10-27 17:39:17 -0700840 std::string input =
vasilvva163b382020-12-04 11:47:46 -0800841 absl::StrCat(absl::HexStringToBytes("01" // type (HEADERS)
842 "07"), // length
843 "Headers", // headers
844 absl::HexStringToBytes("00" // type (DATA)
845 "05"), // length
846 "Data!"); // data
bncb9d07d92019-06-25 17:43:49 -0700847
848 // Visitor pauses processing, maybe because header decompression is blocked.
bnc32f36f92020-03-27 15:48:45 -0700849 EXPECT_CALL(visitor_, OnHeadersFrameStart(2, 7));
vasilvve2707e32020-10-08 12:27:46 -0700850 EXPECT_CALL(visitor_, OnHeadersFramePayload(absl::string_view("Headers")));
bncb9d07d92019-06-25 17:43:49 -0700851 EXPECT_CALL(visitor_, OnHeadersFrameEnd()).WillOnce(Return(false));
vasilvve2707e32020-10-08 12:27:46 -0700852 absl::string_view remaining_input(input);
bncb9d07d92019-06-25 17:43:49 -0700853 QuicByteCount processed_bytes =
854 ProcessInputWithGarbageAppended(remaining_input);
855 EXPECT_EQ(9u, processed_bytes);
856 remaining_input = remaining_input.substr(processed_bytes);
857
858 // Process DATA frame.
bnc32f36f92020-03-27 15:48:45 -0700859 EXPECT_CALL(visitor_, OnDataFrameStart(2, 5));
vasilvve2707e32020-10-08 12:27:46 -0700860 EXPECT_CALL(visitor_, OnDataFramePayload(absl::string_view("Data!")));
bncb9d07d92019-06-25 17:43:49 -0700861 EXPECT_CALL(visitor_, OnDataFrameEnd());
862
863 processed_bytes = ProcessInput(remaining_input);
864 EXPECT_EQ(remaining_input.size(), processed_bytes);
865
bncc5769502019-11-27 10:01:44 -0800866 EXPECT_THAT(decoder_.error(), IsQuicNoError());
bncb9d07d92019-06-25 17:43:49 -0700867 EXPECT_EQ("", decoder_.error_detail());
868}
869
bnc8983c0f2019-08-08 06:12:10 -0700870TEST_F(HttpDecoderTest, CorruptFrame) {
bnc92df0922021-04-27 14:23:39 -0700871 if (GetQuicReloadableFlag(quic_error_on_http3_push)) {
872 InSequence s;
bnc8983c0f2019-08-08 06:12:10 -0700873
bnc92df0922021-04-27 14:23:39 -0700874 struct {
875 const char* const input;
876 const char* const error_message;
877 } kTestData[] = {{"\x0D" // type (MAX_PUSH_ID)
878 "\x01" // length
879 "\x40", // first byte of two-byte varint push id
880 "Unable to read MAX_PUSH_ID push_id."},
881 {"\x0D" // type (MAX_PUSH_ID)
882 "\x04" // length
883 "\x05" // valid push id
884 "foo", // superfluous data
885 "Superfluous data in MAX_PUSH_ID frame."},
886 {"\x07" // type (GOAWAY)
887 "\x01" // length
888 "\x40", // first byte of two-byte varint stream id
889 "Unable to read GOAWAY ID."},
890 {"\x07" // type (GOAWAY)
891 "\x04" // length
892 "\x05" // valid stream id
893 "foo", // superfluous data
894 "Superfluous data in GOAWAY frame."},
895 {"\x40\x89" // type (ACCEPT_CH)
896 "\x01" // length
897 "\x40", // first byte of two-byte varint origin length
898 "Unable to read ACCEPT_CH origin."},
899 {"\x40\x89" // type (ACCEPT_CH)
900 "\x01" // length
901 "\x05", // valid origin length but no origin string
902 "Unable to read ACCEPT_CH origin."},
903 {"\x40\x89" // type (ACCEPT_CH)
904 "\x04" // length
905 "\x05" // valid origin length
906 "foo", // payload ends before origin ends
907 "Unable to read ACCEPT_CH origin."},
908 {"\x40\x89" // type (ACCEPT_CH)
909 "\x04" // length
910 "\x03" // valid origin length
911 "foo", // payload ends at end of origin: no value
912 "Unable to read ACCEPT_CH value."},
913 {"\x40\x89" // type (ACCEPT_CH)
914 "\x05" // length
915 "\x03" // valid origin length
916 "foo" // payload ends at end of origin: no value
917 "\x40", // first byte of two-byte varint value length
918 "Unable to read ACCEPT_CH value."},
919 {"\x40\x89" // type (ACCEPT_CH)
920 "\x08" // length
921 "\x03" // valid origin length
922 "foo" // origin
923 "\x05" // valid value length
924 "bar", // payload ends before value ends
925 "Unable to read ACCEPT_CH value."}};
bnc8983c0f2019-08-08 06:12:10 -0700926
bnc92df0922021-04-27 14:23:39 -0700927 for (const auto& test_data : kTestData) {
928 {
929 HttpDecoder decoder(&visitor_);
930 EXPECT_CALL(visitor_, OnAcceptChFrameStart(_)).Times(AnyNumber());
931 EXPECT_CALL(visitor_, OnError(&decoder));
bnc8983c0f2019-08-08 06:12:10 -0700932
bnc92df0922021-04-27 14:23:39 -0700933 absl::string_view input(test_data.input);
934 decoder.ProcessInput(input.data(), input.size());
935 EXPECT_THAT(decoder.error(), IsError(QUIC_HTTP_FRAME_ERROR));
936 EXPECT_EQ(test_data.error_message, decoder.error_detail());
bnc8983c0f2019-08-08 06:12:10 -0700937 }
bnc92df0922021-04-27 14:23:39 -0700938 {
939 HttpDecoder decoder(&visitor_);
940 EXPECT_CALL(visitor_, OnAcceptChFrameStart(_)).Times(AnyNumber());
941 EXPECT_CALL(visitor_, OnError(&decoder));
942
943 absl::string_view input(test_data.input);
944 for (auto c : input) {
945 decoder.ProcessInput(&c, 1);
946 }
947 EXPECT_THAT(decoder.error(), IsError(QUIC_HTTP_FRAME_ERROR));
948 EXPECT_EQ(test_data.error_message, decoder.error_detail());
949 }
950 }
951 } else {
952 InSequence s;
953
954 struct {
955 const char* const input;
956 const char* const error_message;
957 } kTestData[] = {{"\x03" // type (CANCEL_PUSH)
958 "\x01" // length
959 "\x40", // first byte of two-byte varint push id
960 "Unable to read CANCEL_PUSH push_id."},
961 {"\x03" // type (CANCEL_PUSH)
962 "\x04" // length
963 "\x05" // valid push id
964 "foo", // superfluous data
965 "Superfluous data in CANCEL_PUSH frame."},
966 {"\x0D" // type (MAX_PUSH_ID)
967 "\x01" // length
968 "\x40", // first byte of two-byte varint push id
969 "Unable to read MAX_PUSH_ID push_id."},
970 {"\x0D" // type (MAX_PUSH_ID)
971 "\x04" // length
972 "\x05" // valid push id
973 "foo", // superfluous data
974 "Superfluous data in MAX_PUSH_ID frame."},
975 {"\x07" // type (GOAWAY)
976 "\x01" // length
977 "\x40", // first byte of two-byte varint stream id
978 "Unable to read GOAWAY ID."},
979 {"\x07" // type (GOAWAY)
980 "\x04" // length
981 "\x05" // valid stream id
982 "foo", // superfluous data
983 "Superfluous data in GOAWAY frame."},
984 {"\x40\x89" // type (ACCEPT_CH)
985 "\x01" // length
986 "\x40", // first byte of two-byte varint origin length
987 "Unable to read ACCEPT_CH origin."},
988 {"\x40\x89" // type (ACCEPT_CH)
989 "\x01" // length
990 "\x05", // valid origin length but no origin string
991 "Unable to read ACCEPT_CH origin."},
992 {"\x40\x89" // type (ACCEPT_CH)
993 "\x04" // length
994 "\x05" // valid origin length
995 "foo", // payload ends before origin ends
996 "Unable to read ACCEPT_CH origin."},
997 {"\x40\x89" // type (ACCEPT_CH)
998 "\x04" // length
999 "\x03" // valid origin length
1000 "foo", // payload ends at end of origin: no value
1001 "Unable to read ACCEPT_CH value."},
1002 {"\x40\x89" // type (ACCEPT_CH)
1003 "\x05" // length
1004 "\x03" // valid origin length
1005 "foo" // payload ends at end of origin: no value
1006 "\x40", // first byte of two-byte varint value length
1007 "Unable to read ACCEPT_CH value."},
1008 {"\x40\x89" // type (ACCEPT_CH)
1009 "\x08" // length
1010 "\x03" // valid origin length
1011 "foo" // origin
1012 "\x05" // valid value length
1013 "bar", // payload ends before value ends
1014 "Unable to read ACCEPT_CH value."}};
1015
1016 for (const auto& test_data : kTestData) {
1017 {
1018 HttpDecoder decoder(&visitor_);
1019 EXPECT_CALL(visitor_, OnAcceptChFrameStart(_)).Times(AnyNumber());
1020 EXPECT_CALL(visitor_, OnError(&decoder));
1021
1022 absl::string_view input(test_data.input);
1023 decoder.ProcessInput(input.data(), input.size());
1024 EXPECT_THAT(decoder.error(), IsError(QUIC_HTTP_FRAME_ERROR));
1025 EXPECT_EQ(test_data.error_message, decoder.error_detail());
1026 }
1027 {
1028 HttpDecoder decoder(&visitor_);
1029 EXPECT_CALL(visitor_, OnAcceptChFrameStart(_)).Times(AnyNumber());
1030 EXPECT_CALL(visitor_, OnError(&decoder));
1031
1032 absl::string_view input(test_data.input);
1033 for (auto c : input) {
1034 decoder.ProcessInput(&c, 1);
1035 }
1036 EXPECT_THAT(decoder.error(), IsError(QUIC_HTTP_FRAME_ERROR));
1037 EXPECT_EQ(test_data.error_message, decoder.error_detail());
1038 }
bnc8983c0f2019-08-08 06:12:10 -07001039 }
1040 }
bncfcd42352019-09-20 17:55:47 -07001041}
1042
1043TEST_F(HttpDecoderTest, EmptyCancelPushFrame) {
bnc92df0922021-04-27 14:23:39 -07001044 if (GetQuicReloadableFlag(quic_error_on_http3_push)) {
1045 return;
1046 }
1047
vasilvv72b789c2020-10-27 17:39:17 -07001048 std::string input = absl::HexStringToBytes(
bncfcd42352019-09-20 17:55:47 -07001049 "03" // type (CANCEL_PUSH)
1050 "00"); // frame length
1051
1052 EXPECT_CALL(visitor_, OnError(&decoder_));
1053 EXPECT_EQ(input.size(), ProcessInput(input));
bncdfabdfb2020-01-17 17:46:40 -08001054 EXPECT_THAT(decoder_.error(), IsError(QUIC_HTTP_FRAME_ERROR));
1055 EXPECT_EQ("Unable to read CANCEL_PUSH push_id.", decoder_.error_detail());
bncfcd42352019-09-20 17:55:47 -07001056}
1057
1058TEST_F(HttpDecoderTest, EmptySettingsFrame) {
vasilvv72b789c2020-10-27 17:39:17 -07001059 std::string input = absl::HexStringToBytes(
bncfcd42352019-09-20 17:55:47 -07001060 "04" // type (SETTINGS)
1061 "00"); // frame length
1062
1063 EXPECT_CALL(visitor_, OnSettingsFrameStart(2));
1064
1065 SettingsFrame empty_frame;
1066 EXPECT_CALL(visitor_, OnSettingsFrame(empty_frame));
1067
1068 EXPECT_EQ(input.size(), ProcessInput(input));
bncc5769502019-11-27 10:01:44 -08001069 EXPECT_THAT(decoder_.error(), IsQuicNoError());
bncfcd42352019-09-20 17:55:47 -07001070 EXPECT_EQ("", decoder_.error_detail());
1071}
1072
1073// Regression test for https://crbug.com/1001823.
1074TEST_F(HttpDecoderTest, EmptyPushPromiseFrame) {
bnc92df0922021-04-27 14:23:39 -07001075 if (GetQuicReloadableFlag(quic_error_on_http3_push)) {
1076 return;
1077 }
1078
vasilvv72b789c2020-10-27 17:39:17 -07001079 std::string input = absl::HexStringToBytes(
bncfcd42352019-09-20 17:55:47 -07001080 "05" // type (PUSH_PROMISE)
1081 "00"); // frame length
1082
1083 EXPECT_CALL(visitor_, OnError(&decoder_));
1084 EXPECT_EQ(input.size(), ProcessInput(input));
bncdfabdfb2020-01-17 17:46:40 -08001085 EXPECT_THAT(decoder_.error(), IsError(QUIC_HTTP_FRAME_ERROR));
1086 EXPECT_EQ("PUSH_PROMISE frame with empty payload.", decoder_.error_detail());
bncfcd42352019-09-20 17:55:47 -07001087}
1088
1089TEST_F(HttpDecoderTest, EmptyGoAwayFrame) {
vasilvv72b789c2020-10-27 17:39:17 -07001090 std::string input = absl::HexStringToBytes(
bncfcd42352019-09-20 17:55:47 -07001091 "07" // type (GOAWAY)
1092 "00"); // frame length
1093
1094 EXPECT_CALL(visitor_, OnError(&decoder_));
1095 EXPECT_EQ(input.size(), ProcessInput(input));
bncdfabdfb2020-01-17 17:46:40 -08001096 EXPECT_THAT(decoder_.error(), IsError(QUIC_HTTP_FRAME_ERROR));
bnc8b6881b2020-07-21 10:44:43 -07001097 EXPECT_EQ("Unable to read GOAWAY ID.", decoder_.error_detail());
bncfcd42352019-09-20 17:55:47 -07001098}
1099
1100TEST_F(HttpDecoderTest, EmptyMaxPushIdFrame) {
vasilvv72b789c2020-10-27 17:39:17 -07001101 std::string input = absl::HexStringToBytes(
bncfcd42352019-09-20 17:55:47 -07001102 "0d" // type (MAX_PUSH_ID)
1103 "00"); // frame length
1104
1105 EXPECT_CALL(visitor_, OnError(&decoder_));
1106 EXPECT_EQ(input.size(), ProcessInput(input));
bncdfabdfb2020-01-17 17:46:40 -08001107 EXPECT_THAT(decoder_.error(), IsError(QUIC_HTTP_FRAME_ERROR));
1108 EXPECT_EQ("Unable to read MAX_PUSH_ID push_id.", decoder_.error_detail());
bncfcd42352019-09-20 17:55:47 -07001109}
1110
renjietang5843bfd2019-10-10 13:24:57 -07001111TEST_F(HttpDecoderTest, LargeStreamIdInGoAway) {
renjietang5843bfd2019-10-10 13:24:57 -07001112 GoAwayFrame frame;
bnc8b6881b2020-07-21 10:44:43 -07001113 frame.id = 1ull << 60;
renjietang5843bfd2019-10-10 13:24:57 -07001114 std::unique_ptr<char[]> buffer;
bnc46942722019-10-29 11:56:21 -07001115 uint64_t length = HttpEncoder::SerializeGoAwayFrame(frame, &buffer);
renjietang5843bfd2019-10-10 13:24:57 -07001116 EXPECT_CALL(visitor_, OnGoAwayFrame(frame));
1117 EXPECT_GT(length, 0u);
1118 EXPECT_EQ(length, decoder_.ProcessInput(buffer.get(), length));
bncc5769502019-11-27 10:01:44 -08001119 EXPECT_THAT(decoder_.error(), IsQuicNoError());
renjietang5843bfd2019-10-10 13:24:57 -07001120 EXPECT_EQ("", decoder_.error_detail());
1121}
1122
bncb5f772a2021-04-23 10:55:06 -07001123TEST_F(HttpDecoderTest, OldPriorityUpdateFrame) {
1124 if (GetQuicReloadableFlag(quic_ignore_old_priority_update_frame)) {
1125 return;
1126 }
1127
bnc51e89622020-01-10 10:40:32 -08001128 InSequence s;
vasilvv72b789c2020-10-27 17:39:17 -07001129 std::string input1 = absl::HexStringToBytes(
bnc51e89622020-01-10 10:40:32 -08001130 "0f" // type (PRIORITY_UPDATE)
1131 "02" // length
1132 "00" // prioritized element type: REQUEST_STREAM
1133 "03"); // prioritized element id
1134
1135 PriorityUpdateFrame priority_update1;
1136 priority_update1.prioritized_element_type = REQUEST_STREAM;
1137 priority_update1.prioritized_element_id = 0x03;
1138
1139 // Visitor pauses processing.
1140 EXPECT_CALL(visitor_, OnPriorityUpdateFrameStart(2)).WillOnce(Return(false));
vasilvve2707e32020-10-08 12:27:46 -07001141 absl::string_view remaining_input(input1);
bnc51e89622020-01-10 10:40:32 -08001142 QuicByteCount processed_bytes =
1143 ProcessInputWithGarbageAppended(remaining_input);
1144 EXPECT_EQ(2u, processed_bytes);
1145 remaining_input = remaining_input.substr(processed_bytes);
1146
1147 EXPECT_CALL(visitor_, OnPriorityUpdateFrame(priority_update1))
1148 .WillOnce(Return(false));
1149 processed_bytes = ProcessInputWithGarbageAppended(remaining_input);
1150 EXPECT_EQ(remaining_input.size(), processed_bytes);
1151 EXPECT_THAT(decoder_.error(), IsQuicNoError());
1152 EXPECT_EQ("", decoder_.error_detail());
1153
1154 // Process the full frame.
1155 EXPECT_CALL(visitor_, OnPriorityUpdateFrameStart(2));
1156 EXPECT_CALL(visitor_, OnPriorityUpdateFrame(priority_update1));
1157 EXPECT_EQ(input1.size(), ProcessInput(input1));
1158 EXPECT_THAT(decoder_.error(), IsQuicNoError());
1159 EXPECT_EQ("", decoder_.error_detail());
1160
1161 // Process the frame incrementally.
1162 EXPECT_CALL(visitor_, OnPriorityUpdateFrameStart(2));
1163 EXPECT_CALL(visitor_, OnPriorityUpdateFrame(priority_update1));
1164 ProcessInputCharByChar(input1);
1165 EXPECT_THAT(decoder_.error(), IsQuicNoError());
1166 EXPECT_EQ("", decoder_.error_detail());
1167
vasilvv72b789c2020-10-27 17:39:17 -07001168 std::string input2 = absl::HexStringToBytes(
bncef7bcc92020-11-10 16:39:31 -08001169 "0f" // type (PRIORITY_UPDATE)
bnc51e89622020-01-10 10:40:32 -08001170 "05" // length
1171 "80" // prioritized element type: PUSH_STREAM
1172 "05" // prioritized element id
1173 "666f6f"); // priority field value: "foo"
1174
1175 PriorityUpdateFrame priority_update2;
1176 priority_update2.prioritized_element_type = PUSH_STREAM;
1177 priority_update2.prioritized_element_id = 0x05;
1178 priority_update2.priority_field_value = "foo";
1179
1180 // Visitor pauses processing.
1181 EXPECT_CALL(visitor_, OnPriorityUpdateFrameStart(2)).WillOnce(Return(false));
1182 remaining_input = input2;
1183 processed_bytes = ProcessInputWithGarbageAppended(remaining_input);
1184 EXPECT_EQ(2u, processed_bytes);
1185 remaining_input = remaining_input.substr(processed_bytes);
1186
1187 EXPECT_CALL(visitor_, OnPriorityUpdateFrame(priority_update2))
1188 .WillOnce(Return(false));
1189 processed_bytes = ProcessInputWithGarbageAppended(remaining_input);
1190 EXPECT_EQ(remaining_input.size(), processed_bytes);
1191 EXPECT_THAT(decoder_.error(), IsQuicNoError());
1192 EXPECT_EQ("", decoder_.error_detail());
1193
1194 // Process the full frame.
1195 EXPECT_CALL(visitor_, OnPriorityUpdateFrameStart(2));
1196 EXPECT_CALL(visitor_, OnPriorityUpdateFrame(priority_update2));
1197 EXPECT_EQ(input2.size(), ProcessInput(input2));
1198 EXPECT_THAT(decoder_.error(), IsQuicNoError());
1199 EXPECT_EQ("", decoder_.error_detail());
1200
1201 // Process the frame incrementally.
1202 EXPECT_CALL(visitor_, OnPriorityUpdateFrameStart(2));
1203 EXPECT_CALL(visitor_, OnPriorityUpdateFrame(priority_update2));
1204 ProcessInputCharByChar(input2);
1205 EXPECT_THAT(decoder_.error(), IsQuicNoError());
1206 EXPECT_EQ("", decoder_.error_detail());
1207}
1208
bncb5f772a2021-04-23 10:55:06 -07001209TEST_F(HttpDecoderTest, ObsoletePriorityUpdateFrame) {
1210 if (!GetQuicReloadableFlag(quic_ignore_old_priority_update_frame)) {
1211 return;
1212 }
1213
1214 const QuicByteCount header_length = 2;
1215 const QuicByteCount payload_length = 3;
1216 InSequence s;
1217 std::string input = absl::HexStringToBytes(
1218 "0f" // type (obsolete PRIORITY_UPDATE)
1219 "03" // length
1220 "666f6f"); // payload "foo"
1221
1222 // Process frame as a whole.
1223 EXPECT_CALL(visitor_,
1224 OnUnknownFrameStart(0x0f, header_length, payload_length));
1225 EXPECT_CALL(visitor_, OnUnknownFramePayload(Eq("foo")));
1226 EXPECT_CALL(visitor_, OnUnknownFrameEnd()).WillOnce(Return(false));
1227
1228 EXPECT_EQ(header_length + payload_length,
1229 ProcessInputWithGarbageAppended(input));
1230 EXPECT_THAT(decoder_.error(), IsQuicNoError());
1231 EXPECT_EQ("", decoder_.error_detail());
1232
1233 // Process frame byte by byte.
1234 EXPECT_CALL(visitor_,
1235 OnUnknownFrameStart(0x0f, header_length, payload_length));
1236 EXPECT_CALL(visitor_, OnUnknownFramePayload(Eq("f")));
1237 EXPECT_CALL(visitor_, OnUnknownFramePayload(Eq("o")));
1238 EXPECT_CALL(visitor_, OnUnknownFramePayload(Eq("o")));
1239 EXPECT_CALL(visitor_, OnUnknownFrameEnd());
1240
1241 ProcessInputCharByChar(input);
1242 EXPECT_THAT(decoder_.error(), IsQuicNoError());
1243 EXPECT_EQ("", decoder_.error_detail());
1244}
1245
1246TEST_F(HttpDecoderTest, PriorityUpdateFrame) {
bncef7bcc92020-11-10 16:39:31 -08001247 InSequence s;
1248 std::string input1 = absl::HexStringToBytes(
1249 "800f0700" // type (PRIORITY_UPDATE)
1250 "01" // length
1251 "03"); // prioritized element id
1252
1253 PriorityUpdateFrame priority_update1;
1254 priority_update1.prioritized_element_type = REQUEST_STREAM;
1255 priority_update1.prioritized_element_id = 0x03;
1256
1257 // Visitor pauses processing.
1258 EXPECT_CALL(visitor_, OnPriorityUpdateFrameStart(5)).WillOnce(Return(false));
1259 absl::string_view remaining_input(input1);
1260 QuicByteCount processed_bytes =
1261 ProcessInputWithGarbageAppended(remaining_input);
1262 EXPECT_EQ(5u, processed_bytes);
1263 remaining_input = remaining_input.substr(processed_bytes);
1264
1265 EXPECT_CALL(visitor_, OnPriorityUpdateFrame(priority_update1))
1266 .WillOnce(Return(false));
1267 processed_bytes = ProcessInputWithGarbageAppended(remaining_input);
1268 EXPECT_EQ(remaining_input.size(), processed_bytes);
1269 EXPECT_THAT(decoder_.error(), IsQuicNoError());
1270 EXPECT_EQ("", decoder_.error_detail());
1271
1272 // Process the full frame.
1273 EXPECT_CALL(visitor_, OnPriorityUpdateFrameStart(5));
1274 EXPECT_CALL(visitor_, OnPriorityUpdateFrame(priority_update1));
1275 EXPECT_EQ(input1.size(), ProcessInput(input1));
1276 EXPECT_THAT(decoder_.error(), IsQuicNoError());
1277 EXPECT_EQ("", decoder_.error_detail());
1278
1279 // Process the frame incrementally.
1280 EXPECT_CALL(visitor_, OnPriorityUpdateFrameStart(5));
1281 EXPECT_CALL(visitor_, OnPriorityUpdateFrame(priority_update1));
1282 ProcessInputCharByChar(input1);
1283 EXPECT_THAT(decoder_.error(), IsQuicNoError());
1284 EXPECT_EQ("", decoder_.error_detail());
1285
1286 std::string input2 = absl::HexStringToBytes(
1287 "800f0700" // type (PRIORITY_UPDATE)
1288 "04" // length
1289 "05" // prioritized element id
1290 "666f6f"); // priority field value: "foo"
1291
1292 PriorityUpdateFrame priority_update2;
1293 priority_update2.prioritized_element_type = REQUEST_STREAM;
1294 priority_update2.prioritized_element_id = 0x05;
1295 priority_update2.priority_field_value = "foo";
1296
1297 // Visitor pauses processing.
1298 EXPECT_CALL(visitor_, OnPriorityUpdateFrameStart(5)).WillOnce(Return(false));
1299 remaining_input = input2;
1300 processed_bytes = ProcessInputWithGarbageAppended(remaining_input);
1301 EXPECT_EQ(5u, processed_bytes);
1302 remaining_input = remaining_input.substr(processed_bytes);
1303
1304 EXPECT_CALL(visitor_, OnPriorityUpdateFrame(priority_update2))
1305 .WillOnce(Return(false));
1306 processed_bytes = ProcessInputWithGarbageAppended(remaining_input);
1307 EXPECT_EQ(remaining_input.size(), processed_bytes);
1308 EXPECT_THAT(decoder_.error(), IsQuicNoError());
1309 EXPECT_EQ("", decoder_.error_detail());
1310
1311 // Process the full frame.
1312 EXPECT_CALL(visitor_, OnPriorityUpdateFrameStart(5));
1313 EXPECT_CALL(visitor_, OnPriorityUpdateFrame(priority_update2));
1314 EXPECT_EQ(input2.size(), ProcessInput(input2));
1315 EXPECT_THAT(decoder_.error(), IsQuicNoError());
1316 EXPECT_EQ("", decoder_.error_detail());
1317
1318 // Process the frame incrementally.
1319 EXPECT_CALL(visitor_, OnPriorityUpdateFrameStart(5));
1320 EXPECT_CALL(visitor_, OnPriorityUpdateFrame(priority_update2));
1321 ProcessInputCharByChar(input2);
1322 EXPECT_THAT(decoder_.error(), IsQuicNoError());
1323 EXPECT_EQ("", decoder_.error_detail());
1324}
1325
bnc51e89622020-01-10 10:40:32 -08001326TEST_F(HttpDecoderTest, CorruptPriorityUpdateFrame) {
bncb5f772a2021-04-23 10:55:06 -07001327 if (GetQuicReloadableFlag(quic_ignore_old_priority_update_frame)) {
1328 return;
1329 }
1330
vasilvv72b789c2020-10-27 17:39:17 -07001331 std::string payload1 = absl::HexStringToBytes(
bnc51e89622020-01-10 10:40:32 -08001332 "80" // prioritized element type: PUSH_STREAM
1333 "4005"); // prioritized element id
vasilvv72b789c2020-10-27 17:39:17 -07001334 std::string payload2 =
1335 absl::HexStringToBytes("42"); // invalid prioritized element type
bnc51e89622020-01-10 10:40:32 -08001336 struct {
1337 const char* const payload;
1338 size_t payload_length;
1339 const char* const error_message;
1340 } kTestData[] = {
1341 {payload1.data(), 0, "Unable to read prioritized element type."},
1342 {payload1.data(), 1, "Unable to read prioritized element id."},
1343 {payload1.data(), 2, "Unable to read prioritized element id."},
1344 {payload2.data(), 1, "Invalid prioritized element type."},
1345 };
1346
1347 for (const auto& test_data : kTestData) {
1348 std::string input;
1349 input.push_back(15u); // type PRIORITY_UPDATE
1350 input.push_back(test_data.payload_length);
1351 size_t header_length = input.size();
1352 input.append(test_data.payload, test_data.payload_length);
1353
1354 HttpDecoder decoder(&visitor_);
1355 EXPECT_CALL(visitor_, OnPriorityUpdateFrameStart(header_length));
1356 EXPECT_CALL(visitor_, OnError(&decoder));
1357
1358 QuicByteCount processed_bytes =
1359 decoder.ProcessInput(input.data(), input.size());
1360 EXPECT_EQ(input.size(), processed_bytes);
bncdfabdfb2020-01-17 17:46:40 -08001361 EXPECT_THAT(decoder.error(), IsError(QUIC_HTTP_FRAME_ERROR));
bnc51e89622020-01-10 10:40:32 -08001362 EXPECT_EQ(test_data.error_message, decoder.error_detail());
1363 }
1364}
1365
bncef7bcc92020-11-10 16:39:31 -08001366TEST_F(HttpDecoderTest, CorruptNewPriorityUpdateFrame) {
bncef7bcc92020-11-10 16:39:31 -08001367 std::string payload =
1368 absl::HexStringToBytes("4005"); // prioritized element id
1369 struct {
1370 size_t payload_length;
1371 const char* const error_message;
1372 } kTestData[] = {
1373 {0, "Unable to read prioritized element id."},
1374 {1, "Unable to read prioritized element id."},
1375 };
1376
1377 for (const auto& test_data : kTestData) {
1378 std::string input =
1379 absl::HexStringToBytes("800f0700"); // type PRIORITY_UPDATE
1380 input.push_back(test_data.payload_length);
1381 size_t header_length = input.size();
1382 input.append(payload.data(), test_data.payload_length);
1383
1384 HttpDecoder decoder(&visitor_);
1385 EXPECT_CALL(visitor_, OnPriorityUpdateFrameStart(header_length));
1386 EXPECT_CALL(visitor_, OnError(&decoder));
1387
1388 QuicByteCount processed_bytes =
1389 decoder.ProcessInput(input.data(), input.size());
1390 EXPECT_EQ(input.size(), processed_bytes);
1391 EXPECT_THAT(decoder.error(), IsError(QUIC_HTTP_FRAME_ERROR));
1392 EXPECT_EQ(test_data.error_message, decoder.error_detail());
1393 }
1394}
1395
bnc9be5c212020-12-11 12:38:20 -08001396TEST_F(HttpDecoderTest, AcceptChFrame) {
bnc9be5c212020-12-11 12:38:20 -08001397 InSequence s;
1398 std::string input1 = absl::HexStringToBytes(
1399 "4089" // type (ACCEPT_CH)
1400 "00"); // length
1401
1402 AcceptChFrame accept_ch1;
1403
1404 // Visitor pauses processing.
1405 EXPECT_CALL(visitor_, OnAcceptChFrameStart(3)).WillOnce(Return(false));
1406 absl::string_view remaining_input(input1);
1407 QuicByteCount processed_bytes =
1408 ProcessInputWithGarbageAppended(remaining_input);
1409 EXPECT_EQ(3u, processed_bytes);
1410 remaining_input = remaining_input.substr(processed_bytes);
1411
1412 EXPECT_CALL(visitor_, OnAcceptChFrame(accept_ch1)).WillOnce(Return(false));
1413 processed_bytes = ProcessInputWithGarbageAppended(remaining_input);
1414 EXPECT_EQ(remaining_input.size(), processed_bytes);
1415 EXPECT_THAT(decoder_.error(), IsQuicNoError());
1416 EXPECT_EQ("", decoder_.error_detail());
1417
1418 // Process the full frame.
1419 EXPECT_CALL(visitor_, OnAcceptChFrameStart(3));
1420 EXPECT_CALL(visitor_, OnAcceptChFrame(accept_ch1));
1421 EXPECT_EQ(input1.size(), ProcessInput(input1));
1422 EXPECT_THAT(decoder_.error(), IsQuicNoError());
1423 EXPECT_EQ("", decoder_.error_detail());
1424
1425 // Process the frame incrementally.
1426 EXPECT_CALL(visitor_, OnAcceptChFrameStart(3));
1427 EXPECT_CALL(visitor_, OnAcceptChFrame(accept_ch1));
1428 ProcessInputCharByChar(input1);
1429 EXPECT_THAT(decoder_.error(), IsQuicNoError());
1430 EXPECT_EQ("", decoder_.error_detail());
1431
1432 std::string input2 = absl::HexStringToBytes(
1433 "4089" // type (ACCEPT_CH)
1434 "08" // length
1435 "03" // length of origin
1436 "666f6f" // origin "foo"
1437 "03" // length of value
1438 "626172"); // value "bar"
1439
1440 AcceptChFrame accept_ch2;
1441 accept_ch2.entries.push_back({"foo", "bar"});
1442
1443 // Visitor pauses processing.
1444 EXPECT_CALL(visitor_, OnAcceptChFrameStart(3)).WillOnce(Return(false));
1445 remaining_input = input2;
1446 processed_bytes = ProcessInputWithGarbageAppended(remaining_input);
1447 EXPECT_EQ(3u, processed_bytes);
1448 remaining_input = remaining_input.substr(processed_bytes);
1449
1450 EXPECT_CALL(visitor_, OnAcceptChFrame(accept_ch2)).WillOnce(Return(false));
1451 processed_bytes = ProcessInputWithGarbageAppended(remaining_input);
1452 EXPECT_EQ(remaining_input.size(), processed_bytes);
1453 EXPECT_THAT(decoder_.error(), IsQuicNoError());
1454 EXPECT_EQ("", decoder_.error_detail());
1455
1456 // Process the full frame.
1457 EXPECT_CALL(visitor_, OnAcceptChFrameStart(3));
1458 EXPECT_CALL(visitor_, OnAcceptChFrame(accept_ch2));
1459 EXPECT_EQ(input2.size(), ProcessInput(input2));
1460 EXPECT_THAT(decoder_.error(), IsQuicNoError());
1461 EXPECT_EQ("", decoder_.error_detail());
1462
1463 // Process the frame incrementally.
1464 EXPECT_CALL(visitor_, OnAcceptChFrameStart(3));
1465 EXPECT_CALL(visitor_, OnAcceptChFrame(accept_ch2));
1466 ProcessInputCharByChar(input2);
1467 EXPECT_THAT(decoder_.error(), IsQuicNoError());
1468 EXPECT_EQ("", decoder_.error_detail());
1469}
1470
vasilvvb7b2d4f2021-04-05 18:07:13 -07001471TEST_F(HttpDecoderTest, WebTransportStreamDisabled) {
1472 InSequence s;
1473
1474 // Unknown frame of type 0x41 and length 0x104.
1475 std::string input = absl::HexStringToBytes("40414104");
1476 EXPECT_CALL(visitor_, OnUnknownFrameStart(0x41, input.size(), 0x104));
1477 EXPECT_EQ(ProcessInput(input), input.size());
1478}
1479
1480TEST(HttpDecoderTestNoFixture, WebTransportStream) {
1481 HttpDecoder::Options options;
1482 options.allow_web_transport_stream = true;
1483 testing::StrictMock<MockVisitor> visitor;
1484 HttpDecoder decoder(&visitor, options);
1485
1486 // WebTransport stream for session ID 0x104, with four bytes of extra data.
1487 std::string input = absl::HexStringToBytes("40414104ffffffff");
1488 EXPECT_CALL(visitor, OnWebTransportStreamFrameType(4, 0x104));
1489 QuicByteCount bytes = decoder.ProcessInput(input.data(), input.size());
1490 EXPECT_EQ(bytes, 4u);
1491}
1492
1493TEST(HttpDecoderTestNoFixture, WebTransportStreamError) {
1494 HttpDecoder::Options options;
1495 options.allow_web_transport_stream = true;
1496 testing::StrictMock<MockVisitor> visitor;
1497 HttpDecoder decoder(&visitor, options);
1498
1499 std::string input = absl::HexStringToBytes("404100");
1500 EXPECT_CALL(visitor, OnWebTransportStreamFrameType(_, _));
1501 decoder.ProcessInput(input.data(), input.size());
1502
1503 EXPECT_CALL(visitor, OnError(_));
1504 EXPECT_QUIC_BUG(decoder.ProcessInput(input.data(), input.size()),
1505 "HttpDecoder called after an indefinite-length frame");
1506}
1507
renjietangda000582020-05-05 16:05:07 -07001508TEST_F(HttpDecoderTest, DecodeSettings) {
vasilvv72b789c2020-10-27 17:39:17 -07001509 std::string input = absl::HexStringToBytes(
renjietangda000582020-05-05 16:05:07 -07001510 "04" // type (SETTINGS)
1511 "07" // length
1512 "01" // identifier (SETTINGS_QPACK_MAX_TABLE_CAPACITY)
1513 "02" // content
1514 "06" // identifier (SETTINGS_MAX_HEADER_LIST_SIZE)
1515 "05" // content
1516 "4100" // identifier, encoded on 2 bytes (0x40), value is 256 (0x100)
1517 "04"); // content
1518
1519 SettingsFrame frame;
1520 frame.values[1] = 2;
1521 frame.values[6] = 5;
1522 frame.values[256] = 4;
1523
1524 SettingsFrame out;
1525 EXPECT_TRUE(HttpDecoder::DecodeSettings(input.data(), input.size(), &out));
1526 EXPECT_EQ(frame, out);
1527
1528 // non-settings frame.
vasilvv72b789c2020-10-27 17:39:17 -07001529 input = absl::HexStringToBytes(
renjietangda000582020-05-05 16:05:07 -07001530 "0D" // type (MAX_PUSH_ID)
1531 "01" // length
1532 "01"); // Push Id
1533
1534 EXPECT_FALSE(HttpDecoder::DecodeSettings(input.data(), input.size(), &out));
1535
1536 // Corrupt SETTINGS.
vasilvv72b789c2020-10-27 17:39:17 -07001537 input = absl::HexStringToBytes(
renjietangda000582020-05-05 16:05:07 -07001538 "04" // type (SETTINGS)
1539 "01" // length
1540 "42"); // First byte of setting identifier, indicating a 2-byte varint62.
1541
1542 EXPECT_FALSE(HttpDecoder::DecodeSettings(input.data(), input.size(), &out));
1543}
1544
bnc62c32b42019-06-24 16:06:41 -07001545} // namespace test
1546
QUICHE teama6ef0a62019-03-07 20:34:33 -05001547} // namespace quic