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