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

Side by Side 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 unified diff | Download patch
« no previous file with comments | « net/quic/chromium/quic_http_stream.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <memory> 5 #include <memory>
6 #include <ostream> 6 #include <ostream>
7 #include <string> 7 #include <string>
8 #include <utility> 8 #include <utility>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 436 matching lines...) Expand 10 before | Expand all | Expand 10 after
447 QuicPacketNumber packet_number, 447 QuicPacketNumber packet_number,
448 QuicStreamId stream_id, 448 QuicStreamId stream_id,
449 bool should_include_version, 449 bool should_include_version,
450 bool fin, 450 bool fin,
451 SpdyHeaderBlock headers) { 451 SpdyHeaderBlock headers) {
452 return ConstructClientRequestHeadersPacket(packet_number, stream_id, 452 return ConstructClientRequestHeadersPacket(packet_number, stream_id,
453 should_include_version, fin, 453 should_include_version, fin,
454 std::move(headers), nullptr); 454 std::move(headers), nullptr);
455 } 455 }
456 456
457 std::unique_ptr<QuicEncryptedPacket> ConstructClientMultipleDataFramesPacket(
458 QuicPacketNumber packet_number,
459 QuicStreamId stream_id,
460 bool should_include_version,
461 bool fin,
462 const std::vector<std::string>& data,
463 QuicStreamOffset offset) {
464 return client_maker_.MakeMultipleDataFramesPacket(
465 packet_number, stream_id, should_include_version, fin, offset, data);
466 }
467
457 std::unique_ptr<QuicEncryptedPacket> ConstructServerPushPromisePacket( 468 std::unique_ptr<QuicEncryptedPacket> ConstructServerPushPromisePacket(
458 QuicPacketNumber packet_number, 469 QuicPacketNumber packet_number,
459 QuicStreamId stream_id, 470 QuicStreamId stream_id,
460 QuicStreamId promised_stream_id, 471 QuicStreamId promised_stream_id,
461 bool should_include_version, 472 bool should_include_version,
462 SpdyHeaderBlock headers, 473 SpdyHeaderBlock headers,
463 QuicStreamOffset* offset, 474 QuicStreamOffset* offset,
464 QuicTestPacketMaker* maker) { 475 QuicTestPacketMaker* maker) {
465 return maker->MakePushPromisePacket( 476 return maker->MakePushPromisePacket(
466 packet_number, stream_id, promised_stream_id, should_include_version, 477 packet_number, stream_id, promised_stream_id, should_include_version,
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after
710 // The alternative proxy server should no longer be in use. 721 // The alternative proxy server should no longer be in use.
711 EXPECT_FALSE(test_proxy_delegate.alternative_proxy_server().is_valid()); 722 EXPECT_FALSE(test_proxy_delegate.alternative_proxy_server().is_valid());
712 723
713 // Verify that the second request completes successfully, and the 724 // Verify that the second request completes successfully, and the
714 // alternative proxy server job is not started. 725 // alternative proxy server job is not started.
715 SendRequestAndExpectHttpResponseFromProxy("hello from http", true, 443); 726 SendRequestAndExpectHttpResponseFromProxy("hello from http", true, 443);
716 } 727 }
717 728
718 const QuicVersion version_; 729 const QuicVersion version_;
719 QuicFlagSaver flags_; // Save/restore all QUIC flag values. 730 QuicFlagSaver flags_; // Save/restore all QUIC flag values.
720 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession. 731 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession.
721 QuicTestPacketMaker client_maker_; 732 QuicTestPacketMaker client_maker_;
722 QuicTestPacketMaker server_maker_; 733 QuicTestPacketMaker server_maker_;
723 std::unique_ptr<HttpNetworkSession> session_; 734 std::unique_ptr<HttpNetworkSession> session_;
724 MockClientSocketFactory socket_factory_; 735 MockClientSocketFactory socket_factory_;
725 ProofVerifyDetailsChromium verify_details_; 736 ProofVerifyDetailsChromium verify_details_;
726 MockCryptoClientStreamFactory crypto_client_stream_factory_; 737 MockCryptoClientStreamFactory crypto_client_stream_factory_;
727 MockHostResolver host_resolver_; 738 MockHostResolver host_resolver_;
728 MockCertVerifier cert_verifier_; 739 MockCertVerifier cert_verifier_;
729 TransportSecurityState transport_security_state_; 740 TransportSecurityState transport_security_state_;
730 std::unique_ptr<CTVerifier> cert_transparency_verifier_; 741 std::unique_ptr<CTVerifier> cert_transparency_verifier_;
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after
1012 HostPortPair origin("www.example.org", 443); 1023 HostPortPair origin("www.example.org", 443);
1013 HostPortPair alternative("mail.example.org", 443); 1024 HostPortPair alternative("mail.example.org", 443);
1014 1025
1015 base::FilePath certs_dir = GetTestCertsDirectory(); 1026 base::FilePath certs_dir = GetTestCertsDirectory();
1016 scoped_refptr<X509Certificate> cert( 1027 scoped_refptr<X509Certificate> cert(
1017 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem")); 1028 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
1018 ASSERT_TRUE(cert.get()); 1029 ASSERT_TRUE(cert.get());
1019 // TODO(rch): the connection should be "to" the origin, so if the cert is 1030 // TODO(rch): the connection should be "to" the origin, so if the cert is
1020 // valid for the origin but not the alternative, that should work too. 1031 // valid for the origin but not the alternative, that should work too.
1021 EXPECT_TRUE(cert->VerifyNameMatch(origin.host(), false)); 1032 EXPECT_TRUE(cert->VerifyNameMatch(origin.host(), false));
1022 EXPECT_TRUE( 1033 EXPECT_TRUE(cert->VerifyNameMatch(alternative.host(), false));
1023 cert->VerifyNameMatch(alternative.host(), false));
1024 ProofVerifyDetailsChromium verify_details; 1034 ProofVerifyDetailsChromium verify_details;
1025 verify_details.cert_verify_result.verified_cert = cert; 1035 verify_details.cert_verify_result.verified_cert = cert;
1026 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 1036 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1027 1037
1028 client_maker_.set_hostname(origin.host()); 1038 client_maker_.set_hostname(origin.host());
1029 MockQuicData mock_quic_data; 1039 MockQuicData mock_quic_data;
1030 QuicStreamOffset header_stream_offset = 0; 1040 QuicStreamOffset header_stream_offset = 0;
1031 mock_quic_data.AddWrite(ConstructSettingsPacket( 1041 mock_quic_data.AddWrite(ConstructSettingsPacket(
1032 1, SETTINGS_MAX_HEADER_LIST_SIZE, kDefaultMaxUncompressedHeaderSize, 1042 1, SETTINGS_MAX_HEADER_LIST_SIZE, kDefaultMaxUncompressedHeaderSize,
1033 &header_stream_offset)); 1043 &header_stream_offset));
(...skipping 2477 matching lines...) Expand 10 before | Expand all | Expand 10 after
3511 mock_quic_data2.AddSocketDataToFactory(&socket_factory_); 3521 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
3512 3522
3513 AddHangingSocketData(); 3523 AddHangingSocketData();
3514 3524
3515 SendRequestAndExpectQuicResponse(origin1_); 3525 SendRequestAndExpectQuicResponse(origin1_);
3516 SendRequestAndExpectQuicResponse(origin2_); 3526 SendRequestAndExpectQuicResponse(origin2_);
3517 3527
3518 EXPECT_TRUE(AllDataConsumed()); 3528 EXPECT_TRUE(AllDataConsumed());
3519 } 3529 }
3520 3530
3531 // crbug.com/705109 - this confirms that matching request with a body
3532 // triggers a crash (pre-fix).
3533 TEST_P(QuicNetworkTransactionTest, QuicServerPushMatchesRequestWithBody) {
3534 params_.origins_to_force_quic_on.insert(
3535 HostPortPair::FromString("mail.example.org:443"));
3536
3537 MockQuicData mock_quic_data;
3538 QuicStreamOffset header_stream_offset = 0;
3539 mock_quic_data.AddWrite(ConstructSettingsPacket(
3540 1, SETTINGS_MAX_HEADER_LIST_SIZE, kDefaultMaxUncompressedHeaderSize,
3541 &header_stream_offset));
3542 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
3543 2, kClientDataStreamId1, true, true,
3544 GetRequestHeaders("GET", "https", "/"), &header_stream_offset));
3545 QuicStreamOffset server_header_offset = 0;
3546 mock_quic_data.AddRead(ConstructServerPushPromisePacket(
3547 1, kClientDataStreamId1, kServerDataStreamId1, false,
3548 GetRequestHeaders("GET", "https", "/pushed.jpg"), &server_header_offset,
3549 &server_maker_));
3550 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
3551 2, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"),
3552 &server_header_offset));
3553 mock_quic_data.AddWrite(ConstructClientAckPacket(3, 2, 1, 1));
3554 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
3555 3, kServerDataStreamId1, false, false, GetResponseHeaders("200 OK"),
3556 &server_header_offset));
3557 mock_quic_data.AddRead(ConstructServerDataPacket(4, kClientDataStreamId1,
3558 false, true, 0, "hello!"));
3559 mock_quic_data.AddWrite(ConstructClientAckPacket(4, 4, 3, 1));
3560 mock_quic_data.AddRead(ConstructServerDataPacket(
3561 5, kServerDataStreamId1, false, true, 0, "and hello!"));
3562
3563 // Because the matching request has a body, we will see the push
3564 // stream get cancelled, and the matching request go out on the
3565 // wire.
3566 mock_quic_data.AddWrite(ConstructClientAckAndRstPacket(
3567 5, kServerDataStreamId1, QUIC_STREAM_CANCELLED, 5, 5, 1));
3568 const char kBody[] = "1";
3569 mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
3570 6, kClientDataStreamId2, false, false,
3571 GetRequestHeaders("GET", "https", "/pushed.jpg"), &header_stream_offset));
3572 mock_quic_data.AddWrite(ConstructClientMultipleDataFramesPacket(
3573 7, kClientDataStreamId2, false, true, {kBody}, 0));
3574
3575 // We see the same response as for the earlier pushed and cancelled
3576 // stream.
3577 mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
3578 6, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
3579 &server_header_offset));
3580 mock_quic_data.AddRead(ConstructServerDataPacket(
3581 7, kClientDataStreamId2, false, true, 0, "and hello!"));
3582
3583 mock_quic_data.AddWrite(ConstructClientAckPacket(8, 7, 6, 1));
3584 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
3585 mock_quic_data.AddRead(ASYNC, 0); // EOF
3586 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
3587
3588 // The non-alternate protocol job needs to hang in order to guarantee that
3589 // the alternate-protocol job will "win".
3590 AddHangingNonAlternateProtocolSocketData();
3591
3592 CreateSession();
3593
3594 // PUSH_PROMISE handling in the http layer gets exercised here.
3595 SendRequestAndExpectQuicResponse("hello!");
3596
3597 request_.url = GURL("https://mail.example.org/pushed.jpg");
3598 ChunkedUploadDataStream upload_data(0);
3599 upload_data.AppendData("1", 1, true);
3600 request_.upload_data_stream = &upload_data;
3601 SendRequestAndExpectQuicResponse("and hello!");
3602 }
3603
3521 } // namespace test 3604 } // namespace test
3522 } // namespace net 3605 } // namespace net
OLDNEW
« 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