1 // Copyright 2013 The Chromium Authors
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/quic/quic_test_packet_maker.h"
6
7 #include <list>
8 #include <utility>
9
10 #include "base/strings/strcat.h"
11 #include "base/strings/string_number_conversions.h"
12 #include "net/base/features.h"
13 #include "net/quic/mock_crypto_client_stream.h"
14 #include "net/quic/quic_chromium_client_session.h"
15 #include "net/quic/quic_http_utils.h"
16 #include "net/spdy/spdy_http_utils.h"
17 #include "net/third_party/quiche/src/quiche/common/quiche_buffer_allocator.h"
18 #include "net/third_party/quiche/src/quiche/common/simple_buffer_allocator.h"
19 #include "net/third_party/quiche/src/quiche/quic/core/http/http_constants.h"
20 #include "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_instruction_encoder.h"
21 #include "net/third_party/quiche/src/quiche/quic/core/quic_framer.h"
22 #include "net/third_party/quiche/src/quiche/quic/core/quic_stream.h"
23 #include "net/third_party/quiche/src/quiche/quic/core/quic_types.h"
24 #include "net/third_party/quiche/src/quiche/quic/core/quic_utils.h"
25 #include "net/third_party/quiche/src/quiche/quic/test_tools/mock_random.h"
26 #include "net/third_party/quiche/src/quiche/quic/test_tools/quic_test_utils.h"
27
28 namespace net::test {
29 namespace {
30
CloneFrames(const quic::QuicFrames & frames)31 quic::QuicFrames CloneFrames(const quic::QuicFrames& frames) {
32 quic::QuicFrames new_frames = frames;
33 for (auto& frame : new_frames) {
34 switch (frame.type) {
35 // Frames smaller than a pointer are inlined, so don't need to be cloned.
36 case quic::PADDING_FRAME:
37 case quic::MTU_DISCOVERY_FRAME:
38 case quic::PING_FRAME:
39 case quic::MAX_STREAMS_FRAME:
40 case quic::STOP_WAITING_FRAME:
41 case quic::STREAMS_BLOCKED_FRAME:
42 case quic::STREAM_FRAME:
43 case quic::HANDSHAKE_DONE_FRAME:
44 case quic::BLOCKED_FRAME:
45 case quic::WINDOW_UPDATE_FRAME:
46 case quic::STOP_SENDING_FRAME:
47 case quic::PATH_CHALLENGE_FRAME:
48 case quic::PATH_RESPONSE_FRAME:
49 break;
50 case quic::ACK_FRAME:
51 frame.ack_frame = new quic::QuicAckFrame(*frame.ack_frame);
52 break;
53 case quic::RST_STREAM_FRAME:
54 frame.rst_stream_frame =
55 new quic::QuicRstStreamFrame(*frame.rst_stream_frame);
56 break;
57 case quic::CONNECTION_CLOSE_FRAME:
58 frame.connection_close_frame =
59 new quic::QuicConnectionCloseFrame(*frame.connection_close_frame);
60 break;
61 case quic::GOAWAY_FRAME:
62 frame.goaway_frame = new quic::QuicGoAwayFrame(*frame.goaway_frame);
63 break;
64 case quic::NEW_CONNECTION_ID_FRAME:
65 frame.new_connection_id_frame =
66 new quic::QuicNewConnectionIdFrame(*frame.new_connection_id_frame);
67 break;
68 case quic::RETIRE_CONNECTION_ID_FRAME:
69 frame.retire_connection_id_frame =
70 new quic::QuicRetireConnectionIdFrame(
71 *frame.retire_connection_id_frame);
72 break;
73 case quic::MESSAGE_FRAME:
74 frame.message_frame = new quic::QuicMessageFrame(
75 frame.message_frame->message_id,
76 quiche::QuicheMemSlice(quiche::QuicheBuffer::Copy(
77 quiche::SimpleBufferAllocator::Get(),
78 frame.message_frame->message_data.data()->AsStringView())));
79 break;
80 case quic::CRYPTO_FRAME:
81 frame.crypto_frame = new quic::QuicCryptoFrame(*frame.crypto_frame);
82 break;
83 case quic::NEW_TOKEN_FRAME:
84 frame.new_token_frame =
85 new quic::QuicNewTokenFrame(*frame.new_token_frame);
86 break;
87 case quic::ACK_FREQUENCY_FRAME:
88 frame.ack_frequency_frame =
89 new quic::QuicAckFrequencyFrame(*frame.ack_frequency_frame);
90 break;
91 case quic::RESET_STREAM_AT_FRAME:
92 frame.reset_stream_at_frame =
93 new quic::QuicResetStreamAtFrame(*frame.reset_stream_at_frame);
94 break;
95
96 case quic::NUM_FRAME_TYPES:
97 DCHECK(false) << "Cannot clone frame type: " << frame.type;
98 }
99 }
100 return new_frames;
101 }
102
103
104 } // namespace
105
QuicTestPacketMaker(quic::ParsedQuicVersion version,quic::QuicConnectionId connection_id,const quic::QuicClock * clock,const std::string & host,quic::Perspective perspective,bool client_priority_uses_incremental,bool use_priority_header)106 QuicTestPacketMaker::QuicTestPacketMaker(quic::ParsedQuicVersion version,
107 quic::QuicConnectionId connection_id,
108 const quic::QuicClock* clock,
109 const std::string& host,
110 quic::Perspective perspective,
111 bool client_priority_uses_incremental,
112 bool use_priority_header)
113 : version_(version),
114 connection_id_(connection_id),
115 clock_(clock),
116 host_(host),
117 qpack_encoder_(&decoder_stream_error_delegate_,
118 quic::HuffmanEncoding::kEnabled),
119 perspective_(perspective),
120 client_priority_uses_incremental_(client_priority_uses_incremental),
121 use_priority_header_(use_priority_header) {
122 DCHECK(version.HasIetfQuicFrames());
123 DCHECK(!(perspective_ == quic::Perspective::IS_SERVER &&
124 client_priority_uses_incremental_));
125
126 qpack_encoder_.set_qpack_stream_sender_delegate(
127 &encoder_stream_sender_delegate_);
128 }
129
~QuicTestPacketMaker()130 QuicTestPacketMaker::~QuicTestPacketMaker() {
131 for (auto& kv : saved_frames_) {
132 quic::DeleteFrames(&(kv.second));
133 }
134 }
135
set_hostname(const std::string & host)136 void QuicTestPacketMaker::set_hostname(const std::string& host) {
137 host_.assign(host);
138 }
139
140 std::unique_ptr<quic::QuicReceivedPacket>
MakeConnectivityProbingPacket(uint64_t num)141 QuicTestPacketMaker::MakeConnectivityProbingPacket(uint64_t num) {
142 InitializeHeader(num);
143
144 if (perspective_ == quic::Perspective::IS_CLIENT) {
145 AddQuicPathChallengeFrame();
146 } else {
147 AddQuicPathResponseFrame();
148 }
149
150 AddQuicPaddingFrame();
151
152 return BuildPacket();
153 }
154
MakePingPacket(uint64_t num)155 std::unique_ptr<quic::QuicReceivedPacket> QuicTestPacketMaker::MakePingPacket(
156 uint64_t num) {
157 InitializeHeader(num);
158 AddQuicPingFrame();
159 return BuildPacket();
160 }
161
162 std::unique_ptr<quic::QuicReceivedPacket>
MakeRetireConnectionIdPacket(uint64_t num,uint64_t sequence_number)163 QuicTestPacketMaker::MakeRetireConnectionIdPacket(uint64_t num,
164 uint64_t sequence_number) {
165 InitializeHeader(num);
166 AddQuicRetireConnectionIdFrame(sequence_number);
167 return BuildPacket();
168 }
169
170 std::unique_ptr<quic::QuicReceivedPacket>
MakeNewConnectionIdPacket(uint64_t num,const quic::QuicConnectionId & cid,uint64_t sequence_number,uint64_t retire_prior_to)171 QuicTestPacketMaker::MakeNewConnectionIdPacket(
172 uint64_t num,
173 const quic::QuicConnectionId& cid,
174 uint64_t sequence_number,
175 uint64_t retire_prior_to) {
176 InitializeHeader(num);
177 AddQuicNewConnectionIdFrame(
178 cid, sequence_number, retire_prior_to,
179 quic::QuicUtils::GenerateStatelessResetToken(cid));
180 return BuildPacket();
181 }
182
183 std::unique_ptr<quic::QuicReceivedPacket>
MakeAckAndNewConnectionIdPacket(uint64_t num,uint64_t largest_received,uint64_t smallest_received,const quic::QuicConnectionId & cid,uint64_t sequence_number,uint64_t retire_prior_to)184 QuicTestPacketMaker::MakeAckAndNewConnectionIdPacket(
185 uint64_t num,
186 uint64_t largest_received,
187 uint64_t smallest_received,
188 const quic::QuicConnectionId& cid,
189 uint64_t sequence_number,
190 uint64_t retire_prior_to) {
191 InitializeHeader(num);
192 AddQuicAckFrame(largest_received, smallest_received);
193 AddQuicNewConnectionIdFrame(
194 cid, sequence_number, retire_prior_to,
195 quic::QuicUtils::GenerateStatelessResetToken(cid));
196 return BuildPacket();
197 }
198
199 std::unique_ptr<quic::QuicReceivedPacket>
MakeDummyCHLOPacket(uint64_t packet_num)200 QuicTestPacketMaker::MakeDummyCHLOPacket(uint64_t packet_num) {
201 SetEncryptionLevel(quic::ENCRYPTION_INITIAL);
202 InitializeHeader(packet_num);
203
204 quic::CryptoHandshakeMessage message =
205 MockCryptoClientStream::GetDummyCHLOMessage();
206 const quic::QuicData& data = message.GetSerialized();
207
208 AddQuicCryptoFrame(quic::ENCRYPTION_INITIAL, 0, data.length());
209
210 data_producer_ = std::make_unique<quic::test::SimpleDataProducer>();
211 data_producer_->SaveCryptoData(quic::ENCRYPTION_INITIAL, 0,
212 data.AsStringPiece());
213
214 AddQuicPaddingFrame();
215
216 return BuildPacket();
217 }
218
219 std::unique_ptr<quic::QuicReceivedPacket>
MakeAckAndPingPacket(uint64_t num,uint64_t largest_received,uint64_t smallest_received)220 QuicTestPacketMaker::MakeAckAndPingPacket(uint64_t num,
221 uint64_t largest_received,
222 uint64_t smallest_received) {
223 InitializeHeader(num);
224 AddQuicAckFrame(largest_received, smallest_received);
225 AddQuicPingFrame();
226 return BuildPacket();
227 }
228
229 std::unique_ptr<quic::QuicReceivedPacket>
MakeAckAndRetireConnectionIdPacket(uint64_t num,uint64_t largest_received,uint64_t smallest_received,uint64_t sequence_number)230 QuicTestPacketMaker::MakeAckAndRetireConnectionIdPacket(
231 uint64_t num,
232 uint64_t largest_received,
233 uint64_t smallest_received,
234 uint64_t sequence_number) {
235 InitializeHeader(num);
236 AddQuicAckFrame(largest_received, smallest_received);
237 AddQuicRetireConnectionIdFrame(sequence_number);
238 return BuildPacket();
239 }
240
241 std::unique_ptr<quic::QuicReceivedPacket>
MakeRetransmissionAndRetireConnectionIdPacket(uint64_t num,const std::vector<uint64_t> & original_packet_numbers,uint64_t sequence_number)242 QuicTestPacketMaker::MakeRetransmissionAndRetireConnectionIdPacket(
243 uint64_t num,
244 const std::vector<uint64_t>& original_packet_numbers,
245 uint64_t sequence_number) {
246 InitializeHeader(num);
247 for (auto it : original_packet_numbers) {
248 for (auto frame : saved_frames_[quic::QuicPacketNumber(it)]) {
249 if (!MaybeCoalesceStreamFrame(frame)) {
250 frames_.push_back(frame);
251 }
252 }
253 }
254 AddQuicRetireConnectionIdFrame(sequence_number);
255 return BuildPacket();
256 }
257
258 std::unique_ptr<quic::QuicReceivedPacket>
MakeStreamsBlockedPacket(uint64_t num,quic::QuicStreamCount stream_count,bool unidirectional)259 QuicTestPacketMaker::MakeStreamsBlockedPacket(
260 uint64_t num,
261 quic::QuicStreamCount stream_count,
262 bool unidirectional) {
263 InitializeHeader(num);
264 AddQuicStreamsBlockedFrame(1, stream_count, unidirectional);
265 return BuildPacket();
266 }
267
268 std::unique_ptr<quic::QuicReceivedPacket>
MakeMaxStreamsPacket(uint64_t num,quic::QuicStreamCount stream_count,bool unidirectional)269 QuicTestPacketMaker::MakeMaxStreamsPacket(uint64_t num,
270 quic::QuicStreamCount stream_count,
271 bool unidirectional) {
272 InitializeHeader(num);
273 AddQuicMaxStreamsFrame(1, stream_count, unidirectional);
274 return BuildPacket();
275 }
276
MakeRstPacket(uint64_t num,quic::QuicStreamId stream_id,quic::QuicRstStreamErrorCode error_code)277 std::unique_ptr<quic::QuicReceivedPacket> QuicTestPacketMaker::MakeRstPacket(
278 uint64_t num,
279 quic::QuicStreamId stream_id,
280 quic::QuicRstStreamErrorCode error_code) {
281 return MakeRstPacket(num, stream_id, error_code,
282 /*include_stop_sending_if_v99=*/true);
283 }
284
MakeRstPacket(uint64_t num,quic::QuicStreamId stream_id,quic::QuicRstStreamErrorCode error_code,bool include_stop_sending_if_v99)285 std::unique_ptr<quic::QuicReceivedPacket> QuicTestPacketMaker::MakeRstPacket(
286 uint64_t num,
287 quic::QuicStreamId stream_id,
288 quic::QuicRstStreamErrorCode error_code,
289 bool include_stop_sending_if_v99) {
290 InitializeHeader(num);
291
292 if (include_stop_sending_if_v99) {
293 AddQuicStopSendingFrame(stream_id, error_code);
294 }
295 if (quic::QuicUtils::IsBidirectionalStreamId(stream_id, version_)) {
296 AddQuicRstStreamFrame(stream_id, error_code);
297 }
298
299 return BuildPacket();
300 }
301
302 std::unique_ptr<quic::QuicReceivedPacket>
MakeRstAndDataPacket(uint64_t num,quic::QuicStreamId rst_stream_id,quic::QuicRstStreamErrorCode rst_error_code,quic::QuicStreamId data_stream_id,std::string_view data)303 QuicTestPacketMaker::MakeRstAndDataPacket(
304 uint64_t num,
305 quic::QuicStreamId rst_stream_id,
306 quic::QuicRstStreamErrorCode rst_error_code,
307 quic::QuicStreamId data_stream_id,
308 std::string_view data) {
309 InitializeHeader(num);
310
311 AddQuicStopSendingFrame(rst_stream_id, rst_error_code);
312 AddQuicRstStreamFrame(rst_stream_id, rst_error_code);
313 AddQuicStreamFrame(data_stream_id, /* fin = */ false, data);
314
315 return BuildPacket();
316 }
317
318 std::unique_ptr<quic::QuicReceivedPacket>
MakeRetransmissionRstAndDataPacket(const std::vector<uint64_t> & original_packet_numbers,uint64_t num,quic::QuicStreamId rst_stream_id,quic::QuicRstStreamErrorCode rst_error_code,quic::QuicStreamId data_stream_id,std::string_view data,uint64_t retransmit_frame_count)319 QuicTestPacketMaker::MakeRetransmissionRstAndDataPacket(
320 const std::vector<uint64_t>& original_packet_numbers,
321 uint64_t num,
322 quic::QuicStreamId rst_stream_id,
323 quic::QuicRstStreamErrorCode rst_error_code,
324 quic::QuicStreamId data_stream_id,
325 std::string_view data,
326 uint64_t retransmit_frame_count) {
327 DCHECK(save_packet_frames_);
328 InitializeHeader(num);
329
330 uint64_t frame_count = 0;
331 for (auto it : original_packet_numbers) {
332 for (auto frame : saved_frames_[quic::QuicPacketNumber(it)]) {
333 frame_count++;
334 if (retransmit_frame_count == 0 ||
335 frame_count <= retransmit_frame_count) {
336 if (!MaybeCoalesceStreamFrame(frame)) {
337 frames_.push_back(frame);
338 }
339 }
340 }
341 }
342
343 AddQuicStopSendingFrame(rst_stream_id, rst_error_code);
344 AddQuicRstStreamFrame(rst_stream_id, rst_error_code);
345 AddQuicStreamFrame(data_stream_id, /* fin = */ false, data);
346
347 return BuildPacket();
348 }
349
350 std::unique_ptr<quic::QuicReceivedPacket>
MakeDataAndRstPacket(uint64_t num,quic::QuicStreamId data_stream_id,std::string_view data,quic::QuicStreamId rst_stream_id,quic::QuicRstStreamErrorCode rst_error_code)351 QuicTestPacketMaker::MakeDataAndRstPacket(
352 uint64_t num,
353 quic::QuicStreamId data_stream_id,
354 std::string_view data,
355 quic::QuicStreamId rst_stream_id,
356 quic::QuicRstStreamErrorCode rst_error_code) {
357 InitializeHeader(num);
358
359 AddQuicStreamFrame(data_stream_id, /* fin = */ false, data);
360 AddQuicStopSendingFrame(rst_stream_id, rst_error_code);
361 AddQuicRstStreamFrame(rst_stream_id, rst_error_code);
362
363 return BuildPacket();
364 }
365
366 std::unique_ptr<quic::QuicReceivedPacket>
MakeDataRstAndAckPacket(uint64_t num,quic::QuicStreamId data_stream_id,std::string_view data,quic::QuicStreamId rst_stream_id,quic::QuicRstStreamErrorCode rst_error_code,uint64_t largest_received,uint64_t smallest_received)367 QuicTestPacketMaker::MakeDataRstAndAckPacket(
368 uint64_t num,
369 quic::QuicStreamId data_stream_id,
370 std::string_view data,
371 quic::QuicStreamId rst_stream_id,
372 quic::QuicRstStreamErrorCode rst_error_code,
373 uint64_t largest_received,
374 uint64_t smallest_received) {
375 InitializeHeader(num);
376
377 AddQuicAckFrame(largest_received, smallest_received);
378
379 AddQuicStreamFrame(data_stream_id, /* fin = */ false, data);
380 AddQuicStopSendingFrame(rst_stream_id, rst_error_code);
381 AddQuicRstStreamFrame(rst_stream_id, rst_error_code);
382
383 return BuildPacket();
384 }
385
386 std::unique_ptr<quic::QuicReceivedPacket>
MakeAckAndRstPacket(uint64_t num,quic::QuicStreamId stream_id,quic::QuicRstStreamErrorCode error_code,uint64_t largest_received,uint64_t smallest_received)387 QuicTestPacketMaker::MakeAckAndRstPacket(
388 uint64_t num,
389 quic::QuicStreamId stream_id,
390 quic::QuicRstStreamErrorCode error_code,
391 uint64_t largest_received,
392 uint64_t smallest_received) {
393 return MakeAckAndRstPacket(num, stream_id, error_code, largest_received,
394 smallest_received,
395 /*include_stop_sending_if_v99=*/true);
396 }
397
398 std::unique_ptr<quic::QuicReceivedPacket>
MakeAckAndRstPacket(uint64_t num,quic::QuicStreamId stream_id,quic::QuicRstStreamErrorCode error_code,uint64_t largest_received,uint64_t smallest_received,bool include_stop_sending_if_v99)399 QuicTestPacketMaker::MakeAckAndRstPacket(
400 uint64_t num,
401 quic::QuicStreamId stream_id,
402 quic::QuicRstStreamErrorCode error_code,
403 uint64_t largest_received,
404 uint64_t smallest_received,
405 bool include_stop_sending_if_v99) {
406 InitializeHeader(num);
407
408 AddQuicAckFrame(largest_received, smallest_received);
409
410 if (include_stop_sending_if_v99) {
411 AddQuicStopSendingFrame(stream_id, error_code);
412 }
413 if (quic::QuicUtils::IsBidirectionalStreamId(stream_id, version_)) {
414 AddQuicRstStreamFrame(stream_id, error_code);
415 }
416
417 return BuildPacket();
418 }
419
420 std::unique_ptr<quic::QuicReceivedPacket>
MakeRstAckAndConnectionClosePacket(uint64_t num,quic::QuicStreamId stream_id,quic::QuicRstStreamErrorCode error_code,uint64_t largest_received,uint64_t smallest_received,quic::QuicErrorCode quic_error,const std::string & quic_error_details)421 QuicTestPacketMaker::MakeRstAckAndConnectionClosePacket(
422 uint64_t num,
423 quic::QuicStreamId stream_id,
424 quic::QuicRstStreamErrorCode error_code,
425 uint64_t largest_received,
426 uint64_t smallest_received,
427 quic::QuicErrorCode quic_error,
428 const std::string& quic_error_details) {
429 InitializeHeader(num);
430
431 AddQuicAckFrame(largest_received, smallest_received);
432
433 AddQuicStopSendingFrame(stream_id, error_code);
434 AddQuicRstStreamFrame(stream_id, error_code);
435 AddQuicConnectionCloseFrame(quic_error, quic_error_details);
436
437 return BuildPacket();
438 }
439
440 std::unique_ptr<quic::QuicReceivedPacket>
MakeRstAckAndDataPacket(uint64_t num,quic::QuicStreamId stream_id,quic::QuicRstStreamErrorCode error_code,uint64_t largest_received,uint64_t smallest_received,quic::QuicStreamId data_id,bool fin,std::string_view data)441 QuicTestPacketMaker::MakeRstAckAndDataPacket(
442 uint64_t num,
443 quic::QuicStreamId stream_id,
444 quic::QuicRstStreamErrorCode error_code,
445 uint64_t largest_received,
446 uint64_t smallest_received,
447 quic::QuicStreamId data_id,
448 bool fin,
449 std::string_view data) {
450 InitializeHeader(num);
451
452 AddQuicRstStreamFrame(stream_id, error_code);
453
454 AddQuicAckFrame(largest_received, smallest_received);
455 AddQuicStreamFrame(data_id, fin, data);
456 return BuildPacket();
457 }
458
459 std::unique_ptr<quic::QuicReceivedPacket>
MakeAckDataAndRst(uint64_t num,quic::QuicStreamId stream_id,quic::QuicRstStreamErrorCode error_code,uint64_t largest_received,uint64_t smallest_received,quic::QuicStreamId data_id,bool fin,std::string_view data)460 QuicTestPacketMaker::MakeAckDataAndRst(uint64_t num,
461 quic::QuicStreamId stream_id,
462 quic::QuicRstStreamErrorCode error_code,
463 uint64_t largest_received,
464 uint64_t smallest_received,
465 quic::QuicStreamId data_id,
466 bool fin,
467 std::string_view data) {
468 InitializeHeader(num);
469
470 AddQuicAckFrame(largest_received, smallest_received);
471 AddQuicStreamFrame(data_id, fin, data);
472
473 AddQuicStopSendingFrame(stream_id, error_code);
474 AddQuicRstStreamFrame(stream_id, error_code);
475
476 return BuildPacket();
477 }
478
479 std::unique_ptr<quic::QuicReceivedPacket>
MakeAckRstAndDataPacket(uint64_t num,quic::QuicStreamId stream_id,quic::QuicRstStreamErrorCode error_code,uint64_t largest_received,uint64_t smallest_received,quic::QuicStreamId data_id,bool fin,std::string_view data)480 QuicTestPacketMaker::MakeAckRstAndDataPacket(
481 uint64_t num,
482 quic::QuicStreamId stream_id,
483 quic::QuicRstStreamErrorCode error_code,
484 uint64_t largest_received,
485 uint64_t smallest_received,
486 quic::QuicStreamId data_id,
487 bool fin,
488 std::string_view data) {
489 InitializeHeader(num);
490
491 AddQuicAckFrame(largest_received, smallest_received);
492 AddQuicRstStreamFrame(stream_id, error_code);
493 AddQuicStreamFrame(data_id, fin, data);
494 return BuildPacket();
495 }
496
497 std::unique_ptr<quic::QuicReceivedPacket>
MakeAckAndRetransmissionPacket(uint64_t packet_number,uint64_t first_received,uint64_t largest_received,uint64_t smallest_received,const std::vector<uint64_t> & original_packet_numbers)498 QuicTestPacketMaker::MakeAckAndRetransmissionPacket(
499 uint64_t packet_number,
500 uint64_t first_received,
501 uint64_t largest_received,
502 uint64_t smallest_received,
503 const std::vector<uint64_t>& original_packet_numbers) {
504 DCHECK(save_packet_frames_);
505 InitializeHeader(packet_number);
506 AddQuicAckFrame(first_received, largest_received, smallest_received);
507 for (auto it : original_packet_numbers) {
508 for (auto frame : saved_frames_[quic::QuicPacketNumber(it)]) {
509 if (!MaybeCoalesceStreamFrame(frame)) {
510 frames_.push_back(frame);
511 }
512 }
513 }
514
515 return BuildPacket();
516 }
517
518 std::unique_ptr<quic::QuicReceivedPacket>
MakeCombinedRetransmissionPacket(const std::vector<uint64_t> & original_packet_numbers,uint64_t new_packet_number)519 QuicTestPacketMaker::MakeCombinedRetransmissionPacket(
520 const std::vector<uint64_t>& original_packet_numbers,
521 uint64_t new_packet_number) {
522 DCHECK(save_packet_frames_);
523 InitializeHeader(new_packet_number);
524 for (auto it : original_packet_numbers) {
525 for (auto& frame : CloneFrames(saved_frames_[quic::QuicPacketNumber(it)])) {
526 if (frame.type != quic::PADDING_FRAME) {
527 if (!MaybeCoalesceStreamFrame(frame)) {
528 frames_.push_back(frame);
529 }
530 }
531 }
532 }
533
534 return BuildPacket();
535 }
536
537 std::unique_ptr<quic::QuicReceivedPacket>
MakeRstAndConnectionClosePacket(uint64_t num,quic::QuicStreamId stream_id,quic::QuicRstStreamErrorCode error_code,quic::QuicErrorCode quic_error,const std::string & quic_error_details)538 QuicTestPacketMaker::MakeRstAndConnectionClosePacket(
539 uint64_t num,
540 quic::QuicStreamId stream_id,
541 quic::QuicRstStreamErrorCode error_code,
542 quic::QuicErrorCode quic_error,
543 const std::string& quic_error_details) {
544 InitializeHeader(num);
545
546 AddQuicStopSendingFrame(stream_id, error_code);
547 AddQuicRstStreamFrame(stream_id, error_code);
548
549 AddQuicConnectionCloseFrame(quic_error, quic_error_details);
550
551 return BuildPacket();
552 }
553
554 std::unique_ptr<quic::QuicReceivedPacket>
MakeDataRstAndConnectionClosePacket(uint64_t num,quic::QuicStreamId data_stream_id,std::string_view data,quic::QuicStreamId rst_stream_id,quic::QuicRstStreamErrorCode error_code,quic::QuicErrorCode quic_error,const std::string & quic_error_details)555 QuicTestPacketMaker::MakeDataRstAndConnectionClosePacket(
556 uint64_t num,
557 quic::QuicStreamId data_stream_id,
558 std::string_view data,
559 quic::QuicStreamId rst_stream_id,
560 quic::QuicRstStreamErrorCode error_code,
561 quic::QuicErrorCode quic_error,
562 const std::string& quic_error_details) {
563 InitializeHeader(num);
564
565 AddQuicStreamFrame(data_stream_id, /* fin = */ false, data);
566 AddQuicStopSendingFrame(rst_stream_id, error_code);
567 AddQuicRstStreamFrame(rst_stream_id, error_code);
568
569 AddQuicConnectionCloseFrame(quic_error, quic_error_details);
570
571 return BuildPacket();
572 }
573
574 std::unique_ptr<quic::QuicReceivedPacket>
MakeDataRstAckAndConnectionClosePacket(uint64_t num,quic::QuicStreamId data_stream_id,std::string_view data,quic::QuicStreamId rst_stream_id,quic::QuicRstStreamErrorCode error_code,uint64_t largest_received,uint64_t smallest_received,quic::QuicErrorCode quic_error,const std::string & quic_error_details)575 QuicTestPacketMaker::MakeDataRstAckAndConnectionClosePacket(
576 uint64_t num,
577 quic::QuicStreamId data_stream_id,
578 std::string_view data,
579 quic::QuicStreamId rst_stream_id,
580 quic::QuicRstStreamErrorCode error_code,
581 uint64_t largest_received,
582 uint64_t smallest_received,
583 quic::QuicErrorCode quic_error,
584 const std::string& quic_error_details) {
585 InitializeHeader(num);
586
587 AddQuicAckFrame(largest_received, smallest_received);
588
589 AddQuicStreamFrame(data_stream_id, /* fin = */ false, data);
590 AddQuicStopSendingFrame(rst_stream_id, error_code);
591 AddQuicRstStreamFrame(rst_stream_id, error_code);
592
593 AddQuicConnectionCloseFrame(quic_error, quic_error_details);
594
595 return BuildPacket();
596 }
597
598 std::unique_ptr<quic::QuicReceivedPacket>
MakeDataRstAckAndConnectionClosePacket(uint64_t num,quic::QuicStreamId data_stream_id,std::string_view data,quic::QuicStreamId rst_stream_id,quic::QuicRstStreamErrorCode error_code,uint64_t largest_received,uint64_t smallest_received,quic::QuicErrorCode quic_error,const std::string & quic_error_details,uint64_t frame_type)599 QuicTestPacketMaker::MakeDataRstAckAndConnectionClosePacket(
600 uint64_t num,
601 quic::QuicStreamId data_stream_id,
602 std::string_view data,
603 quic::QuicStreamId rst_stream_id,
604 quic::QuicRstStreamErrorCode error_code,
605 uint64_t largest_received,
606 uint64_t smallest_received,
607 quic::QuicErrorCode quic_error,
608 const std::string& quic_error_details,
609 uint64_t frame_type) {
610 InitializeHeader(num);
611
612 AddQuicStreamFrame(data_stream_id, /* fin = */ false, data);
613 AddQuicStopSendingFrame(rst_stream_id, error_code);
614 AddQuicRstStreamFrame(rst_stream_id, error_code);
615
616 AddQuicAckFrame(largest_received, smallest_received);
617 AddQuicConnectionCloseFrame(quic_error, quic_error_details, frame_type);
618
619 return BuildPacket();
620 }
621
622 std::unique_ptr<quic::QuicReceivedPacket>
MakeStopSendingPacket(uint64_t num,quic::QuicStreamId stream_id,quic::QuicRstStreamErrorCode error_code)623 QuicTestPacketMaker::MakeStopSendingPacket(
624 uint64_t num,
625 quic::QuicStreamId stream_id,
626 quic::QuicRstStreamErrorCode error_code) {
627 InitializeHeader(num);
628 AddQuicStopSendingFrame(stream_id, error_code);
629
630 return BuildPacket();
631 }
632
633 std::unique_ptr<quic::QuicReceivedPacket>
MakeAckAndConnectionClosePacket(uint64_t num,uint64_t largest_received,uint64_t smallest_received,quic::QuicErrorCode quic_error,const std::string & quic_error_details,uint64_t frame_type)634 QuicTestPacketMaker::MakeAckAndConnectionClosePacket(
635 uint64_t num,
636 uint64_t largest_received,
637 uint64_t smallest_received,
638 quic::QuicErrorCode quic_error,
639 const std::string& quic_error_details,
640 uint64_t frame_type) {
641 InitializeHeader(num);
642 AddQuicAckFrame(largest_received, smallest_received);
643 AddQuicConnectionCloseFrame(quic_error, quic_error_details, frame_type);
644 return BuildPacket();
645 }
646
647 std::unique_ptr<quic::QuicReceivedPacket>
MakeConnectionClosePacket(uint64_t num,quic::QuicErrorCode quic_error,const std::string & quic_error_details)648 QuicTestPacketMaker::MakeConnectionClosePacket(
649 uint64_t num,
650 quic::QuicErrorCode quic_error,
651 const std::string& quic_error_details) {
652 InitializeHeader(num);
653 AddQuicConnectionCloseFrame(quic_error, quic_error_details);
654 return BuildPacket();
655 }
656
MakeGoAwayPacket(uint64_t num,quic::QuicErrorCode error_code,std::string reason_phrase)657 std::unique_ptr<quic::QuicReceivedPacket> QuicTestPacketMaker::MakeGoAwayPacket(
658 uint64_t num,
659 quic::QuicErrorCode error_code,
660 std::string reason_phrase) {
661 InitializeHeader(num);
662 AddQuicGoAwayFrame(error_code, reason_phrase);
663 return BuildPacket();
664 }
665
MakeAckPacket(uint64_t packet_number,uint64_t largest_received,uint64_t smallest_received)666 std::unique_ptr<quic::QuicReceivedPacket> QuicTestPacketMaker::MakeAckPacket(
667 uint64_t packet_number,
668 uint64_t largest_received,
669 uint64_t smallest_received) {
670 return MakeAckPacket(packet_number, 1, largest_received, smallest_received);
671 }
672
MakeAckPacket(uint64_t packet_number,uint64_t first_received,uint64_t largest_received,uint64_t smallest_received,std::optional<quic::QuicEcnCounts> ecn)673 std::unique_ptr<quic::QuicReceivedPacket> QuicTestPacketMaker::MakeAckPacket(
674 uint64_t packet_number,
675 uint64_t first_received,
676 uint64_t largest_received,
677 uint64_t smallest_received,
678 std::optional<quic::QuicEcnCounts> ecn) {
679 InitializeHeader(packet_number);
680 AddQuicAckFrame(first_received, largest_received, smallest_received, ecn);
681 return BuildPacket();
682 }
683
MakeDataPacket(uint64_t packet_number,quic::QuicStreamId stream_id,bool fin,std::string_view data)684 std::unique_ptr<quic::QuicReceivedPacket> QuicTestPacketMaker::MakeDataPacket(
685 uint64_t packet_number,
686 quic::QuicStreamId stream_id,
687 bool fin,
688 std::string_view data) {
689 InitializeHeader(packet_number);
690 AddQuicStreamFrame(stream_id, fin, data);
691 return BuildPacket();
692 }
693
694 std::unique_ptr<quic::QuicReceivedPacket>
MakeDatagramPacket(uint64_t packet_number,std::string_view datagram)695 QuicTestPacketMaker::MakeDatagramPacket(uint64_t packet_number,
696 std::string_view datagram) {
697 InitializeHeader(packet_number);
698 AddQuicMessageFrame(datagram);
699 return BuildPacket();
700 }
701
702 std::unique_ptr<quic::QuicReceivedPacket>
MakeDatagramPacket(uint64_t packet_number,std::vector<std::string> datagrams)703 QuicTestPacketMaker::MakeDatagramPacket(uint64_t packet_number,
704 std::vector<std::string> datagrams) {
705 InitializeHeader(packet_number);
706 for (auto& datagram : datagrams) {
707 AddQuicMessageFrame(datagram);
708 }
709 return BuildPacket();
710 }
711
712 std::unique_ptr<quic::QuicReceivedPacket>
MakeAckAndDataPacket(uint64_t packet_number,quic::QuicStreamId stream_id,uint64_t largest_received,uint64_t smallest_received,bool fin,std::string_view data)713 QuicTestPacketMaker::MakeAckAndDataPacket(uint64_t packet_number,
714 quic::QuicStreamId stream_id,
715 uint64_t largest_received,
716 uint64_t smallest_received,
717 bool fin,
718 std::string_view data) {
719 InitializeHeader(packet_number);
720
721 AddQuicAckFrame(largest_received, smallest_received);
722 AddQuicStreamFrame(stream_id, fin, data);
723 return BuildPacket();
724 }
725
726 std::unique_ptr<quic::QuicReceivedPacket>
MakeAckAndDatagramPacket(uint64_t packet_number,uint64_t largest_received,uint64_t smallest_received,std::string_view data)727 QuicTestPacketMaker::MakeAckAndDatagramPacket(uint64_t packet_number,
728 uint64_t largest_received,
729 uint64_t smallest_received,
730 std::string_view data) {
731 InitializeHeader(packet_number);
732
733 AddQuicAckFrame(largest_received, smallest_received);
734 AddQuicMessageFrame(data);
735 return BuildPacket();
736 }
737
738 std::unique_ptr<quic::QuicReceivedPacket>
MakeAckRetransmissionAndDataPacket(uint64_t packet_number,const std::vector<uint64_t> & original_packet_numbers,quic::QuicStreamId stream_id,uint64_t largest_received,uint64_t smallest_received,bool fin,std::string_view data)739 QuicTestPacketMaker::MakeAckRetransmissionAndDataPacket(
740 uint64_t packet_number,
741 const std::vector<uint64_t>& original_packet_numbers,
742 quic::QuicStreamId stream_id,
743 uint64_t largest_received,
744 uint64_t smallest_received,
745 bool fin,
746 std::string_view data) {
747 InitializeHeader(packet_number);
748
749 AddQuicAckFrame(largest_received, smallest_received);
750 for (auto it : original_packet_numbers) {
751 for (auto frame : saved_frames_[quic::QuicPacketNumber(it)]) {
752 if (!MaybeCoalesceStreamFrame(frame)) {
753 frames_.push_back(frame);
754 }
755 }
756 }
757 AddQuicStreamFrame(stream_id, fin, data);
758
759 return BuildPacket();
760 }
761
762 std::unique_ptr<quic::QuicReceivedPacket>
MakeRequestHeadersAndMultipleDataFramesPacket(uint64_t packet_number,quic::QuicStreamId stream_id,bool fin,spdy::SpdyPriority spdy_priority,spdy::Http2HeaderBlock headers,size_t * spdy_headers_frame_length,const std::vector<std::string> & data_writes)763 QuicTestPacketMaker::MakeRequestHeadersAndMultipleDataFramesPacket(
764 uint64_t packet_number,
765 quic::QuicStreamId stream_id,
766 bool fin,
767 spdy::SpdyPriority spdy_priority,
768 spdy::Http2HeaderBlock headers,
769 size_t* spdy_headers_frame_length,
770 const std::vector<std::string>& data_writes) {
771 InitializeHeader(packet_number);
772
773 MaybeAddHttp3SettingsFrames();
774
775 std::string priority_data =
776 GenerateHttp3PriorityData(spdy_priority, stream_id);
777 if (!priority_data.empty()) {
778 AddQuicStreamFrame(2, false, priority_data);
779 }
780
781 AddPriorityHeader(spdy_priority, &headers);
782 std::string data = QpackEncodeHeaders(stream_id, std::move(headers),
783 spdy_headers_frame_length);
784 for (const auto& data_write : data_writes) {
785 data += data_write;
786 }
787 AddQuicStreamFrame(stream_id, fin, data);
788
789 return BuildPacket();
790 }
791
792 std::unique_ptr<quic::QuicReceivedPacket>
MakeRequestHeadersPacket(uint64_t packet_number,quic::QuicStreamId stream_id,bool fin,spdy::SpdyPriority spdy_priority,spdy::Http2HeaderBlock headers,size_t * spdy_headers_frame_length,bool should_include_priority_frame)793 QuicTestPacketMaker::MakeRequestHeadersPacket(
794 uint64_t packet_number,
795 quic::QuicStreamId stream_id,
796 bool fin,
797 spdy::SpdyPriority spdy_priority,
798 spdy::Http2HeaderBlock headers,
799 size_t* spdy_headers_frame_length,
800 bool should_include_priority_frame) {
801 InitializeHeader(packet_number);
802
803 MaybeAddHttp3SettingsFrames();
804
805 if (should_include_priority_frame) {
806 std::string priority_data =
807 GenerateHttp3PriorityData(spdy_priority, stream_id);
808 if (!priority_data.empty()) {
809 AddQuicStreamFrame(2, false, priority_data);
810 }
811 }
812
813 AddPriorityHeader(spdy_priority, &headers);
814 std::string data = QpackEncodeHeaders(stream_id, std::move(headers),
815 spdy_headers_frame_length);
816 AddQuicStreamFrame(stream_id, fin, data);
817
818 return BuildPacket();
819 }
820
821 std::unique_ptr<quic::QuicReceivedPacket>
MakeRetransmissionAndRequestHeadersPacket(const std::vector<uint64_t> & original_packet_numbers,uint64_t packet_number,quic::QuicStreamId stream_id,bool fin,spdy::SpdyPriority spdy_priority,spdy::Http2HeaderBlock headers,size_t * spdy_headers_frame_length)822 QuicTestPacketMaker::MakeRetransmissionAndRequestHeadersPacket(
823 const std::vector<uint64_t>& original_packet_numbers,
824 uint64_t packet_number,
825 quic::QuicStreamId stream_id,
826 bool fin,
827 spdy::SpdyPriority spdy_priority,
828 spdy::Http2HeaderBlock headers,
829 size_t* spdy_headers_frame_length) {
830 DCHECK(save_packet_frames_);
831 InitializeHeader(packet_number);
832
833 for (auto it : original_packet_numbers) {
834 for (auto frame : saved_frames_[quic::QuicPacketNumber(it)]) {
835 if (!MaybeCoalesceStreamFrame(frame)) {
836 frames_.push_back(frame);
837 }
838 }
839 }
840
841 MaybeAddHttp3SettingsFrames();
842
843 std::string priority_data =
844 GenerateHttp3PriorityData(spdy_priority, stream_id);
845 if (!priority_data.empty()) {
846 AddQuicStreamFrame(2, false, priority_data);
847 }
848
849 AddPriorityHeader(spdy_priority, &headers);
850 std::string data = QpackEncodeHeaders(stream_id, std::move(headers),
851 spdy_headers_frame_length);
852 AddQuicStreamFrame(stream_id, fin, data);
853
854 return BuildPacket();
855 }
856
857 std::unique_ptr<quic::QuicReceivedPacket>
MakeRequestHeadersAndRstPacket(uint64_t packet_number,quic::QuicStreamId stream_id,bool fin,spdy::SpdyPriority spdy_priority,spdy::Http2HeaderBlock headers,size_t * spdy_headers_frame_length,quic::QuicRstStreamErrorCode error_code)858 QuicTestPacketMaker::MakeRequestHeadersAndRstPacket(
859 uint64_t packet_number,
860 quic::QuicStreamId stream_id,
861 bool fin,
862 spdy::SpdyPriority spdy_priority,
863 spdy::Http2HeaderBlock headers,
864 size_t* spdy_headers_frame_length,
865 quic::QuicRstStreamErrorCode error_code) {
866 InitializeHeader(packet_number);
867
868 MaybeAddHttp3SettingsFrames();
869
870 std::string priority_data =
871 GenerateHttp3PriorityData(spdy_priority, stream_id);
872 if (!priority_data.empty()) {
873 AddQuicStreamFrame(2, false, priority_data);
874 }
875
876 AddPriorityHeader(spdy_priority, &headers);
877 std::string data = QpackEncodeHeaders(stream_id, std::move(headers),
878 spdy_headers_frame_length);
879 AddQuicStreamFrame(stream_id, fin, data);
880 AddQuicStopSendingFrame(stream_id, error_code);
881 AddQuicRstStreamFrame(stream_id, error_code);
882
883 return BuildPacket();
884 }
885
886 std::unique_ptr<quic::QuicReceivedPacket>
MakeResponseHeadersPacket(uint64_t packet_number,quic::QuicStreamId stream_id,bool fin,spdy::Http2HeaderBlock headers,size_t * spdy_headers_frame_length)887 QuicTestPacketMaker::MakeResponseHeadersPacket(
888 uint64_t packet_number,
889 quic::QuicStreamId stream_id,
890 bool fin,
891 spdy::Http2HeaderBlock headers,
892 size_t* spdy_headers_frame_length) {
893 InitializeHeader(packet_number);
894
895 std::string data = QpackEncodeHeaders(stream_id, std::move(headers),
896 spdy_headers_frame_length);
897
898 AddQuicStreamFrame(stream_id, fin, data);
899
900 return BuildPacket();
901 }
902
903 std::unique_ptr<quic::QuicReceivedPacket>
MakeInitialSettingsPacket(uint64_t packet_number)904 QuicTestPacketMaker::MakeInitialSettingsPacket(uint64_t packet_number) {
905 InitializeHeader(packet_number);
906 MaybeAddHttp3SettingsFrames();
907 return BuildPacket();
908 }
909
910 std::unique_ptr<quic::QuicReceivedPacket>
MakePriorityPacket(uint64_t packet_number,quic::QuicStreamId id,spdy::SpdyPriority spdy_priority)911 QuicTestPacketMaker::MakePriorityPacket(uint64_t packet_number,
912 quic::QuicStreamId id,
913 spdy::SpdyPriority spdy_priority) {
914 InitializeHeader(packet_number);
915
916 std::string priority_data = GenerateHttp3PriorityData(spdy_priority, id);
917 if (!priority_data.empty()) {
918 AddQuicStreamFrame(2, false, priority_data);
919 }
920
921 return BuildPacket();
922 }
923
924 std::unique_ptr<quic::QuicReceivedPacket>
MakeAckAndPriorityPacket(uint64_t packet_number,uint64_t largest_received,uint64_t smallest_received,quic::QuicStreamId id,spdy::SpdyPriority spdy_priority)925 QuicTestPacketMaker::MakeAckAndPriorityPacket(
926 uint64_t packet_number,
927 uint64_t largest_received,
928 uint64_t smallest_received,
929 quic::QuicStreamId id,
930 spdy::SpdyPriority spdy_priority) {
931 InitializeHeader(packet_number);
932
933 AddQuicAckFrame(largest_received, smallest_received);
934
935 std::string priority_data = GenerateHttp3PriorityData(spdy_priority, id);
936 if (!priority_data.empty()) {
937 AddQuicStreamFrame(2, false, priority_data);
938 }
939
940 return BuildPacket();
941 }
942
943 std::unique_ptr<quic::QuicReceivedPacket>
MakeAckAndPriorityUpdatePacket(uint64_t packet_number,uint64_t largest_received,uint64_t smallest_received,quic::QuicStreamId id,spdy::SpdyPriority spdy_priority)944 QuicTestPacketMaker::MakeAckAndPriorityUpdatePacket(
945 uint64_t packet_number,
946 uint64_t largest_received,
947 uint64_t smallest_received,
948 quic::QuicStreamId id,
949 spdy::SpdyPriority spdy_priority) {
950 InitializeHeader(packet_number);
951
952 AddQuicAckFrame(largest_received, smallest_received);
953
954 std::string priority_data = GenerateHttp3PriorityData(spdy_priority, id);
955 if (!priority_data.empty()) {
956 AddQuicStreamFrame(2, false, priority_data);
957 }
958
959 return BuildPacket();
960 }
961
962 std::unique_ptr<quic::QuicReceivedPacket>
MakeRetransmissionPacket(uint64_t original_packet_number,uint64_t new_packet_number)963 QuicTestPacketMaker::MakeRetransmissionPacket(uint64_t original_packet_number,
964 uint64_t new_packet_number) {
965 DCHECK(save_packet_frames_);
966 InitializeHeader(new_packet_number);
967 return BuildPacketImpl(
968 saved_frames_[quic::QuicPacketNumber(original_packet_number)], nullptr);
969 }
970
971 std::unique_ptr<quic::QuicEncryptedPacket>
MakeStatelessResetPacket()972 QuicTestPacketMaker::MakeStatelessResetPacket() {
973 auto connection_id = quic::test::TestConnectionId();
974 return quic::QuicFramer::BuildIetfStatelessResetPacket(
975 connection_id, quic::QuicFramer::GetMinStatelessResetPacketLength() + 1,
976 quic::QuicUtils::GenerateStatelessResetToken(connection_id));
977 }
978
RemoveSavedStreamFrames(quic::QuicStreamId stream_id)979 void QuicTestPacketMaker::RemoveSavedStreamFrames(
980 quic::QuicStreamId stream_id) {
981 for (auto& kv : saved_frames_) {
982 auto* it = kv.second.begin();
983 while (it != kv.second.end()) {
984 if (it->type == quic::STREAM_FRAME &&
985 it->stream_frame.stream_id == stream_id) {
986 it = kv.second.erase(it);
987 } else {
988 ++it;
989 }
990 }
991 }
992 }
993
SetEncryptionLevel(quic::EncryptionLevel level)994 void QuicTestPacketMaker::SetEncryptionLevel(quic::EncryptionLevel level) {
995 encryption_level_ = level;
996 switch (level) {
997 case quic::ENCRYPTION_INITIAL:
998 long_header_type_ = quic::INITIAL;
999 break;
1000 case quic::ENCRYPTION_ZERO_RTT:
1001 long_header_type_ = quic::ZERO_RTT_PROTECTED;
1002 break;
1003 case quic::ENCRYPTION_FORWARD_SECURE:
1004 long_header_type_ = quic::INVALID_PACKET_TYPE;
1005 break;
1006 default:
1007 LOG(DFATAL) << quic::EncryptionLevelToString(level);
1008 long_header_type_ = quic::INVALID_PACKET_TYPE;
1009 }
1010 }
1011
GetRequestHeaders(const std::string & method,const std::string & scheme,const std::string & path) const1012 spdy::Http2HeaderBlock QuicTestPacketMaker::GetRequestHeaders(
1013 const std::string& method,
1014 const std::string& scheme,
1015 const std::string& path) const {
1016 spdy::Http2HeaderBlock headers;
1017 headers[":method"] = method;
1018 headers[":authority"] = host_;
1019 headers[":scheme"] = scheme;
1020 headers[":path"] = path;
1021 return headers;
1022 }
1023
ConnectRequestHeaders(const std::string & host_port) const1024 spdy::Http2HeaderBlock QuicTestPacketMaker::ConnectRequestHeaders(
1025 const std::string& host_port) const {
1026 spdy::Http2HeaderBlock headers;
1027 headers[":method"] = "CONNECT";
1028 headers[":authority"] = host_port;
1029 return headers;
1030 }
1031
GetResponseHeaders(const std::string & status) const1032 spdy::Http2HeaderBlock QuicTestPacketMaker::GetResponseHeaders(
1033 const std::string& status) const {
1034 spdy::Http2HeaderBlock headers;
1035 headers[":status"] = status;
1036 headers["content-type"] = "text/plain";
1037 return headers;
1038 }
1039
GetResponseHeaders(const std::string & status,const std::string & alt_svc) const1040 spdy::Http2HeaderBlock QuicTestPacketMaker::GetResponseHeaders(
1041 const std::string& status,
1042 const std::string& alt_svc) const {
1043 spdy::Http2HeaderBlock headers;
1044 headers[":status"] = status;
1045 headers["alt-svc"] = alt_svc;
1046 headers["content-type"] = "text/plain";
1047 return headers;
1048 }
1049
Reset()1050 void QuicTestPacketMaker::Reset() {
1051 stream_offsets_.clear();
1052 }
1053
QpackEncodeHeaders(quic::QuicStreamId stream_id,spdy::Http2HeaderBlock headers,size_t * encoded_data_length)1054 std::string QuicTestPacketMaker::QpackEncodeHeaders(
1055 quic::QuicStreamId stream_id,
1056 spdy::Http2HeaderBlock headers,
1057 size_t* encoded_data_length) {
1058 std::string data;
1059
1060 std::string encoded_headers =
1061 qpack_encoder_.EncodeHeaderList(stream_id, headers, nullptr);
1062
1063 // Generate HEADERS frame header.
1064 const std::string headers_frame_header =
1065 quic::HttpEncoder::SerializeHeadersFrameHeader(encoded_headers.size());
1066
1067 // Add the HEADERS frame header.
1068 data += headers_frame_header;
1069 // Add the HEADERS frame payload.
1070 data += encoded_headers;
1071
1072 // Compute the total data length.
1073 if (encoded_data_length) {
1074 *encoded_data_length = data.length();
1075 }
1076 return data;
1077 }
1078
InitializeHeader(uint64_t packet_number)1079 void QuicTestPacketMaker::InitializeHeader(uint64_t packet_number) {
1080 header_.destination_connection_id = DestinationConnectionId();
1081 header_.destination_connection_id_included = quic::CONNECTION_ID_PRESENT;
1082 header_.source_connection_id = SourceConnectionId();
1083 header_.source_connection_id_included = quic::CONNECTION_ID_PRESENT;
1084 header_.reset_flag = false;
1085 header_.version_flag = ShouldIncludeVersion();
1086 header_.form = header_.version_flag ? quic::IETF_QUIC_LONG_HEADER_PACKET
1087 : quic::IETF_QUIC_SHORT_HEADER_PACKET;
1088 header_.long_packet_type = long_header_type_;
1089 header_.packet_number_length = quic::PACKET_1BYTE_PACKET_NUMBER;
1090 header_.packet_number = quic::QuicPacketNumber(packet_number);
1091 if (header_.version_flag) {
1092 if (long_header_type_ == quic::INITIAL) {
1093 header_.retry_token_length_length =
1094 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_1;
1095 }
1096 header_.length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_2;
1097 }
1098 }
1099
AddQuicPaddingFrame()1100 void QuicTestPacketMaker::AddQuicPaddingFrame() {
1101 quic::QuicPaddingFrame padding_frame;
1102 frames_.push_back(quic::QuicFrame(padding_frame));
1103 DVLOG(1) << "Adding frame: " << frames_.back();
1104 }
1105
AddQuicPingFrame()1106 void QuicTestPacketMaker::AddQuicPingFrame() {
1107 quic::QuicPingFrame ping_frame;
1108 frames_.push_back(quic::QuicFrame(ping_frame));
1109 DVLOG(1) << "Adding frame: " << frames_.back();
1110 }
1111
AddQuicRetireConnectionIdFrame(uint64_t sequence_number)1112 void QuicTestPacketMaker::AddQuicRetireConnectionIdFrame(
1113 uint64_t sequence_number) {
1114 auto* retire_cid_frame = new quic::QuicRetireConnectionIdFrame();
1115 retire_cid_frame->sequence_number = sequence_number;
1116 frames_.push_back(quic::QuicFrame(retire_cid_frame));
1117 DVLOG(1) << "Adding frame: " << frames_.back();
1118 }
1119
AddQuicNewConnectionIdFrame(const quic::QuicConnectionId & cid,uint64_t sequence_number,uint64_t retire_prior_to,quic::StatelessResetToken reset_token)1120 void QuicTestPacketMaker::AddQuicNewConnectionIdFrame(
1121 const quic::QuicConnectionId& cid,
1122 uint64_t sequence_number,
1123 uint64_t retire_prior_to,
1124 quic::StatelessResetToken reset_token) {
1125 auto* new_cid_frame = new quic::QuicNewConnectionIdFrame();
1126 new_cid_frame->connection_id = cid;
1127 new_cid_frame->sequence_number = sequence_number;
1128 new_cid_frame->retire_prior_to = retire_prior_to;
1129 new_cid_frame->stateless_reset_token = reset_token;
1130 frames_.push_back(quic::QuicFrame(new_cid_frame));
1131 DVLOG(1) << "Adding frame: " << frames_.back();
1132 }
1133
AddQuicMaxStreamsFrame(quic::QuicControlFrameId control_frame_id,quic::QuicStreamCount stream_count,bool unidirectional)1134 void QuicTestPacketMaker::AddQuicMaxStreamsFrame(
1135 quic::QuicControlFrameId control_frame_id,
1136 quic::QuicStreamCount stream_count,
1137 bool unidirectional) {
1138 quic::QuicMaxStreamsFrame max_streams_frame(control_frame_id, stream_count,
1139 unidirectional);
1140 frames_.push_back(quic::QuicFrame(max_streams_frame));
1141 DVLOG(1) << "Adding frame: " << frames_.back();
1142 }
1143
AddQuicStreamsBlockedFrame(quic::QuicControlFrameId control_frame_id,quic::QuicStreamCount stream_count,bool unidirectional)1144 void QuicTestPacketMaker::AddQuicStreamsBlockedFrame(
1145 quic::QuicControlFrameId control_frame_id,
1146 quic::QuicStreamCount stream_count,
1147 bool unidirectional) {
1148 quic::QuicStreamsBlockedFrame streams_blocked_frame(
1149 control_frame_id, stream_count, unidirectional);
1150 frames_.push_back(quic::QuicFrame(streams_blocked_frame));
1151 DVLOG(1) << "Adding frame: " << frames_.back();
1152 }
1153
AddQuicMessageFrame(std::string_view data)1154 void QuicTestPacketMaker::AddQuicMessageFrame(std::string_view data) {
1155 auto* message_frame = new quic::QuicMessageFrame(
1156 /*message_id=*/0, quiche::QuicheMemSlice(quiche::QuicheBuffer::Copy(
1157 quiche::SimpleBufferAllocator::Get(), data)));
1158 frames_.push_back(quic::QuicFrame(message_frame));
1159 DVLOG(1) << "Adding frame: " << frames_.back();
1160 }
1161
AddQuicStreamFrame(quic::QuicStreamId stream_id,bool fin,std::string_view data)1162 void QuicTestPacketMaker::AddQuicStreamFrame(quic::QuicStreamId stream_id,
1163 bool fin,
1164 std::string_view data) {
1165 AddQuicStreamFrameWithOffset(stream_id, fin, stream_offsets_[stream_id],
1166 data);
1167 stream_offsets_[stream_id] += data.length();
1168 }
1169
AddQuicStreamFrameWithOffset(quic::QuicStreamId stream_id,bool fin,quic::QuicStreamOffset offset,std::string_view data)1170 void QuicTestPacketMaker::AddQuicStreamFrameWithOffset(
1171 quic::QuicStreamId stream_id,
1172 bool fin,
1173 quic::QuicStreamOffset offset,
1174 std::string_view data) {
1175 // Save the stream data so that callers can use temporary objects for data.
1176 saved_stream_data_.push_back(std::make_unique<std::string>(data));
1177 std::string_view saved_data = *saved_stream_data_.back();
1178
1179 quic::QuicStreamFrame stream_frame(stream_id, fin, offset, saved_data);
1180 frames_.push_back(quic::QuicFrame(stream_frame));
1181 DVLOG(1) << "Adding frame: " << frames_.back();
1182 }
1183
AddQuicAckFrame(uint64_t largest_received,uint64_t smallest_received)1184 void QuicTestPacketMaker::AddQuicAckFrame(uint64_t largest_received,
1185 uint64_t smallest_received) {
1186 AddQuicAckFrame(1, largest_received, smallest_received);
1187 }
1188
AddQuicAckFrame(uint64_t first_received,uint64_t largest_received,uint64_t smallest_received,std::optional<quic::QuicEcnCounts> ecn)1189 void QuicTestPacketMaker::AddQuicAckFrame(
1190 uint64_t first_received,
1191 uint64_t largest_received,
1192 uint64_t smallest_received,
1193 std::optional<quic::QuicEcnCounts> ecn) {
1194 auto* ack_frame = new quic::QuicAckFrame;
1195 ack_frame->largest_acked = quic::QuicPacketNumber(largest_received);
1196 ack_frame->ack_delay_time = quic::QuicTime::Delta::Zero();
1197 for (uint64_t i = smallest_received; i <= largest_received; ++i) {
1198 ack_frame->received_packet_times.emplace_back(quic::QuicPacketNumber(i),
1199 clock_->Now());
1200 }
1201 if (largest_received > 0) {
1202 DCHECK_GE(largest_received, first_received);
1203 ack_frame->packets.AddRange(quic::QuicPacketNumber(first_received),
1204 quic::QuicPacketNumber(largest_received + 1));
1205 }
1206 ack_frame->ecn_counters = ecn;
1207 frames_.push_back(quic::QuicFrame(ack_frame));
1208 DVLOG(1) << "Adding frame: " << frames_.back();
1209 }
1210
AddQuicRstStreamFrame(quic::QuicStreamId stream_id,quic::QuicRstStreamErrorCode error_code)1211 void QuicTestPacketMaker::AddQuicRstStreamFrame(
1212 quic::QuicStreamId stream_id,
1213 quic::QuicRstStreamErrorCode error_code) {
1214 auto* rst_stream_frame = new quic::QuicRstStreamFrame(
1215 1, stream_id, error_code, stream_offsets_[stream_id]);
1216 frames_.push_back(quic::QuicFrame(rst_stream_frame));
1217 DVLOG(1) << "Adding frame: " << frames_.back();
1218 }
1219
AddQuicConnectionCloseFrame(quic::QuicErrorCode quic_error,const std::string & quic_error_details)1220 void QuicTestPacketMaker::AddQuicConnectionCloseFrame(
1221 quic::QuicErrorCode quic_error,
1222 const std::string& quic_error_details) {
1223 AddQuicConnectionCloseFrame(quic_error, quic_error_details, 0);
1224 }
1225
AddQuicConnectionCloseFrame(quic::QuicErrorCode quic_error,const std::string & quic_error_details,uint64_t frame_type)1226 void QuicTestPacketMaker::AddQuicConnectionCloseFrame(
1227 quic::QuicErrorCode quic_error,
1228 const std::string& quic_error_details,
1229 uint64_t frame_type) {
1230 auto* close_frame = new quic::QuicConnectionCloseFrame(
1231 version_.transport_version, quic_error, quic::NO_IETF_QUIC_ERROR,
1232 quic_error_details, frame_type);
1233 frames_.push_back(quic::QuicFrame(close_frame));
1234 DVLOG(1) << "Adding frame: " << frames_.back();
1235 }
1236
AddQuicGoAwayFrame(quic::QuicErrorCode error_code,std::string reason_phrase)1237 void QuicTestPacketMaker::AddQuicGoAwayFrame(quic::QuicErrorCode error_code,
1238 std::string reason_phrase) {
1239 auto* goaway_frame = new quic::QuicGoAwayFrame();
1240 goaway_frame->error_code = error_code;
1241 goaway_frame->last_good_stream_id = 0;
1242 goaway_frame->reason_phrase = reason_phrase;
1243 frames_.push_back(quic::QuicFrame(goaway_frame));
1244 DVLOG(1) << "Adding frame: " << frames_.back();
1245 }
1246
AddQuicPathResponseFrame()1247 void QuicTestPacketMaker::AddQuicPathResponseFrame() {
1248 quic::test::MockRandom rand(0);
1249 quic::QuicPathFrameBuffer payload;
1250 rand.RandBytes(payload.data(), payload.size());
1251 auto path_response_frame = quic::QuicPathResponseFrame(0, payload);
1252 frames_.push_back(quic::QuicFrame(path_response_frame));
1253 DVLOG(1) << "Adding frame: " << frames_.back();
1254 }
1255
AddQuicPathChallengeFrame()1256 void QuicTestPacketMaker::AddQuicPathChallengeFrame() {
1257 quic::test::MockRandom rand(0);
1258 quic::QuicPathFrameBuffer payload;
1259 rand.RandBytes(payload.data(), payload.size());
1260 auto path_challenge_frame = quic::QuicPathChallengeFrame(0, payload);
1261 frames_.push_back(quic::QuicFrame(path_challenge_frame));
1262 DVLOG(1) << "Adding frame: " << frames_.back();
1263 }
1264
AddQuicStopSendingFrame(quic::QuicStreamId stream_id,quic::QuicRstStreamErrorCode error_code)1265 void QuicTestPacketMaker::AddQuicStopSendingFrame(
1266 quic::QuicStreamId stream_id,
1267 quic::QuicRstStreamErrorCode error_code) {
1268 auto stop_sending_frame =
1269 quic::QuicStopSendingFrame(1, stream_id, error_code);
1270 frames_.push_back(quic::QuicFrame(stop_sending_frame));
1271 DVLOG(1) << "Adding frame: " << frames_.back();
1272 }
1273
AddQuicCryptoFrame(quic::EncryptionLevel level,quic::QuicStreamOffset offset,quic::QuicPacketLength data_length)1274 void QuicTestPacketMaker::AddQuicCryptoFrame(
1275 quic::EncryptionLevel level,
1276 quic::QuicStreamOffset offset,
1277 quic::QuicPacketLength data_length) {
1278 auto* crypto_frame = new quic::QuicCryptoFrame(level, offset, data_length);
1279 frames_.push_back(quic::QuicFrame(crypto_frame));
1280 DVLOG(1) << "Adding frame: " << frames_.back();
1281 }
1282
BuildPacket()1283 std::unique_ptr<quic::QuicReceivedPacket> QuicTestPacketMaker::BuildPacket() {
1284 auto packet = BuildPacketImpl(frames_, data_producer_.get());
1285
1286 DeleteFrames(&frames_);
1287 data_producer_.reset();
1288
1289 return packet;
1290 }
1291
BuildPacketImpl(const quic::QuicFrames & frames,quic::QuicStreamFrameDataProducer * data_producer)1292 std::unique_ptr<quic::QuicReceivedPacket> QuicTestPacketMaker::BuildPacketImpl(
1293 const quic::QuicFrames& frames,
1294 quic::QuicStreamFrameDataProducer* data_producer) {
1295 quic::QuicFramer framer(quic::test::SupportedVersions(version_),
1296 clock_->Now(), perspective_,
1297 quic::kQuicDefaultConnectionIdLength);
1298 if (encryption_level_ == quic::ENCRYPTION_INITIAL) {
1299 framer.SetInitialObfuscators(perspective_ == quic::Perspective::IS_CLIENT
1300 ? header_.destination_connection_id
1301 : header_.source_connection_id);
1302 } else {
1303 framer.SetEncrypter(
1304 encryption_level_,
1305 std::make_unique<quic::test::TaggingEncrypter>( // IN-TEST
1306 encryption_level_));
1307 }
1308 if (data_producer != nullptr) {
1309 framer.set_data_producer(data_producer);
1310 }
1311 quic::QuicFrames frames_copy = CloneFrames(frames);
1312 size_t max_plaintext_size =
1313 framer.GetMaxPlaintextSize(quic::kDefaultMaxPacketSize);
1314 size_t packet_size =
1315 quic::GetPacketHeaderSize(version_.transport_version, header_);
1316 size_t frames_size = 0;
1317 for (size_t i = 0; i < frames.size(); ++i) {
1318 bool first_frame = i == 0;
1319 bool last_frame = i == frames.size() - 1;
1320 const size_t frame_size = framer.GetSerializedFrameLength(
1321 frames[i], max_plaintext_size - packet_size, first_frame, last_frame,
1322 header_.packet_number_length);
1323 packet_size += frame_size;
1324 frames_size += frame_size;
1325 }
1326
1327 const size_t min_plaintext_packet_size =
1328 quic::QuicPacketCreator::MinPlaintextPacketSize(
1329 version_, header_.packet_number_length);
1330 if (frames_size < min_plaintext_packet_size) {
1331 frames_copy.insert(frames_copy.begin(),
1332 quic::QuicFrame(quic::QuicPaddingFrame(
1333 min_plaintext_packet_size - frames_size)));
1334 }
1335
1336 std::unique_ptr<quic::QuicPacket> packet(quic::test::BuildUnsizedDataPacket(
1337 &framer, header_, frames_copy, max_plaintext_size));
1338 char buffer[quic::kMaxOutgoingPacketSize];
1339 size_t encrypted_size =
1340 framer.EncryptPayload(encryption_level_, header_.packet_number, *packet,
1341 buffer, quic::kMaxOutgoingPacketSize);
1342 EXPECT_NE(0u, encrypted_size);
1343 quic::QuicReceivedPacket encrypted(buffer, encrypted_size, clock_->Now(),
1344 false, 0, true, nullptr, 0, false,
1345 ecn_codepoint_);
1346 if (save_packet_frames_) {
1347 saved_frames_[header_.packet_number] = frames_copy;
1348 } else {
1349 saved_stream_data_.clear();
1350 DeleteFrames(&frames_copy);
1351 }
1352
1353 return encrypted.Clone();
1354 }
1355
ShouldIncludeVersion() const1356 bool QuicTestPacketMaker::ShouldIncludeVersion() const {
1357 return encryption_level_ < quic::ENCRYPTION_FORWARD_SECURE;
1358 }
1359
DestinationConnectionId() const1360 quic::QuicConnectionId QuicTestPacketMaker::DestinationConnectionId() const {
1361 if (perspective_ == quic::Perspective::IS_SERVER) {
1362 return quic::EmptyQuicConnectionId();
1363 }
1364 return connection_id_;
1365 }
1366
SourceConnectionId() const1367 quic::QuicConnectionId QuicTestPacketMaker::SourceConnectionId() const {
1368 if (perspective_ == quic::Perspective::IS_CLIENT) {
1369 return quic::EmptyQuicConnectionId();
1370 }
1371 return connection_id_;
1372 }
1373
GetFirstBidirectionalStreamId() const1374 quic::QuicStreamId QuicTestPacketMaker::GetFirstBidirectionalStreamId() const {
1375 return quic::QuicUtils::GetFirstBidirectionalStreamId(
1376 version_.transport_version, perspective_);
1377 }
1378
GenerateHttp3SettingsData()1379 std::string QuicTestPacketMaker::GenerateHttp3SettingsData() {
1380 quic::SettingsFrame settings;
1381 settings.values[quic::SETTINGS_MAX_FIELD_SECTION_SIZE] =
1382 kQuicMaxHeaderListSize;
1383 settings.values[quic::SETTINGS_QPACK_MAX_TABLE_CAPACITY] =
1384 quic::kDefaultQpackMaxDynamicTableCapacity;
1385 settings.values[quic::SETTINGS_QPACK_BLOCKED_STREAMS] =
1386 quic::kDefaultMaximumBlockedStreams;
1387 settings.values[quic::SETTINGS_H3_DATAGRAM] = 1;
1388 // Greased setting.
1389 settings.values[0x40] = 20;
1390 return quic::HttpEncoder::SerializeSettingsFrame(settings);
1391 }
1392
GenerateHttp3PriorityData(spdy::SpdyPriority spdy_priority,quic::QuicStreamId stream_id)1393 std::string QuicTestPacketMaker::GenerateHttp3PriorityData(
1394 spdy::SpdyPriority spdy_priority,
1395 quic::QuicStreamId stream_id) {
1396 std::string priority_data;
1397 quic::PriorityUpdateFrame priority_update;
1398 quic::HttpStreamPriority priority{
1399 spdy_priority, quic::HttpStreamPriority::kDefaultIncremental};
1400 if (client_priority_uses_incremental_) {
1401 priority.incremental = kDefaultPriorityIncremental;
1402 }
1403
1404 if (priority.urgency != quic::HttpStreamPriority::kDefaultUrgency ||
1405 priority.incremental != quic::HttpStreamPriority::kDefaultIncremental) {
1406 priority_update.priority_field_value =
1407 quic::SerializePriorityFieldValue(priority);
1408 }
1409
1410 // Only generate a frame if a non-empty string was generated.
1411 if (!priority_update.priority_field_value.empty()) {
1412 priority_update.prioritized_element_id = stream_id;
1413 priority_data =
1414 quic::HttpEncoder::SerializePriorityUpdateFrame(priority_update);
1415 }
1416
1417 return priority_data;
1418 }
1419
AddPriorityHeader(spdy::SpdyPriority spdy_priority,spdy::Http2HeaderBlock * headers)1420 void QuicTestPacketMaker::AddPriorityHeader(spdy::SpdyPriority spdy_priority,
1421 spdy::Http2HeaderBlock* headers) {
1422 if (use_priority_header_ &&
1423 base::FeatureList::IsEnabled(net::features::kPriorityHeader)) {
1424 quic::HttpStreamPriority priority{
1425 spdy_priority, quic::HttpStreamPriority::kDefaultIncremental};
1426 if (client_priority_uses_incremental_) {
1427 priority.incremental = kDefaultPriorityIncremental;
1428 }
1429 std::string serialized_priority =
1430 quic::SerializePriorityFieldValue(priority);
1431 if (!serialized_priority.empty()) {
1432 (*headers)[net::kHttp2PriorityHeader] = serialized_priority;
1433 }
1434 }
1435 }
1436
GenerateHttp3GreaseData()1437 std::string QuicTestPacketMaker::GenerateHttp3GreaseData() {
1438 return quic::HttpEncoder::SerializeGreasingFrame();
1439 }
1440
MaybeAddHttp3SettingsFrames()1441 void QuicTestPacketMaker::MaybeAddHttp3SettingsFrames() {
1442 quic::QuicStreamId stream_id =
1443 quic::QuicUtils::GetFirstUnidirectionalStreamId(
1444 version_.transport_version, perspective_);
1445
1446 if (stream_offsets_[stream_id] != 0)
1447 return;
1448
1449 // A stream frame containing stream type will be written on the control
1450 // stream first.
1451 std::string type(1, 0x00);
1452 std::string settings_data = GenerateHttp3SettingsData();
1453 std::string grease_data = GenerateHttp3GreaseData();
1454
1455 // The type and the SETTINGS frame may be sent in multiple QUIC STREAM
1456 // frames.
1457 std::string data = type + settings_data + grease_data;
1458
1459 AddQuicStreamFrame(stream_id, false, data);
1460 }
1461
MaybeCoalesceStreamFrame(const quic::QuicFrame & frame)1462 bool QuicTestPacketMaker::MaybeCoalesceStreamFrame(
1463 const quic::QuicFrame& frame) {
1464 if (frames_.empty()) {
1465 return false;
1466 }
1467 if (frame.type != quic::STREAM_FRAME ||
1468 frames_.back().type != quic::STREAM_FRAME) {
1469 return false;
1470 }
1471
1472 // Make sure they are congruent data segments in the stream.
1473 const quic::QuicStreamFrame* new_frame = &frame.stream_frame;
1474 quic::QuicStreamFrame* previous_frame = &frames_.back().stream_frame;
1475 if (new_frame->stream_id != previous_frame->stream_id ||
1476 new_frame->offset !=
1477 previous_frame->offset + previous_frame->data_length) {
1478 return false;
1479 }
1480
1481 // Extend the data buffer to include the data from both frames (into a copy
1482 // buffer). This doesn't attempt to limit coalescing to a particular packet
1483 // size limit and may need to be updated if a test comes along that
1484 // retransmits enough stream data to span multiple packets.
1485 std::string data(previous_frame->data_buffer, previous_frame->data_length);
1486 data += std::string(new_frame->data_buffer, new_frame->data_length);
1487 saved_stream_data_.push_back(std::make_unique<std::string>(data));
1488 std::string_view saved_data = *saved_stream_data_.back();
1489 previous_frame->data_buffer = saved_data.data();
1490 previous_frame->data_length = saved_data.length();
1491
1492 // Copy the fin state from the last frame.
1493 previous_frame->fin = new_frame->fin;
1494
1495 return true;
1496 }
1497
1498 } // namespace net::test
1499