Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(420)

Unified Diff: net/quic/chromium/quic_network_transaction_unittest.cc

Issue 2804723003: QUIC - fix crash bug in client handling of Server Push. (Closed)
Patch Set: review feedback + pull Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/quic/chromium/quic_http_stream.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/quic/chromium/quic_network_transaction_unittest.cc
diff --git a/net/quic/chromium/quic_network_transaction_unittest.cc b/net/quic/chromium/quic_network_transaction_unittest.cc
index 9d5ac297243963a36487a35a61114b446527bd82..b7a0fb5a674dec92b9c5321aadea49fc6237d386 100644
--- a/net/quic/chromium/quic_network_transaction_unittest.cc
+++ b/net/quic/chromium/quic_network_transaction_unittest.cc
@@ -454,6 +454,17 @@ class QuicNetworkTransactionTest
std::move(headers), nullptr);
}
+ std::unique_ptr<QuicEncryptedPacket> ConstructClientMultipleDataFramesPacket(
+ QuicPacketNumber packet_number,
+ QuicStreamId stream_id,
+ bool should_include_version,
+ bool fin,
+ const std::vector<std::string>& data,
+ QuicStreamOffset offset) {
+ return client_maker_.MakeMultipleDataFramesPacket(
+ packet_number, stream_id, should_include_version, fin, offset, data);
+ }
+
std::unique_ptr<QuicEncryptedPacket> ConstructServerPushPromisePacket(
QuicPacketNumber packet_number,
QuicStreamId stream_id,
@@ -717,7 +728,7 @@ class QuicNetworkTransactionTest
const QuicVersion version_;
QuicFlagSaver flags_; // Save/restore all QUIC flag values.
- MockClock* clock_; // Owned by QuicStreamFactory after CreateSession.
+ MockClock* clock_; // Owned by QuicStreamFactory after CreateSession.
QuicTestPacketMaker client_maker_;
QuicTestPacketMaker server_maker_;
std::unique_ptr<HttpNetworkSession> session_;
@@ -1019,8 +1030,7 @@ TEST_P(QuicNetworkTransactionTest, AlternativeServicesDifferentHost) {
// TODO(rch): the connection should be "to" the origin, so if the cert is
// valid for the origin but not the alternative, that should work too.
EXPECT_TRUE(cert->VerifyNameMatch(origin.host(), false));
- EXPECT_TRUE(
- cert->VerifyNameMatch(alternative.host(), false));
+ EXPECT_TRUE(cert->VerifyNameMatch(alternative.host(), false));
ProofVerifyDetailsChromium verify_details;
verify_details.cert_verify_result.verified_cert = cert;
crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
@@ -3518,5 +3528,78 @@ TEST_P(QuicNetworkTransactionWithDestinationTest,
EXPECT_TRUE(AllDataConsumed());
}
+// crbug.com/705109 - this confirms that matching request with a body
+// triggers a crash (pre-fix).
+TEST_P(QuicNetworkTransactionTest, QuicServerPushMatchesRequestWithBody) {
+ params_.origins_to_force_quic_on.insert(
+ HostPortPair::FromString("mail.example.org:443"));
+
+ MockQuicData mock_quic_data;
+ QuicStreamOffset header_stream_offset = 0;
+ mock_quic_data.AddWrite(ConstructSettingsPacket(
+ 1, SETTINGS_MAX_HEADER_LIST_SIZE, kDefaultMaxUncompressedHeaderSize,
+ &header_stream_offset));
+ mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
+ 2, kClientDataStreamId1, true, true,
+ GetRequestHeaders("GET", "https", "/"), &header_stream_offset));
+ QuicStreamOffset server_header_offset = 0;
+ mock_quic_data.AddRead(ConstructServerPushPromisePacket(
+ 1, kClientDataStreamId1, kServerDataStreamId1, false,
+ GetRequestHeaders("GET", "https", "/pushed.jpg"), &server_header_offset,
+ &server_maker_));
+ mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
+ 2, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
+ &server_header_offset));
+ mock_quic_data.AddWrite(ConstructClientAckPacket(3, 2, 1, 1));
+ mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
+ 3, kServerDataStreamId1, false, false, GetResponseHeaders("200 OK"),
+ &server_header_offset));
+ mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId1,
+ false, true, 0, "hello!"));
+ mock_quic_data.AddWrite(ConstructClientAckPacket(4, 4, 3, 1));
+ mock_quic_data.AddRead(ConstructServerDataPacket(
+ 5, kServerDataStreamId1, false, true, 0, "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
+ // wire.
+ mock_quic_data.AddWrite(ConstructClientAckAndRstPacket(
+ 5, kServerDataStreamId1, QUIC_STREAM_CANCELLED, 5, 5, 1));
+ const char kBody[] = "1";
+ mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
+ 6, kClientDataStreamId2, false, false,
+ GetRequestHeaders("GET", "https", "/pushed.jpg"), &header_stream_offset));
+ mock_quic_data.AddWrite(ConstructClientMultipleDataFramesPacket(
+ 7, kClientDataStreamId2, false, true, {kBody}, 0));
+
+ // We see the same response as for the earlier pushed and cancelled
+ // stream.
+ mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
+ 6, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
+ &server_header_offset));
+ mock_quic_data.AddRead(ConstructServerDataPacket(
+ 7, kClientDataStreamId2, false, true, 0, "and hello!"));
+
+ mock_quic_data.AddWrite(ConstructClientAckPacket(8, 7, 6, 1));
+ mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
+ mock_quic_data.AddRead(ASYNC, 0); // EOF
+ mock_quic_data.AddSocketDataToFactory(&socket_factory_);
+
+ // The non-alternate protocol job needs to hang in order to guarantee that
+ // the alternate-protocol job will "win".
+ AddHangingNonAlternateProtocolSocketData();
+
+ CreateSession();
+
+ // PUSH_PROMISE handling in the http layer gets exercised here.
+ SendRequestAndExpectQuicResponse("hello!");
+
+ request_.url = GURL("https://mail.example.org/pushed.jpg");
+ ChunkedUploadDataStream upload_data(0);
+ upload_data.AppendData("1", 1, true);
+ request_.upload_data_stream = &upload_data;
+ SendRequestAndExpectQuicResponse("and hello!");
+}
+
} // namespace test
} // namespace net
« no previous file with comments | « net/quic/chromium/quic_http_stream.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698