OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |