Remapping Quic HTTP data stream into HTTP/3 format.
Previously data that passes through QuicSpdyStream is simply the raw body. In HTTP/3, data are contained in data frames. This CL implements data frames.
When the stream wants to write data, HttpEncoder will be used to produce a frame header that will be sent before the body.
On the other side when the stream receives new data from the sequencer, HttpDecoder will be used to strip the header and then the stream will store the actual body that will be available for applications to use.
Merge internal change: 226378053
Update QuicSpdyStream's constructor from PendingStream consistent with the original constructor. Version 99 only. Not protected.
Merge internal change: 226924343
Change-Id: Ieb516c83f5f8fa673928c5ad8be304f90ab24d63
Reviewed-on: https://chromium-review.googlesource.com/c/1399423
Reviewed-by: Ryan Hamilton <[email protected]>
Commit-Queue: Renjie Tang <[email protected]>
Cr-Commit-Position: refs/heads/master@{#622216}
diff --git a/net/quic/quic_network_transaction_unittest.cc b/net/quic/quic_network_transaction_unittest.cc
index 1887136f..f533f74 100644
--- a/net/quic/quic_network_transaction_unittest.cc
+++ b/net/quic/quic_network_transaction_unittest.cc
@@ -640,6 +640,16 @@
std::move(headers), offset);
}
+ quic::QuicString ConstructDataHeader(size_t body_len) {
+ if (version_ != quic::QUIC_VERSION_99) {
+ return "";
+ }
+ quic::HttpEncoder encoder;
+ std::unique_ptr<char[]> buffer;
+ auto header_length = encoder.SerializeDataFrameHeader(body_len, &buffer);
+ return quic::QuicString(buffer.get(), header_length);
+ }
+
void CreateSession(
const quic::QuicTransportVersionVector& supported_versions) {
session_params_.enable_quic = true;
@@ -1045,10 +1055,11 @@
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
GetResponseHeaders("200 OK")));
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1));
mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
@@ -1081,10 +1092,11 @@
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
GetResponseHeaders("200 OK")));
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1));
mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
@@ -1117,10 +1129,11 @@
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
GetResponseHeaders("200 OK")));
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1));
mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
@@ -1210,10 +1223,11 @@
offset, base::StringPiece(spdy_frame.data() + offset, len)));
}
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
packet_number, GetNthClientInitiatedBidirectionalStreamId(0),
- false, true, 0, "hello!"));
+ false, true, 0, header + "hello!"));
mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
mock_quic_data.AddWrite(ASYNC, ConstructClientAckPacket(3, 2, 1, 1));
mock_quic_data.AddWrite(ASYNC,
@@ -1268,10 +1282,12 @@
offset, base::StringPiece(spdy_frame.data() + offset, len)));
}
+ quic::QuicString header = ConstructDataHeader(6);
+
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
packet_number, GetNthClientInitiatedBidirectionalStreamId(0),
- false, true, 0, "hello!"));
+ false, true, 0, header + "hello!"));
mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
mock_quic_data.AddWrite(ASYNC, ConstructClientAckPacket(3, 2, 1, 1));
mock_quic_data.AddWrite(
@@ -1308,10 +1324,11 @@
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
GetResponseHeaders("200 OK")));
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1));
mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
@@ -1342,10 +1359,11 @@
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
GetResponseHeaders("200 OK")));
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1));
mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mock_quic_data.AddRead(ASYNC, 0); // EOF
@@ -1390,10 +1408,11 @@
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
GetResponseHeaders("200 OK")));
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1));
mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mock_quic_data.AddRead(ASYNC, 0);
@@ -1450,10 +1469,11 @@
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
GetResponseHeaders("200 OK")));
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1));
mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mock_quic_data.AddRead(ASYNC, 0);
@@ -1539,10 +1559,11 @@
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
GetResponseHeaders("200 OK")));
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1));
mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mock_quic_data.AddRead(ASYNC, 0); // EOF
@@ -1732,10 +1753,11 @@
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
GetResponseHeaders("200 OK")));
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1));
mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mock_quic_data.AddRead(ASYNC, 0); // EOF
@@ -1800,10 +1822,11 @@
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
GetResponseHeaders("200 OK")));
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1));
mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mock_quic_data.AddRead(ASYNC, 0); // EOF
@@ -1862,10 +1885,11 @@
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
GetResponseHeaders("200 OK")));
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1));
mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mock_quic_data.AddRead(ASYNC, 0); // EOF
@@ -1906,10 +1930,11 @@
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
GetResponseHeaders("200 OK")));
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1));
mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mock_quic_data.AddRead(ASYNC, 0); // EOF
@@ -2030,10 +2055,11 @@
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
GetResponseHeaders("200 OK")));
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1));
mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mock_quic_data.AddRead(ASYNC, 0); // EOF
@@ -2090,10 +2116,11 @@
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
GetResponseHeaders("200 OK")));
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1));
mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mock_quic_data.AddRead(ASYNC, 0); // EOF
@@ -2132,10 +2159,11 @@
2, quic::QUIC_ERROR_MIGRATING_PORT,
"connection migration with port change only"));
mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1));
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
SYNCHRONOUS, ConstructServerDataPacket(
3, GetNthClientInitiatedBidirectionalStreamId(0), false,
- true, 0, "hello!"));
+ true, 0, header + "hello!"));
mock_quic_data.AddWrite(SYNCHRONOUS,
ConstructClientAckAndRstPacket(
4, GetNthClientInitiatedBidirectionalStreamId(0),
@@ -2497,6 +2525,9 @@
quic_data2.AddWrite(SYNCHRONOUS,
client_maker_.MakeDummyCHLOPacket(1)); // CHLO
+ const quic::QuicString body = "hello!";
+ quic::QuicString header = ConstructDataHeader(body.length());
+
client_maker_.SetEncryptionLevel(quic::ENCRYPTION_FORWARD_SECURE);
quic_data2.AddWrite(SYNCHRONOUS,
ConstructInitialSettingsPacket(2, &header_stream_offset));
@@ -2512,7 +2543,7 @@
quic_data2.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + body));
quic_data2.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(4, 2, 1, 1));
quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
quic_data2.AddSocketDataToFactory(&socket_factory_);
@@ -2569,7 +2600,7 @@
// Read the response.
EXPECT_THAT(callback.WaitForResult(), IsOk());
- CheckResponseData(&trans, "hello!");
+ CheckResponseData(&trans, body);
// Verify that QUIC is not marked as broken.
ExpectQuicAlternateProtocolMapping();
@@ -3992,10 +4023,11 @@
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
GetResponseHeaders("200 OK"), &response_header_offset));
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1));
mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mock_quic_data.AddRead(ASYNC, 0); // EOF
@@ -4067,10 +4099,11 @@
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
GetResponseHeaders("200 OK"), &response_header_offset));
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1));
// Second request will go over the pooled QUIC connection, but will be
@@ -4217,10 +4250,11 @@
ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset));
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1));
// Second QUIC request data.
@@ -4239,7 +4273,7 @@
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
4, GetNthClientInitiatedBidirectionalStreamId(1), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(
SYNCHRONOUS, ConstructClientAckAndConnectionClosePacket(5, 4, 3, 1));
mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
@@ -4286,10 +4320,11 @@
ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset));
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1));
// Second QUIC request data.
@@ -4308,7 +4343,7 @@
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
4, GetNthClientInitiatedBidirectionalStreamId(1), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(
SYNCHRONOUS, ConstructClientAckAndConnectionClosePacket(5, 4, 3, 1));
mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
@@ -4368,10 +4403,11 @@
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
GetResponseHeaders("200 OK"), &response_header_offset));
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1));
// Second request.
@@ -4388,7 +4424,7 @@
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
4, GetNthClientInitiatedBidirectionalStreamId(1), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(
SYNCHRONOUS, ConstructClientAckAndConnectionClosePacket(5, 4, 3, 1));
mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
@@ -4453,10 +4489,11 @@
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
GetResponseHeaders("200 OK"), &response_header_offset));
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1));
// Second request.
@@ -4481,7 +4518,7 @@
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
4, GetNthClientInitiatedBidirectionalStreamId(1), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(
SYNCHRONOUS, ConstructClientAckAndConnectionClosePacket(5, 4, 3, 1));
mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
@@ -4593,10 +4630,11 @@
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
GetResponseHeaders("200 OK"), &response_header_offset));
+ quic::QuicString header = ConstructDataHeader(21);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello from mail QUIC!"));
+ 0, header + "hello from mail QUIC!"));
mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1));
// Second QUIC request data.
mock_quic_data.AddWrite(
@@ -4613,7 +4651,7 @@
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
4, GetNthClientInitiatedBidirectionalStreamId(1), false, true,
- 0, "hello from mail QUIC!"));
+ 0, header + "hello from mail QUIC!"));
mock_quic_data.AddWrite(
SYNCHRONOUS, ConstructClientAckAndConnectionClosePacket(5, 4, 3, 1));
mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
@@ -4699,10 +4737,11 @@
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
GetResponseHeaders("200 OK")));
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1));
mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mock_quic_data.AddRead(ASYNC, 0); // EOF
@@ -4755,10 +4794,11 @@
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
GetResponseHeaders("200 OK")));
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1));
mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF
@@ -4791,10 +4831,11 @@
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
GetResponseHeaders("200 OK")));
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1));
mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mock_quic_data.AddRead(ASYNC, 0); // EOF
@@ -4893,10 +4934,11 @@
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
GetResponseHeaders("200 OK")));
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(2, 2, 1, 1));
mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mock_quic_data.AddRead(ASYNC, 0); // EOF
@@ -4928,10 +4970,11 @@
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
GetResponseHeaders("200 OK")));
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(2, 2, 1, 1));
mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mock_quic_data.AddRead(ASYNC, 0); // EOF
@@ -5009,10 +5052,11 @@
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
GetResponseHeaders("200 OK")));
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1));
mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
mock_quic_data.AddSocketDataToFactory(&socket_factory_);
@@ -5100,10 +5144,11 @@
ASYNC, ConstructServerResponseHeadersPacket(
2, GetNthClientInitiatedBidirectionalStreamId(1), false, false,
GetResponseHeaders("200 OK"), &server_header_stream_offset));
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
3, GetNthClientInitiatedBidirectionalStreamId(1), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(
SYNCHRONOUS, ConstructClientAckAndConnectionClosePacket(5, 3, 1, 1));
mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
@@ -5606,10 +5651,11 @@
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
GetResponseHeaders("200 OK")));
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(2, 2, 1, 1));
mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mock_quic_data.AddRead(ASYNC, 0); // EOF
@@ -5665,10 +5711,11 @@
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
GetResponseHeaders("200 OK")));
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1));
mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
mock_quic_data.AddSocketDataToFactory(&socket_factory_);
@@ -5963,10 +6010,11 @@
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
GetResponseHeaders("200 OK")));
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1));
mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data.
mock_quic_data.AddSocketDataToFactory(&socket_factory_);
@@ -6126,10 +6174,11 @@
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
GetResponseHeaders("200 OK")));
+ quic::QuicString header = ConstructDataHeader(6);
socket_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
socket_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1));
socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
socket_data.AddWrite(
@@ -6161,10 +6210,11 @@
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
GetResponseHeaders("200 OK")));
+ quic::QuicString header = ConstructDataHeader(6);
socket_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
socket_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1));
socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
socket_data.AddWrite(
@@ -6331,16 +6381,18 @@
ASYNC, ConstructServerResponseHeadersPacket(
3, GetNthServerInitiatedUnidirectionalStreamId(0), false,
false, GetResponseHeaders("200 OK"), &server_header_offset));
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
4, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(
SYNCHRONOUS, ConstructClientAckPacket(client_packet_number++, 4, 3, 1));
+ quic::QuicString header2 = ConstructDataHeader(10);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
5, GetNthServerInitiatedUnidirectionalStreamId(0), false, true,
- 0, "and hello!"));
+ 0, header2 + "and hello!"));
mock_quic_data.AddWrite(SYNCHRONOUS,
ConstructClientAckAndRstPacket(
client_packet_number++,
@@ -6422,10 +6474,11 @@
mock_quic_data.AddWrite(
SYNCHRONOUS, ConstructClientAckPacket(client_packet_number++, 2, 1, 1));
// Response body for first request.
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
3, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
// Write error for the third request.
mock_quic_data.AddWrite(SYNCHRONOUS, ERR_FAILED);
mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
@@ -6475,27 +6528,42 @@
MockQuicData mock_quic_data;
quic::QuicStreamOffset offset = 0;
- mock_quic_data.AddWrite(SYNCHRONOUS,
- ConstructInitialSettingsPacket(1, &offset));
+ int write_packet_index = 1;
+ mock_quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket(
+ write_packet_index++, &offset));
- mock_quic_data.AddWrite(
- SYNCHRONOUS,
- ConstructClientRequestHeadersAndDataFramesPacket(
- 2, GetNthClientInitiatedBidirectionalStreamId(0), true, true,
- DEFAULT_PRIORITY, GetRequestHeaders("POST", "https", "/"), 0, &offset,
- nullptr, {"1"}));
+ quic::QuicString header = ConstructDataHeader(1);
+ if (version_ != quic::QUIC_VERSION_99) {
+ mock_quic_data.AddWrite(
+ SYNCHRONOUS,
+ ConstructClientRequestHeadersAndDataFramesPacket(
+ write_packet_index++, GetNthClientInitiatedBidirectionalStreamId(0),
+ true, true, DEFAULT_PRIORITY,
+ GetRequestHeaders("POST", "https", "/"), 0, &offset, nullptr,
+ {"1"}));
+ } else {
+ mock_quic_data.AddWrite(
+ SYNCHRONOUS,
+ ConstructClientRequestHeadersAndDataFramesPacket(
+ write_packet_index++, GetNthClientInitiatedBidirectionalStreamId(0),
+ true, true, DEFAULT_PRIORITY,
+ GetRequestHeaders("POST", "https", "/"), 0, &offset, nullptr,
+ {header, "1"}));
+ }
mock_quic_data.AddRead(
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
GetResponseHeaders("200 OK")));
+ quic::QuicString header2 = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header2 + "hello!"));
- mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1));
+ mock_quic_data.AddWrite(
+ SYNCHRONOUS, ConstructClientAckPacket(write_packet_index++, 2, 1, 1));
mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mock_quic_data.AddRead(ASYNC, 0); // EOF
@@ -6572,6 +6640,7 @@
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
GetResponseHeaders("200 OK"), &expected_raw_header_response_size));
+ quic::QuicString header = ConstructDataHeader(18);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
@@ -6670,17 +6739,19 @@
ASYNC, ConstructServerResponseHeadersPacket(
3, GetNthServerInitiatedUnidirectionalStreamId(0), false,
false, GetResponseHeaders("200 OK"), &server_header_offset));
+ quic::QuicString header = ConstructDataHeader(20);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
4, GetNthServerInitiatedUnidirectionalStreamId(0), false, true,
- 0, "Pushed Resource Data"));
+ 0, header + "Pushed Resource Data"));
mock_quic_data.AddWrite(
SYNCHRONOUS, ConstructClientAckPacket(client_packet_number++, 4, 3, 1));
+ quic::QuicString header2 = ConstructDataHeader(18);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
5, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "Main Resource Data"));
+ 0, header2 + "Main Resource Data"));
mock_quic_data.AddRead(ASYNC, ConstructServerConnectionClosePacket(6));
@@ -6747,10 +6818,11 @@
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
GetResponseHeaders("200 OK")));
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(3, 2, 1, 1));
mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mock_quic_data.AddRead(ASYNC, 0); // EOF
@@ -6933,8 +7005,15 @@
quic::QuicPacketNumber packet_number,
quic::QuicStreamId stream_id,
QuicTestPacketMaker* maker) {
+ quic::QuicString header = "";
+ if (version_ == quic::QUIC_VERSION_99) {
+ quic::HttpEncoder encoder;
+ std::unique_ptr<char[]> buffer;
+ auto header_length = encoder.SerializeDataFrameHeader(5, &buffer);
+ header = quic::QuicString(buffer.get(), header_length);
+ }
return maker->MakeDataPacket(packet_number, stream_id, false, true, 0,
- "hello");
+ header + "hello");
}
std::unique_ptr<quic::QuicEncryptedPacket> ConstructClientAckPacket(
@@ -7329,16 +7408,19 @@
ASYNC, ConstructServerResponseHeadersPacket(
3, GetNthServerInitiatedUnidirectionalStreamId(0), false,
false, GetResponseHeaders("200 OK"), &server_header_offset));
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
4, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(
SYNCHRONOUS, ConstructClientAckPacket(client_packet_number++, 4, 3, 1));
+
+ quic::QuicString header2 = ConstructDataHeader(10);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
5, GetNthServerInitiatedUnidirectionalStreamId(0), false, true,
- 0, "and hello!"));
+ 0, header2 + "and hello!"));
// Because the matching request has a body, we will see the push
// stream get cancelled, and the matching request go out on the
@@ -7349,14 +7431,26 @@
GetNthServerInitiatedUnidirectionalStreamId(0),
quic::QUIC_STREAM_CANCELLED, 5, 5, 1));
const char kBody[] = "1";
- mock_quic_data.AddWrite(
- SYNCHRONOUS,
- ConstructClientRequestHeadersAndDataFramesPacket(
- client_packet_number++, GetNthClientInitiatedBidirectionalStreamId(1),
- false, true, DEFAULT_PRIORITY,
- GetRequestHeaders("GET", "https", "/pushed.jpg"),
- GetNthServerInitiatedUnidirectionalStreamId(0), &header_stream_offset,
- nullptr, {kBody}));
+ quic::QuicString header3 = ConstructDataHeader(1);
+ if (version_ != quic::QUIC_VERSION_99) {
+ mock_quic_data.AddWrite(
+ SYNCHRONOUS,
+ ConstructClientRequestHeadersAndDataFramesPacket(
+ client_packet_number++,
+ GetNthClientInitiatedBidirectionalStreamId(1), false, true,
+ DEFAULT_PRIORITY, GetRequestHeaders("GET", "https", "/pushed.jpg"),
+ GetNthServerInitiatedUnidirectionalStreamId(0),
+ &header_stream_offset, nullptr, {kBody}));
+ } else {
+ mock_quic_data.AddWrite(
+ SYNCHRONOUS,
+ ConstructClientRequestHeadersAndDataFramesPacket(
+ client_packet_number++,
+ GetNthClientInitiatedBidirectionalStreamId(1), false, true,
+ DEFAULT_PRIORITY, GetRequestHeaders("GET", "https", "/pushed.jpg"),
+ GetNthServerInitiatedUnidirectionalStreamId(0),
+ &header_stream_offset, nullptr, {header3, kBody}));
+ }
// We see the same response as for the earlier pushed and cancelled
// stream.
@@ -7367,7 +7461,7 @@
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
7, GetNthClientInitiatedBidirectionalStreamId(1), false, true,
- 0, "and hello!"));
+ 0, header2 + "and hello!"));
mock_quic_data.AddWrite(
SYNCHRONOUS, ConstructClientAckPacket(client_packet_number++, 7, 6, 1));
@@ -7437,10 +7531,11 @@
ASYNC, ConstructServerResponseHeadersPacket(
3, GetNthServerInitiatedUnidirectionalStreamId(0), false,
false, GetResponseHeaders("200 OK"), &server_header_offset));
+ quic::QuicString header = ConstructDataHeader(6);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
4, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
- 0, "hello!"));
+ 0, header + "hello!"));
mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(5, 4, 3, 1));
mock_quic_data.AddRead(ASYNC, 0);
@@ -7468,13 +7563,16 @@
MockQuicData mock_quic_data;
quic::QuicStreamOffset header_stream_offset = 0;
+ int write_packet_index = 1;
mock_quic_data.AddWrite(
- SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
+ SYNCHRONOUS, ConstructInitialSettingsPacket(write_packet_index++,
+ &header_stream_offset));
mock_quic_data.AddWrite(
- SYNCHRONOUS, ConstructClientRequestHeadersPacket(
- 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
- false, ConnectRequestHeaders("mail.example.org:443"),
- &header_stream_offset));
+ SYNCHRONOUS,
+ ConstructClientRequestHeadersPacket(
+ write_packet_index++, GetNthClientInitiatedBidirectionalStreamId(0),
+ true, false, ConnectRequestHeaders("mail.example.org:443"),
+ &header_stream_offset));
mock_quic_data.AddRead(
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
@@ -7484,30 +7582,49 @@
"GET / HTTP/1.1\r\n"
"Host: mail.example.org\r\n"
"Connection: keep-alive\r\n\r\n";
- mock_quic_data.AddWrite(
- SYNCHRONOUS, ConstructClientAckAndDataPacket(
- 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
- 1, 1, 1, false, 0, quic::QuicStringPiece(get_request)));
+ quic::QuicString header = ConstructDataHeader(strlen(get_request));
+ if (version_ != quic::QUIC_VERSION_99) {
+ mock_quic_data.AddWrite(
+ SYNCHRONOUS, ConstructClientAckAndDataPacket(
+ write_packet_index++, false,
+ GetNthClientInitiatedBidirectionalStreamId(0), 1, 1, 1,
+ false, 0, quic::QuicStringPiece(get_request)));
+ } else {
+ mock_quic_data.AddWrite(
+ SYNCHRONOUS, ConstructClientAckAndDataPacket(
+ write_packet_index++, false,
+ GetNthClientInitiatedBidirectionalStreamId(0), 1, 1, 1,
+ false, 0, header));
+ mock_quic_data.AddWrite(
+ SYNCHRONOUS,
+ ConstructClientDataPacket(
+ write_packet_index++, GetNthClientInitiatedBidirectionalStreamId(0),
+ false, false, header.length(), quic::QuicStringPiece(get_request)));
+ }
+
const char get_response[] =
"HTTP/1.1 200 OK\r\n"
"Content-Length: 10\r\n\r\n";
+ quic::QuicString header2 = ConstructDataHeader(strlen(get_response));
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
- 0, quic::QuicStringPiece(get_response)));
-
+ 0, header2 + quic::QuicString(get_response)));
+ quic::QuicString header3 = ConstructDataHeader(10);
mock_quic_data.AddRead(
- SYNCHRONOUS,
- ConstructServerDataPacket(
- 3, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
- strlen(get_response), quic::QuicStringPiece("0123456789")));
- mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(4, 3, 2, 1));
+ SYNCHRONOUS, ConstructServerDataPacket(
+ 3, GetNthClientInitiatedBidirectionalStreamId(0), false,
+ false, strlen(get_response) + header2.length(),
+ header3 + quic::QuicString("0123456789")));
+ mock_quic_data.AddWrite(
+ SYNCHRONOUS, ConstructClientAckPacket(write_packet_index++, 3, 2, 1));
mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
mock_quic_data.AddWrite(
- SYNCHRONOUS, ConstructClientRstPacket(
- 5, GetNthClientInitiatedBidirectionalStreamId(0),
- quic::QUIC_STREAM_CANCELLED, strlen(get_request)));
+ SYNCHRONOUS,
+ ConstructClientRstPacket(
+ write_packet_index++, GetNthClientInitiatedBidirectionalStreamId(0),
+ quic::QUIC_STREAM_CANCELLED, strlen(get_request) + header.length()));
mock_quic_data.AddSocketDataToFactory(&socket_factory_);
@@ -7547,13 +7664,16 @@
MockQuicData mock_quic_data;
quic::QuicStreamOffset header_stream_offset = 0;
+ int write_packet_index = 1;
mock_quic_data.AddWrite(
- SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
+ SYNCHRONOUS, ConstructInitialSettingsPacket(write_packet_index++,
+ &header_stream_offset));
mock_quic_data.AddWrite(
- SYNCHRONOUS, ConstructClientRequestHeadersPacket(
- 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
- false, ConnectRequestHeaders("mail.example.org:443"),
- &header_stream_offset));
+ SYNCHRONOUS,
+ ConstructClientRequestHeadersPacket(
+ write_packet_index++, GetNthClientInitiatedBidirectionalStreamId(0),
+ true, false, ConnectRequestHeaders("mail.example.org:443"),
+ &header_stream_offset));
mock_quic_data.AddRead(
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
@@ -7563,34 +7683,54 @@
spdy::SpdySerializedFrame get_frame =
spdy_util.ConstructSpdyGet("https://mail.example.org/", 1, LOWEST);
- mock_quic_data.AddWrite(
- SYNCHRONOUS,
- ConstructClientAckAndDataPacket(
- 3, false, GetNthClientInitiatedBidirectionalStreamId(0), 1, 1, 1,
- false, 0, quic::QuicStringPiece(get_frame.data(), get_frame.size())));
+ quic::QuicString header = ConstructDataHeader(get_frame.size());
+ if (version_ != quic::QUIC_VERSION_99) {
+ mock_quic_data.AddWrite(
+ SYNCHRONOUS,
+ ConstructClientAckAndDataPacket(
+ write_packet_index++, false,
+ GetNthClientInitiatedBidirectionalStreamId(0), 1, 1, 1, false, 0,
+ quic::QuicStringPiece(get_frame.data(), get_frame.size())));
+ } else {
+ mock_quic_data.AddWrite(
+ SYNCHRONOUS, ConstructClientAckAndDataPacket(
+ write_packet_index++, false,
+ GetNthClientInitiatedBidirectionalStreamId(0), 1, 1, 1,
+ false, 0, header));
+ mock_quic_data.AddWrite(
+ SYNCHRONOUS,
+ ConstructClientDataPacket(
+ write_packet_index++, GetNthClientInitiatedBidirectionalStreamId(0),
+ false, false, header.length(),
+ quic::QuicStringPiece(get_frame.data(), get_frame.size())));
+ }
spdy::SpdySerializedFrame resp_frame =
spdy_util.ConstructSpdyGetReply(nullptr, 0, 1);
+ quic::QuicString header2 = ConstructDataHeader(resp_frame.size());
mock_quic_data.AddRead(
ASYNC,
ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, false, 0,
- quic::QuicStringPiece(resp_frame.data(), resp_frame.size())));
+ header2 + quic::QuicString(resp_frame.data(), resp_frame.size())));
spdy::SpdySerializedFrame data_frame =
spdy_util.ConstructSpdyDataFrame(1, "0123456789", true);
+ quic::QuicString header3 = ConstructDataHeader(resp_frame.size());
mock_quic_data.AddRead(
SYNCHRONOUS,
ConstructServerDataPacket(
3, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
- resp_frame.size(),
- quic::QuicStringPiece(data_frame.data(), data_frame.size())));
- mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(4, 3, 2, 1));
+ resp_frame.size() + header2.length(),
+ header3 + quic::QuicString(data_frame.data(), data_frame.size())));
+ mock_quic_data.AddWrite(
+ SYNCHRONOUS, ConstructClientAckPacket(write_packet_index++, 3, 2, 1));
mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
mock_quic_data.AddWrite(
SYNCHRONOUS,
- ConstructClientRstPacket(5, GetNthClientInitiatedBidirectionalStreamId(0),
- quic::QUIC_STREAM_CANCELLED, get_frame.size()));
+ ConstructClientRstPacket(
+ write_packet_index++, GetNthClientInitiatedBidirectionalStreamId(0),
+ quic::QUIC_STREAM_CANCELLED, get_frame.size() + header.length()));
mock_quic_data.AddSocketDataToFactory(&socket_factory_);
@@ -7632,13 +7772,16 @@
MockQuicData mock_quic_data;
quic::QuicStreamOffset header_stream_offset = 0;
+ int write_packet_index = 1;
mock_quic_data.AddWrite(
- SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
+ SYNCHRONOUS, ConstructInitialSettingsPacket(write_packet_index++,
+ &header_stream_offset));
mock_quic_data.AddWrite(
- SYNCHRONOUS, ConstructClientRequestHeadersPacket(
- 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
- false, ConnectRequestHeaders("mail.example.org:443"),
- &header_stream_offset));
+ SYNCHRONOUS,
+ ConstructClientRequestHeadersPacket(
+ write_packet_index++, GetNthClientInitiatedBidirectionalStreamId(0),
+ true, false, ConnectRequestHeaders("mail.example.org:443"),
+ &header_stream_offset));
mock_quic_data.AddRead(
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
@@ -7650,65 +7793,101 @@
"GET / HTTP/1.1\r\n"
"Host: mail.example.org\r\n"
"Connection: keep-alive\r\n\r\n";
- mock_quic_data.AddWrite(
- SYNCHRONOUS,
- ConstructClientAckAndDataPacket(
- 3, false, GetNthClientInitiatedBidirectionalStreamId(0), 1, 1, 1,
- false, client_data_offset, quic::QuicStringPiece(get_request_1)));
- client_data_offset += strlen(get_request_1);
+ quic::QuicString header = ConstructDataHeader(strlen(get_request_1));
+ if (version_ != quic::QUIC_VERSION_99) {
+ mock_quic_data.AddWrite(
+ SYNCHRONOUS,
+ ConstructClientAckAndDataPacket(
+ write_packet_index++, false,
+ GetNthClientInitiatedBidirectionalStreamId(0), 1, 1, 1, false,
+ client_data_offset, quic::QuicStringPiece(get_request_1)));
+ } else {
+ mock_quic_data.AddWrite(
+ SYNCHRONOUS, ConstructClientAckAndDataPacket(
+ write_packet_index++, false,
+ GetNthClientInitiatedBidirectionalStreamId(0), 1, 1, 1,
+ false, client_data_offset, header));
+ mock_quic_data.AddWrite(
+ SYNCHRONOUS,
+ ConstructClientDataPacket(write_packet_index++,
+ GetNthClientInitiatedBidirectionalStreamId(0),
+ false, false, header.length(),
+ quic::QuicStringPiece(get_request_1)));
+ }
+
+ client_data_offset += strlen(get_request_1) + header.length();
const char get_response_1[] =
"HTTP/1.1 200 OK\r\n"
"Content-Length: 10\r\n\r\n";
+ quic::QuicString header2 = ConstructDataHeader(strlen(get_response_1));
mock_quic_data.AddRead(
- ASYNC, ConstructServerDataPacket(
- 2, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
- server_data_offset, quic::QuicStringPiece(get_response_1)));
- server_data_offset += strlen(get_response_1);
+ ASYNC,
+ ConstructServerDataPacket(
+ 2, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
+ server_data_offset, header2 + quic::QuicString(get_response_1)));
+ server_data_offset += strlen(get_response_1) + header2.length();
+ quic::QuicString header3 = ConstructDataHeader(10);
mock_quic_data.AddRead(
SYNCHRONOUS,
ConstructServerDataPacket(
3, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
- server_data_offset, quic::QuicStringPiece("0123456789")));
- server_data_offset += 10;
+ server_data_offset, header3 + quic::QuicString("0123456789")));
+ server_data_offset += 10 + header3.length();
- mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(4, 3, 2, 1));
+ mock_quic_data.AddWrite(
+ SYNCHRONOUS, ConstructClientAckPacket(write_packet_index++, 3, 2, 1));
const char get_request_2[] =
"GET /2 HTTP/1.1\r\n"
"Host: mail.example.org\r\n"
"Connection: keep-alive\r\n\r\n";
+ quic::QuicString header4 = ConstructDataHeader(strlen(get_request_2));
+ if (version_ == quic::QUIC_VERSION_99) {
+ mock_quic_data.AddWrite(
+ SYNCHRONOUS,
+ ConstructClientDataPacket(write_packet_index++,
+ GetNthClientInitiatedBidirectionalStreamId(0),
+ false, false, client_data_offset, header4));
+ client_data_offset += header4.length();
+ }
mock_quic_data.AddWrite(
SYNCHRONOUS,
- ConstructClientDataPacket(
- 5, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
- client_data_offset, quic::QuicStringPiece(get_request_2)));
+ ConstructClientDataPacket(write_packet_index++,
+ GetNthClientInitiatedBidirectionalStreamId(0),
+ false, false, client_data_offset,
+ quic::QuicStringPiece(get_request_2)));
client_data_offset += strlen(get_request_2);
const char get_response_2[] =
"HTTP/1.1 200 OK\r\n"
"Content-Length: 7\r\n\r\n";
+ quic::QuicString header5 = ConstructDataHeader(strlen(get_response_2));
mock_quic_data.AddRead(
- ASYNC, ConstructServerDataPacket(
- 4, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
- server_data_offset, quic::QuicStringPiece(get_response_2)));
- server_data_offset += strlen(get_response_2);
+ ASYNC,
+ ConstructServerDataPacket(
+ 4, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
+ server_data_offset, header5 + quic::QuicString(get_response_2)));
+ server_data_offset += strlen(get_response_2) + header5.length();
+ quic::QuicString header6 = ConstructDataHeader(7);
mock_quic_data.AddRead(
SYNCHRONOUS,
ConstructServerDataPacket(
5, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
- server_data_offset, quic::QuicStringPiece("0123456")));
- server_data_offset += 7;
+ server_data_offset, header6 + quic::QuicString("0123456")));
+ server_data_offset += 7 + header6.length();
- mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(6, 5, 4, 1));
+ mock_quic_data.AddWrite(
+ SYNCHRONOUS, ConstructClientAckPacket(write_packet_index++, 5, 4, 1));
mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
- mock_quic_data.AddWrite(SYNCHRONOUS,
- ConstructClientRstPacket(
- 7, GetNthClientInitiatedBidirectionalStreamId(0),
- quic::QUIC_STREAM_CANCELLED, client_data_offset));
+ mock_quic_data.AddWrite(
+ SYNCHRONOUS,
+ ConstructClientRstPacket(
+ write_packet_index++, GetNthClientInitiatedBidirectionalStreamId(0),
+ quic::QUIC_STREAM_CANCELLED, client_data_offset));
mock_quic_data.AddSocketDataToFactory(&socket_factory_);
@@ -7763,15 +7942,18 @@
MockQuicData mock_quic_data;
quic::QuicStreamOffset client_header_stream_offset = 0;
quic::QuicStreamOffset server_header_stream_offset = 0;
- mock_quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket(
- 1, &client_header_stream_offset));
+ int write_packet_index = 1;
+ mock_quic_data.AddWrite(
+ SYNCHRONOUS, ConstructInitialSettingsPacket(
+ write_packet_index++, &client_header_stream_offset));
// CONNECT request and response for first request
mock_quic_data.AddWrite(
- SYNCHRONOUS, ConstructClientRequestHeadersPacket(
- 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
- false, ConnectRequestHeaders("mail.example.org:443"),
- &client_header_stream_offset));
+ SYNCHRONOUS,
+ ConstructClientRequestHeadersPacket(
+ write_packet_index++, GetNthClientInitiatedBidirectionalStreamId(0),
+ true, false, ConnectRequestHeaders("mail.example.org:443"),
+ &client_header_stream_offset));
mock_quic_data.AddRead(
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
@@ -7782,30 +7964,49 @@
"GET / HTTP/1.1\r\n"
"Host: mail.example.org\r\n"
"Connection: keep-alive\r\n\r\n";
- mock_quic_data.AddWrite(
- SYNCHRONOUS, ConstructClientAckAndDataPacket(
- 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
- 1, 1, 1, false, 0, quic::QuicStringPiece(get_request)));
+ quic::QuicString header = ConstructDataHeader(strlen(get_request));
+ if (version_ != quic::QUIC_VERSION_99) {
+ mock_quic_data.AddWrite(
+ SYNCHRONOUS, ConstructClientAckAndDataPacket(
+ write_packet_index++, false,
+ GetNthClientInitiatedBidirectionalStreamId(0), 1, 1, 1,
+ false, 0, quic::QuicStringPiece(get_request)));
+ } else {
+ mock_quic_data.AddWrite(
+ SYNCHRONOUS, ConstructClientAckAndDataPacket(
+ write_packet_index++, false,
+ GetNthClientInitiatedBidirectionalStreamId(0), 1, 1, 1,
+ false, 0, header));
+ mock_quic_data.AddWrite(
+ SYNCHRONOUS,
+ ConstructClientDataPacket(
+ write_packet_index++, GetNthClientInitiatedBidirectionalStreamId(0),
+ false, false, header.length(), quic::QuicStringPiece(get_request)));
+ }
+
const char get_response[] =
"HTTP/1.1 200 OK\r\n"
"Content-Length: 10\r\n\r\n";
+ quic::QuicString header2 = ConstructDataHeader(strlen(get_response));
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
- 0, quic::QuicStringPiece(get_response)));
+ 0, header2 + quic::QuicString(get_response)));
+ quic::QuicString header3 = ConstructDataHeader(10);
mock_quic_data.AddRead(
- SYNCHRONOUS,
- ConstructServerDataPacket(
- 3, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
- strlen(get_response), quic::QuicStringPiece("0123456789")));
- mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(4, 3, 2, 1));
+ SYNCHRONOUS, ConstructServerDataPacket(
+ 3, GetNthClientInitiatedBidirectionalStreamId(0), false,
+ false, strlen(get_response) + header2.length(),
+ header3 + quic::QuicString("0123456789")));
+ mock_quic_data.AddWrite(
+ SYNCHRONOUS, ConstructClientAckPacket(write_packet_index++, 3, 2, 1));
// CONNECT request and response for second request
mock_quic_data.AddWrite(
SYNCHRONOUS,
ConstructClientRequestHeadersPacket(
- 5, GetNthClientInitiatedBidirectionalStreamId(1), false, false,
- ConnectRequestHeaders("different.example.org:443"),
+ write_packet_index++, GetNthClientInitiatedBidirectionalStreamId(1),
+ false, false, ConnectRequestHeaders("different.example.org:443"),
GetNthClientInitiatedBidirectionalStreamId(0),
&client_header_stream_offset));
mock_quic_data.AddRead(
@@ -7817,39 +8018,61 @@
SpdyTestUtil spdy_util;
spdy::SpdySerializedFrame get_frame =
spdy_util.ConstructSpdyGet("https://different.example.org/", 1, LOWEST);
- mock_quic_data.AddWrite(
- SYNCHRONOUS,
- ConstructClientAckAndDataPacket(
- 6, false, GetNthClientInitiatedBidirectionalStreamId(1), 4, 4, 1,
- false, 0, quic::QuicStringPiece(get_frame.data(), get_frame.size())));
+ quic::QuicString header4 = ConstructDataHeader(get_frame.size());
+ if (version_ != quic::QUIC_VERSION_99) {
+ mock_quic_data.AddWrite(
+ SYNCHRONOUS,
+ ConstructClientAckAndDataPacket(
+ write_packet_index++, false,
+ GetNthClientInitiatedBidirectionalStreamId(1), 4, 4, 1, false, 0,
+ quic::QuicStringPiece(get_frame.data(), get_frame.size())));
+ } else {
+ mock_quic_data.AddWrite(
+ SYNCHRONOUS, ConstructClientAckAndDataPacket(
+ write_packet_index++, false,
+ GetNthClientInitiatedBidirectionalStreamId(1), 4, 4, 1,
+ false, 0, header4));
+ mock_quic_data.AddWrite(
+ SYNCHRONOUS,
+ ConstructClientDataPacket(
+ write_packet_index++, GetNthClientInitiatedBidirectionalStreamId(1),
+ false, false, header4.length(),
+ quic::QuicStringPiece(get_frame.data(), get_frame.size())));
+ }
spdy::SpdySerializedFrame resp_frame =
spdy_util.ConstructSpdyGetReply(nullptr, 0, 1);
+ quic::QuicString header5 = ConstructDataHeader(resp_frame.size());
mock_quic_data.AddRead(
ASYNC,
ConstructServerDataPacket(
5, GetNthClientInitiatedBidirectionalStreamId(1), false, false, 0,
- quic::QuicStringPiece(resp_frame.data(), resp_frame.size())));
+ header5 + quic::QuicString(resp_frame.data(), resp_frame.size())));
spdy::SpdySerializedFrame data_frame =
spdy_util.ConstructSpdyDataFrame(1, "0123456", true);
+ quic::QuicString header6 = ConstructDataHeader(data_frame.size());
mock_quic_data.AddRead(
- ASYNC, ConstructServerDataPacket(
- 6, GetNthClientInitiatedBidirectionalStreamId(1), false, false,
- resp_frame.size(),
- quic::QuicStringPiece(data_frame.data(), data_frame.size())));
+ ASYNC,
+ ConstructServerDataPacket(
+ 6, GetNthClientInitiatedBidirectionalStreamId(1), false, false,
+ resp_frame.size() + header5.length(),
+ header6 + quic::QuicString(data_frame.data(), data_frame.size())));
- mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(7, 6, 5, 1));
+ mock_quic_data.AddWrite(
+ SYNCHRONOUS, ConstructClientAckPacket(write_packet_index++, 6, 5, 1));
mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
mock_quic_data.AddWrite(
- SYNCHRONOUS, ConstructClientRstPacket(
- 8, GetNthClientInitiatedBidirectionalStreamId(0),
- quic::QUIC_STREAM_CANCELLED, strlen(get_request)));
+ SYNCHRONOUS,
+ ConstructClientRstPacket(
+ write_packet_index++, GetNthClientInitiatedBidirectionalStreamId(0),
+ quic::QUIC_STREAM_CANCELLED, strlen(get_request) + header.length()));
mock_quic_data.AddWrite(
SYNCHRONOUS,
- ConstructClientRstPacket(9, GetNthClientInitiatedBidirectionalStreamId(1),
- quic::QUIC_STREAM_CANCELLED, get_frame.size()));
+ ConstructClientRstPacket(
+ write_packet_index++, GetNthClientInitiatedBidirectionalStreamId(1),
+ quic::QUIC_STREAM_CANCELLED, get_frame.size() + header4.length()));
mock_quic_data.AddSocketDataToFactory(&socket_factory_);
@@ -7992,28 +8215,33 @@
MockQuicData mock_quic_data;
quic::QuicStreamOffset client_header_stream_offset = 0;
quic::QuicStreamOffset server_header_stream_offset = 0;
- mock_quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket(
- 1, &client_header_stream_offset));
+ int write_packet_index = 1;
mock_quic_data.AddWrite(
- SYNCHRONOUS, ConstructClientRequestHeadersPacket(
- 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
- false, ConnectRequestHeaders("mail.example.org:443"),
- &client_header_stream_offset));
+ SYNCHRONOUS, ConstructInitialSettingsPacket(
+ write_packet_index++, &client_header_stream_offset));
+ mock_quic_data.AddWrite(
+ SYNCHRONOUS,
+ ConstructClientRequestHeadersPacket(
+ write_packet_index++, GetNthClientInitiatedBidirectionalStreamId(0),
+ true, false, ConnectRequestHeaders("mail.example.org:443"),
+ &client_header_stream_offset));
mock_quic_data.AddRead(
ASYNC, ConstructServerResponseHeadersPacket(
1, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
GetResponseHeaders("200 OK"), &server_header_stream_offset));
- mock_quic_data.AddWrite(SYNCHRONOUS,
- ConstructClientAckAndRstPacket(
- 3, GetNthClientInitiatedBidirectionalStreamId(0),
- quic::QUIC_STREAM_CANCELLED, 1, 1, 1));
+ mock_quic_data.AddWrite(
+ SYNCHRONOUS,
+ ConstructClientAckAndRstPacket(
+ write_packet_index++, GetNthClientInitiatedBidirectionalStreamId(0),
+ quic::QUIC_STREAM_CANCELLED, 1, 1, 1));
mock_quic_data.AddWrite(
- SYNCHRONOUS, ConstructClientRequestHeadersPacket(
- 4, GetNthClientInitiatedBidirectionalStreamId(1), false,
- false, ConnectRequestHeaders("mail.example.org:443"),
- GetNthClientInitiatedBidirectionalStreamId(0),
- &client_header_stream_offset));
+ SYNCHRONOUS,
+ ConstructClientRequestHeadersPacket(
+ write_packet_index++, GetNthClientInitiatedBidirectionalStreamId(1),
+ false, false, ConnectRequestHeaders("mail.example.org:443"),
+ GetNthClientInitiatedBidirectionalStreamId(0),
+ &client_header_stream_offset));
mock_quic_data.AddRead(
ASYNC, ConstructServerResponseHeadersPacket(
2, GetNthClientInitiatedBidirectionalStreamId(1), false, false,
@@ -8023,30 +8251,49 @@
"GET / HTTP/1.1\r\n"
"Host: mail.example.org\r\n"
"Connection: keep-alive\r\n\r\n";
- mock_quic_data.AddWrite(
- SYNCHRONOUS, ConstructClientAckAndDataPacket(
- 5, false, GetNthClientInitiatedBidirectionalStreamId(1),
- 2, 2, 1, false, 0, quic::QuicStringPiece(get_request)));
+ quic::QuicString header = ConstructDataHeader(strlen(get_request));
+ if (version_ != quic::QUIC_VERSION_99) {
+ mock_quic_data.AddWrite(
+ SYNCHRONOUS, ConstructClientAckAndDataPacket(
+ write_packet_index++, false,
+ GetNthClientInitiatedBidirectionalStreamId(1), 2, 2, 1,
+ false, 0, quic::QuicStringPiece(get_request)));
+ } else {
+ mock_quic_data.AddWrite(
+ SYNCHRONOUS, ConstructClientAckAndDataPacket(
+ write_packet_index++, false,
+ GetNthClientInitiatedBidirectionalStreamId(1), 2, 2, 1,
+ false, 0, header));
+ mock_quic_data.AddWrite(
+ SYNCHRONOUS,
+ ConstructClientDataPacket(
+ write_packet_index++, GetNthClientInitiatedBidirectionalStreamId(1),
+ false, false, header.length(), quic::QuicStringPiece(get_request)));
+ }
const char get_response[] =
"HTTP/1.1 200 OK\r\n"
"Content-Length: 10\r\n\r\n";
+ quic::QuicString header2 = ConstructDataHeader(strlen(get_response));
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(
3, GetNthClientInitiatedBidirectionalStreamId(1), false, false,
- 0, quic::QuicStringPiece(get_response)));
+ 0, header2 + quic::QuicString(get_response)));
+ quic::QuicString header3 = ConstructDataHeader(10);
mock_quic_data.AddRead(
- SYNCHRONOUS,
- ConstructServerDataPacket(
- 4, GetNthClientInitiatedBidirectionalStreamId(1), false, false,
- strlen(get_response), quic::QuicStringPiece("0123456789")));
- mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(6, 4, 3, 1));
+ SYNCHRONOUS, ConstructServerDataPacket(
+ 4, GetNthClientInitiatedBidirectionalStreamId(1), false,
+ false, strlen(get_response) + header2.length(),
+ header3 + quic::QuicString("0123456789")));
+ mock_quic_data.AddWrite(
+ SYNCHRONOUS, ConstructClientAckPacket(write_packet_index++, 4, 3, 1));
mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read
mock_quic_data.AddWrite(
- SYNCHRONOUS, ConstructClientRstPacket(
- 7, GetNthClientInitiatedBidirectionalStreamId(1),
- quic::QUIC_STREAM_CANCELLED, strlen(get_request)));
+ SYNCHRONOUS,
+ ConstructClientRstPacket(
+ write_packet_index++, GetNthClientInitiatedBidirectionalStreamId(1),
+ quic::QUIC_STREAM_CANCELLED, strlen(get_request) + header.length()));
mock_quic_data.AddSocketDataToFactory(&socket_factory_);
@@ -8451,23 +8698,25 @@
&header_stream_offset));
// Server sends data for the three requests and the two push promises.
+ quic::QuicString header = ConstructDataHeader(8);
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(8, client_stream_0, false, true, 0,
- "hello 0!"));
+ header + "hello 0!"));
mock_quic_data.AddRead(
SYNCHRONOUS, ConstructServerDataPacket(9, client_stream_1, false, true, 0,
- "hello 1!"));
+ header + "hello 1!"));
mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(10, 9, 8, 1));
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(10, client_stream_2, false, true, 0,
- "hello 2!"));
+ header + "hello 2!"));
+ quic::QuicString header2 = ConstructDataHeader(12);
mock_quic_data.AddRead(
SYNCHRONOUS, ConstructServerDataPacket(11, push_stream_0, false, true, 0,
- "and hello 0!"));
+ header2 + "and hello 0!"));
mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(11, 11, 10, 1));
mock_quic_data.AddRead(
ASYNC, ConstructServerDataPacket(12, push_stream_1, false, true, 0,
- "and hello 1!"));
+ header2 + "and hello 1!"));
mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
mock_quic_data.AddRead(ASYNC, 0); // EOF