| 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 <vector> | 5 #include <vector> |
| 6 | 6 |
| 7 #include "base/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
| 8 #include "base/macros.h" | 8 #include "base/macros.h" |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 65 "Alternate-Protocol: 443:quic,p=.5\r\n\r\n"; | 65 "Alternate-Protocol: 443:quic,p=.5\r\n\r\n"; |
| 66 static const char kQuicAlternateProtocolDifferentPortHeader[] = | 66 static const char kQuicAlternateProtocolDifferentPortHeader[] = |
| 67 "Alternate-Protocol: 137:quic\r\n\r\n"; | 67 "Alternate-Protocol: 137:quic\r\n\r\n"; |
| 68 static const char kQuicAlternativeServiceHeader[] = | 68 static const char kQuicAlternativeServiceHeader[] = |
| 69 "Alt-Svc: quic=\":443\"\r\n\r\n"; | 69 "Alt-Svc: quic=\":443\"\r\n\r\n"; |
| 70 static const char kQuicAlternativeService50pctHeader[] = | 70 static const char kQuicAlternativeService50pctHeader[] = |
| 71 "Alt-Svc: quic=\":443\";p=\".5\"\r\n\r\n"; | 71 "Alt-Svc: quic=\":443\";p=\".5\"\r\n\r\n"; |
| 72 static const char kQuicAlternativeServiceDifferentPortHeader[] = | 72 static const char kQuicAlternativeServiceDifferentPortHeader[] = |
| 73 "Alt-Svc: quic=\":137\"\r\n\r\n"; | 73 "Alt-Svc: quic=\":137\"\r\n\r\n"; |
| 74 | 74 |
| 75 const char kDefaultServerHostName[] = "mail.example.com"; | 75 const char kDefaultServerHostName[] = "mail.example.org"; |
| 76 | 76 |
| 77 } // namespace | 77 } // namespace |
| 78 | 78 |
| 79 // Helper class to encapsulate MockReads and MockWrites for QUIC. | 79 // Helper class to encapsulate MockReads and MockWrites for QUIC. |
| 80 // Simplify ownership issues and the interaction with the MockSocketFactory. | 80 // Simplify ownership issues and the interaction with the MockSocketFactory. |
| 81 class MockQuicData { | 81 class MockQuicData { |
| 82 public: | 82 public: |
| 83 MockQuicData() : packet_number_(0) {} | 83 MockQuicData() : packet_number_(0) {} |
| 84 | 84 |
| 85 ~MockQuicData() { STLDeleteElements(&packets_); } | 85 ~MockQuicData() { STLDeleteElements(&packets_); } |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 198 random_generator_(0), | 198 random_generator_(0), |
| 199 ssl_data_(ASYNC, OK) { | 199 ssl_data_(ASYNC, OK) { |
| 200 request_.method = "GET"; | 200 request_.method = "GET"; |
| 201 std::string url("https://"); | 201 std::string url("https://"); |
| 202 url.append(kDefaultServerHostName); | 202 url.append(kDefaultServerHostName); |
| 203 request_.url = GURL(url); | 203 request_.url = GURL(url); |
| 204 request_.load_flags = 0; | 204 request_.load_flags = 0; |
| 205 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20)); | 205 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20)); |
| 206 | 206 |
| 207 scoped_refptr<X509Certificate> cert( | 207 scoped_refptr<X509Certificate> cert( |
| 208 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem")); | 208 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem")); |
| 209 verify_details_.cert_verify_result.verified_cert = cert; | 209 verify_details_.cert_verify_result.verified_cert = cert; |
| 210 verify_details_.cert_verify_result.is_issued_by_known_root = true; | 210 verify_details_.cert_verify_result.is_issued_by_known_root = true; |
| 211 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_); | 211 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_); |
| 212 } | 212 } |
| 213 | 213 |
| 214 void SetUp() override { | 214 void SetUp() override { |
| 215 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); | 215 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); |
| 216 base::MessageLoop::current()->RunUntilIdle(); | 216 base::MessageLoop::current()->RunUntilIdle(); |
| 217 } | 217 } |
| 218 | 218 |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 426 params_.transport_security_state = &transport_security_state_; | 426 params_.transport_security_state = &transport_security_state_; |
| 427 params_.cert_transparency_verifier = cert_transparency_verifier_.get(); | 427 params_.cert_transparency_verifier = cert_transparency_verifier_.get(); |
| 428 params_.socket_performance_watcher_factory = | 428 params_.socket_performance_watcher_factory = |
| 429 test_network_quality_estimator_.get(); | 429 test_network_quality_estimator_.get(); |
| 430 params_.proxy_service = proxy_service_.get(); | 430 params_.proxy_service = proxy_service_.get(); |
| 431 params_.ssl_config_service = ssl_config_service_.get(); | 431 params_.ssl_config_service = ssl_config_service_.get(); |
| 432 params_.http_auth_handler_factory = auth_handler_factory_.get(); | 432 params_.http_auth_handler_factory = auth_handler_factory_.get(); |
| 433 params_.http_server_properties = http_server_properties_.GetWeakPtr(); | 433 params_.http_server_properties = http_server_properties_.GetWeakPtr(); |
| 434 params_.quic_supported_versions = SupportedVersions(GetParam()); | 434 params_.quic_supported_versions = SupportedVersions(GetParam()); |
| 435 for (const char* host : | 435 for (const char* host : |
| 436 {kDefaultServerHostName, "www.example.com", "news.example.com", | 436 {kDefaultServerHostName, "www.example.org", "news.example.org", |
| 437 "bar.example.com", "foo.example.com", "www.example.org", | 437 "bar.example.org", "foo.example.org", "invalid.example.org", |
| 438 "invalid.example.org", "docs.example.org"}) { | 438 "mail.example.com"}) { |
| 439 params_.quic_host_whitelist.insert(host); | 439 params_.quic_host_whitelist.insert(host); |
| 440 } | 440 } |
| 441 | 441 |
| 442 test_network_quality_estimator_->AddRTTObserver(&rtt_observer_); | 442 test_network_quality_estimator_->AddRTTObserver(&rtt_observer_); |
| 443 | 443 |
| 444 if (use_next_protos) { | 444 if (use_next_protos) { |
| 445 params_.parse_alternative_services = true; | 445 params_.parse_alternative_services = true; |
| 446 params_.enable_alternative_service_with_different_host = true; | 446 params_.enable_alternative_service_with_different_host = true; |
| 447 } | 447 } |
| 448 | 448 |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 596 EXPECT_EQ(used_proxy, proxy_headers_handler.was_called()); | 596 EXPECT_EQ(used_proxy, proxy_headers_handler.was_called()); |
| 597 } | 597 } |
| 598 }; | 598 }; |
| 599 | 599 |
| 600 INSTANTIATE_TEST_CASE_P(Version, | 600 INSTANTIATE_TEST_CASE_P(Version, |
| 601 QuicNetworkTransactionTest, | 601 QuicNetworkTransactionTest, |
| 602 ::testing::ValuesIn(QuicSupportedVersions())); | 602 ::testing::ValuesIn(QuicSupportedVersions())); |
| 603 | 603 |
| 604 TEST_P(QuicNetworkTransactionTest, ForceQuic) { | 604 TEST_P(QuicNetworkTransactionTest, ForceQuic) { |
| 605 params_.origin_to_force_quic_on = | 605 params_.origin_to_force_quic_on = |
| 606 HostPortPair::FromString("mail.example.com:443"); | 606 HostPortPair::FromString("mail.example.org:443"); |
| 607 | 607 |
| 608 MockQuicData mock_quic_data; | 608 MockQuicData mock_quic_data; |
| 609 mock_quic_data.AddWrite( | 609 mock_quic_data.AddWrite( |
| 610 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 610 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
| 611 GetRequestHeaders("GET", "https", "/"))); | 611 GetRequestHeaders("GET", "https", "/"))); |
| 612 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | 612 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 613 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); | 613 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); |
| 614 mock_quic_data.AddRead( | 614 mock_quic_data.AddRead( |
| 615 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 615 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 616 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 616 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 663 EXPECT_LT(0, pos); | 663 EXPECT_LT(0, pos); |
| 664 | 664 |
| 665 int log_stream_id; | 665 int log_stream_id; |
| 666 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id)); | 666 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id)); |
| 667 EXPECT_EQ(3, log_stream_id); | 667 EXPECT_EQ(3, log_stream_id); |
| 668 } | 668 } |
| 669 | 669 |
| 670 TEST_P(QuicNetworkTransactionTest, QuicProxy) { | 670 TEST_P(QuicNetworkTransactionTest, QuicProxy) { |
| 671 params_.enable_quic_for_proxies = true; | 671 params_.enable_quic_for_proxies = true; |
| 672 proxy_service_ = | 672 proxy_service_ = |
| 673 ProxyService::CreateFixedFromPacResult("QUIC mail.example.com:70"); | 673 ProxyService::CreateFixedFromPacResult("QUIC mail.example.org:70"); |
| 674 | 674 |
| 675 MockQuicData mock_quic_data; | 675 MockQuicData mock_quic_data; |
| 676 mock_quic_data.AddWrite( | 676 mock_quic_data.AddWrite( |
| 677 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 677 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
| 678 GetRequestHeaders("GET", "http", "/"))); | 678 GetRequestHeaders("GET", "http", "/"))); |
| 679 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | 679 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 680 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); | 680 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); |
| 681 mock_quic_data.AddRead( | 681 mock_quic_data.AddRead( |
| 682 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 682 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 683 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 683 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 684 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read | 684 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read |
| 685 mock_quic_data.AddRead(ASYNC, 0); // EOF | 685 mock_quic_data.AddRead(ASYNC, 0); // EOF |
| 686 | 686 |
| 687 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | 687 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| 688 | 688 |
| 689 EXPECT_FALSE(rtt_observer_.rtt_notification_received()); | 689 EXPECT_FALSE(rtt_observer_.rtt_notification_received()); |
| 690 // There is no need to set up an alternate protocol job, because | 690 // There is no need to set up an alternate protocol job, because |
| 691 // no attempt will be made to speak to the proxy over TCP. | 691 // no attempt will be made to speak to the proxy over TCP. |
| 692 | 692 |
| 693 request_.url = GURL("http://mail.example.com/"); | 693 request_.url = GURL("http://mail.example.org/"); |
| 694 CreateSession(); | 694 CreateSession(); |
| 695 | 695 |
| 696 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70); | 696 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70); |
| 697 EXPECT_TRUE(rtt_observer_.rtt_notification_received()); | 697 EXPECT_TRUE(rtt_observer_.rtt_notification_received()); |
| 698 } | 698 } |
| 699 | 699 |
| 700 // Regression test for https://crbug.com/492458. Test that for an HTTP | 700 // Regression test for https://crbug.com/492458. Test that for an HTTP |
| 701 // connection through a QUIC proxy, the certificate exhibited by the proxy is | 701 // connection through a QUIC proxy, the certificate exhibited by the proxy is |
| 702 // checked against the proxy hostname, not the origin hostname. | 702 // checked against the proxy hostname, not the origin hostname. |
| 703 TEST_P(QuicNetworkTransactionTest, QuicProxyWithCert) { | 703 TEST_P(QuicNetworkTransactionTest, QuicProxyWithCert) { |
| 704 const std::string origin_host = "news.example.com"; | 704 const std::string origin_host = "mail.example.com"; |
| 705 const std::string proxy_host = "www.example.org"; | 705 const std::string proxy_host = "www.example.org"; |
| 706 | 706 |
| 707 params_.enable_quic_for_proxies = true; | 707 params_.enable_quic_for_proxies = true; |
| 708 proxy_service_ = | 708 proxy_service_ = |
| 709 ProxyService::CreateFixedFromPacResult("QUIC " + proxy_host + ":70"); | 709 ProxyService::CreateFixedFromPacResult("QUIC " + proxy_host + ":70"); |
| 710 | 710 |
| 711 maker_.set_hostname(origin_host); | 711 maker_.set_hostname(origin_host); |
| 712 MockQuicData mock_quic_data; | 712 MockQuicData mock_quic_data; |
| 713 mock_quic_data.AddWrite( | 713 mock_quic_data.AddWrite( |
| 714 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 714 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
| 715 GetRequestHeaders("GET", "http", "/"))); | 715 GetRequestHeaders("GET", "http", "/"))); |
| 716 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | 716 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 717 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); | 717 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); |
| 718 mock_quic_data.AddRead( | 718 mock_quic_data.AddRead( |
| 719 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 719 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 720 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 720 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 721 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read | 721 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read |
| 722 mock_quic_data.AddRead(ASYNC, 0); | 722 mock_quic_data.AddRead(ASYNC, 0); |
| 723 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | 723 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| 724 | 724 |
| 725 scoped_refptr<X509Certificate> cert( | 725 scoped_refptr<X509Certificate> cert( |
| 726 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem")); | 726 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem")); |
| 727 ASSERT_TRUE(cert.get()); | 727 ASSERT_TRUE(cert.get()); |
| 728 // This certificate is valid for the proxy, but not for the origin. | 728 // This certificate is valid for the proxy, but not for the origin. |
| 729 bool common_name_fallback_used; | 729 bool common_name_fallback_used; |
| 730 EXPECT_TRUE(cert->VerifyNameMatch(proxy_host, &common_name_fallback_used)); | 730 EXPECT_TRUE(cert->VerifyNameMatch(proxy_host, &common_name_fallback_used)); |
| 731 EXPECT_FALSE(cert->VerifyNameMatch(origin_host, &common_name_fallback_used)); | 731 EXPECT_FALSE(cert->VerifyNameMatch(origin_host, &common_name_fallback_used)); |
| 732 ProofVerifyDetailsChromium verify_details; | 732 ProofVerifyDetailsChromium verify_details; |
| 733 verify_details.cert_verify_result.verified_cert = cert; | 733 verify_details.cert_verify_result.verified_cert = cert; |
| 734 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | 734 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
| 735 ProofVerifyDetailsChromium verify_details2; | 735 ProofVerifyDetailsChromium verify_details2; |
| 736 verify_details2.cert_verify_result.verified_cert = cert; | 736 verify_details2.cert_verify_result.verified_cert = cert; |
| 737 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2); | 737 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2); |
| 738 | 738 |
| 739 request_.url = GURL("http://" + origin_host); | 739 request_.url = GURL("http://" + origin_host); |
| 740 AddHangingNonAlternateProtocolSocketData(); | 740 AddHangingNonAlternateProtocolSocketData(); |
| 741 CreateSessionWithNextProtos(); | 741 CreateSessionWithNextProtos(); |
| 742 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE); | 742 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE); |
| 743 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70); | 743 SendRequestAndExpectQuicResponseFromProxyOnPort("hello!", 70); |
| 744 } | 744 } |
| 745 | 745 |
| 746 TEST_P(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) { | 746 TEST_P(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) { |
| 747 params_.origin_to_force_quic_on = | 747 params_.origin_to_force_quic_on = |
| 748 HostPortPair::FromString("mail.example.com:443"); | 748 HostPortPair::FromString("mail.example.org:443"); |
| 749 | 749 |
| 750 MockQuicData mock_quic_data1; | 750 MockQuicData mock_quic_data1; |
| 751 mock_quic_data1.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED); | 751 mock_quic_data1.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED); |
| 752 | 752 |
| 753 MockQuicData mock_quic_data2; | 753 MockQuicData mock_quic_data2; |
| 754 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_); | 754 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_); |
| 755 mock_quic_data2.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED); | 755 mock_quic_data2.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED); |
| 756 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_); | 756 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_); |
| 757 | 757 |
| 758 mock_quic_data1.AddSocketDataToFactory(&socket_factory_); | 758 mock_quic_data1.AddSocketDataToFactory(&socket_factory_); |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 884 SendRequestAndExpectHttpResponse("hello world"); | 884 SendRequestAndExpectHttpResponse("hello world"); |
| 885 } | 885 } |
| 886 | 886 |
| 887 // When multiple alternative services are advertised, | 887 // When multiple alternative services are advertised, |
| 888 // HttpStreamFactoryImpl::RequestStreamInternal() should select the alternative | 888 // HttpStreamFactoryImpl::RequestStreamInternal() should select the alternative |
| 889 // service which uses existing QUIC session if available. If no existing QUIC | 889 // service which uses existing QUIC session if available. If no existing QUIC |
| 890 // session can be used, use the first alternative service from the list. | 890 // session can be used, use the first alternative service from the list. |
| 891 TEST_P(QuicNetworkTransactionTest, UseExistingAlternativeServiceForQuic) { | 891 TEST_P(QuicNetworkTransactionTest, UseExistingAlternativeServiceForQuic) { |
| 892 MockRead http_reads[] = { | 892 MockRead http_reads[] = { |
| 893 MockRead("HTTP/1.1 200 OK\r\n"), | 893 MockRead("HTTP/1.1 200 OK\r\n"), |
| 894 MockRead("Alt-Svc: quic=\"foo.example.com:443\", quic=\":444\"\r\n\r\n"), | 894 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"), |
| 895 MockRead("hello world"), | 895 MockRead("hello world"), |
| 896 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 896 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 897 MockRead(ASYNC, OK)}; | 897 MockRead(ASYNC, OK)}; |
| 898 | 898 |
| 899 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | 899 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, |
| 900 0); | 900 0); |
| 901 socket_factory_.AddSocketDataProvider(&http_data); | 901 socket_factory_.AddSocketDataProvider(&http_data); |
| 902 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | 902 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); |
| 903 | 903 |
| 904 QuicStreamOffset request_header_offset = 0; | 904 QuicStreamOffset request_header_offset = 0; |
| 905 QuicStreamOffset response_header_offset = 0; | 905 QuicStreamOffset response_header_offset = 0; |
| 906 // First QUIC request data. | 906 // First QUIC request data. |
| 907 // Open a session to foo.example.com:443 using the first entry of the | 907 // Open a session to foo.example.org:443 using the first entry of the |
| 908 // alternative service list. | 908 // alternative service list. |
| 909 MockQuicData mock_quic_data; | 909 MockQuicData mock_quic_data; |
| 910 mock_quic_data.AddWrite(ConstructRequestHeadersPacket( | 910 mock_quic_data.AddWrite(ConstructRequestHeadersPacket( |
| 911 1, kClientDataStreamId1, true, true, | 911 1, kClientDataStreamId1, true, true, |
| 912 GetRequestHeaders("GET", "https", "/"), &request_header_offset)); | 912 GetRequestHeaders("GET", "https", "/"), &request_header_offset)); |
| 913 | 913 |
| 914 std::string alt_svc_list = | 914 std::string alt_svc_list = |
| 915 "quic=\"mail.example.com:444\", quic=\"foo.example.com:443\", " | 915 "quic=\"mail.example.org:444\", quic=\"foo.example.org:443\", " |
| 916 "quic=\"bar.example.com:445\""; | 916 "quic=\"bar.example.org:445\""; |
| 917 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | 917 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 918 1, kClientDataStreamId1, false, false, | 918 1, kClientDataStreamId1, false, false, |
| 919 GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset)); | 919 GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset)); |
| 920 mock_quic_data.AddRead( | 920 mock_quic_data.AddRead( |
| 921 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 921 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 922 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 922 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 923 | 923 |
| 924 // Second QUIC request data. | 924 // Second QUIC request data. |
| 925 // Connection pooling, using existing session, no need to include version | 925 // Connection pooling, using existing session, no need to include version |
| 926 // as version negotiation has been completed. | 926 // as version negotiation has been completed. |
| (...skipping 19 matching lines...) Expand all Loading... |
| 946 SendRequestAndExpectQuicResponseOnPort("hello!", 443); | 946 SendRequestAndExpectQuicResponseOnPort("hello!", 443); |
| 947 SendRequestAndExpectQuicResponseOnPort("hello!", 443); | 947 SendRequestAndExpectQuicResponseOnPort("hello!", 443); |
| 948 } | 948 } |
| 949 | 949 |
| 950 // When multiple alternative services that has existing QUIC session. | 950 // When multiple alternative services that has existing QUIC session. |
| 951 // HttpStreamFactoryImpl::RequestStreamInternal() should select the first | 951 // HttpStreamFactoryImpl::RequestStreamInternal() should select the first |
| 952 // alternative service which uses existing QUIC session. | 952 // alternative service which uses existing QUIC session. |
| 953 TEST_P(QuicNetworkTransactionTest, UseFirstExistingAlternativeServiceForQuic) { | 953 TEST_P(QuicNetworkTransactionTest, UseFirstExistingAlternativeServiceForQuic) { |
| 954 MockRead http_reads[] = { | 954 MockRead http_reads[] = { |
| 955 MockRead("HTTP/1.1 200 OK\r\n"), | 955 MockRead("HTTP/1.1 200 OK\r\n"), |
| 956 MockRead("Alt-Svc: quic=\"foo.example.com:443\", quic=\":446\"\r\n\r\n"), | 956 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":446\"\r\n\r\n"), |
| 957 MockRead("hello world"), | 957 MockRead("hello world"), |
| 958 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 958 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 959 MockRead(ASYNC, OK)}; | 959 MockRead(ASYNC, OK)}; |
| 960 | 960 |
| 961 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | 961 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, |
| 962 0); | 962 0); |
| 963 socket_factory_.AddSocketDataProvider(&http_data); | 963 socket_factory_.AddSocketDataProvider(&http_data); |
| 964 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | 964 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); |
| 965 | 965 |
| 966 QuicStreamOffset request_header_offset = 0; | 966 QuicStreamOffset request_header_offset = 0; |
| 967 QuicStreamOffset response_header_offset = 0; | 967 QuicStreamOffset response_header_offset = 0; |
| 968 | 968 |
| 969 QuicTestPacketMaker maker(GetParam(), 0, clock_, kDefaultServerHostName); | 969 QuicTestPacketMaker maker(GetParam(), 0, clock_, kDefaultServerHostName); |
| 970 | 970 |
| 971 MockQuicData mock_quic_data; | 971 MockQuicData mock_quic_data; |
| 972 MockQuicData mock_quic_data2; | 972 MockQuicData mock_quic_data2; |
| 973 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_); | 973 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_); |
| 974 // First QUIC request data. | 974 // First QUIC request data. |
| 975 // Open a QUIC session to foo.example.com:443. | 975 // Open a QUIC session to foo.example.org:443. |
| 976 mock_quic_data.AddWrite(ConstructRequestHeadersPacket( | 976 mock_quic_data.AddWrite(ConstructRequestHeadersPacket( |
| 977 1, kClientDataStreamId1, true, true, | 977 1, kClientDataStreamId1, true, true, |
| 978 GetRequestHeaders("GET", "https", "/"), &request_header_offset)); | 978 GetRequestHeaders("GET", "https", "/"), &request_header_offset)); |
| 979 | 979 |
| 980 std::string alt_svc_list = | 980 std::string alt_svc_list = |
| 981 "quic=\"bar.example.com:444\", quic=\"frog.example.com:445\", " | 981 "quic=\"bar.example.org:444\", quic=\"frog.example.org:445\", " |
| 982 "quic=\"mail.example.com:446\""; | 982 "quic=\"mail.example.org:446\""; |
| 983 // Response header from the server resets the alt_svc list for the origin. | 983 // Response header from the server resets the alt_svc list for the origin. |
| 984 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | 984 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 985 1, kClientDataStreamId1, false, false, | 985 1, kClientDataStreamId1, false, false, |
| 986 GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset)); | 986 GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset)); |
| 987 mock_quic_data.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false, | 987 mock_quic_data.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false, |
| 988 true, 0, "hello from foo!")); | 988 true, 0, "hello from foo!")); |
| 989 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 989 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 990 | 990 |
| 991 // Second QUIC request data. | 991 // Second QUIC request data. |
| 992 // Existing QUIC session to foo.example.com is not viable from the updated | 992 // Existing QUIC session to foo.example.org is not viable from the updated |
| 993 // alt_svc. Unable to pool the existing QUIC session. | 993 // alt_svc. Unable to pool the existing QUIC session. |
| 994 // Open a new QUIC session to bar.example.com:443. | 994 // Open a new QUIC session to bar.example.org:443. |
| 995 mock_quic_data2.AddWrite(ConstructRequestHeadersPacket( | 995 mock_quic_data2.AddWrite(ConstructRequestHeadersPacket( |
| 996 1, kClientDataStreamId1, true, true, | 996 1, kClientDataStreamId1, true, true, |
| 997 GetRequestHeaders("GET", "https", "/"), &maker)); | 997 GetRequestHeaders("GET", "https", "/"), &maker)); |
| 998 alt_svc_list = | 998 alt_svc_list = |
| 999 "quic=\"foo.example.com:443\", quic=\"mail.example.com:446\", " | 999 "quic=\"foo.example.org:443\", quic=\"mail.example.org:446\", " |
| 1000 "quic=\"bar.example.com:444\""; | 1000 "quic=\"bar.example.org:444\""; |
| 1001 // Response header from the server resets the alt_svc list for the origin. | 1001 // Response header from the server resets the alt_svc list for the origin. |
| 1002 mock_quic_data2.AddRead(ConstructResponseHeadersPacket( | 1002 mock_quic_data2.AddRead(ConstructResponseHeadersPacket( |
| 1003 1, kClientDataStreamId1, false, false, | 1003 1, kClientDataStreamId1, false, false, |
| 1004 GetResponseHeaders("200 OK", alt_svc_list), &maker)); | 1004 GetResponseHeaders("200 OK", alt_svc_list), &maker)); |
| 1005 mock_quic_data2.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false, | 1005 mock_quic_data2.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false, |
| 1006 true, 0, "hello from bar!")); | 1006 true, 0, "hello from bar!")); |
| 1007 mock_quic_data2.AddWrite(ConstructAckPacket(2, 1, &maker)); | 1007 mock_quic_data2.AddWrite(ConstructAckPacket(2, 1, &maker)); |
| 1008 mock_quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read | 1008 mock_quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read |
| 1009 mock_quic_data2.AddRead(ASYNC, 0); // EOF | 1009 mock_quic_data2.AddRead(ASYNC, 0); // EOF |
| 1010 | 1010 |
| 1011 // Third QUIC request data. | 1011 // Third QUIC request data. |
| 1012 // Connection pooling, using the first existing session to foo.example.com | 1012 // Connection pooling, using the first existing session to foo.example.org |
| 1013 mock_quic_data.AddWrite(ConstructRequestHeadersPacket( | 1013 mock_quic_data.AddWrite(ConstructRequestHeadersPacket( |
| 1014 3, kClientDataStreamId2, false, true, | 1014 3, kClientDataStreamId2, false, true, |
| 1015 GetRequestHeaders("GET", "https", "/"), &request_header_offset)); | 1015 GetRequestHeaders("GET", "https", "/"), &request_header_offset)); |
| 1016 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | 1016 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 1017 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"), | 1017 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"), |
| 1018 &response_header_offset)); | 1018 &response_header_offset)); |
| 1019 mock_quic_data.AddRead(ConstructDataPacket(4, kClientDataStreamId2, false, | 1019 mock_quic_data.AddRead(ConstructDataPacket(4, kClientDataStreamId2, false, |
| 1020 true, 0, "hello from foo!")); | 1020 true, 0, "hello from foo!")); |
| 1021 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1)); | 1021 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1)); |
| 1022 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read | 1022 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1036 SendRequestAndExpectQuicResponseOnPort("hello from bar!", 444); | 1036 SendRequestAndExpectQuicResponseOnPort("hello from bar!", 444); |
| 1037 SendRequestAndExpectQuicResponseOnPort("hello from foo!", 443); | 1037 SendRequestAndExpectQuicResponseOnPort("hello from foo!", 443); |
| 1038 } | 1038 } |
| 1039 | 1039 |
| 1040 // Multiple origins have listed the same alternative services. When there's a | 1040 // Multiple origins have listed the same alternative services. When there's a |
| 1041 // existing QUIC session opened by a request to other origin, | 1041 // existing QUIC session opened by a request to other origin, |
| 1042 // if the cert is valid, should select this QUIC session to make the request | 1042 // if the cert is valid, should select this QUIC session to make the request |
| 1043 // if this is also the first existing QUIC session. | 1043 // if this is also the first existing QUIC session. |
| 1044 TEST_P(QuicNetworkTransactionTest, | 1044 TEST_P(QuicNetworkTransactionTest, |
| 1045 UseSharedExistingAlternativeServiceForQuicWithValidCert) { | 1045 UseSharedExistingAlternativeServiceForQuicWithValidCert) { |
| 1046 // Default cert is valid for the following origins: | 1046 // Default cert is valid for *.example.org |
| 1047 // mail.example.com, mail.example.org, and www.example.org. | |
| 1048 | 1047 |
| 1049 // HTTP data for request to mail.example.com. | 1048 // HTTP data for request to www.example.org. |
| 1050 MockRead http_reads[] = { | 1049 MockRead http_reads[] = { |
| 1051 MockRead("HTTP/1.1 200 OK\r\n"), | 1050 MockRead("HTTP/1.1 200 OK\r\n"), |
| 1052 MockRead("Alt-Svc: quic=\":443\"\r\n\r\n"), | 1051 MockRead("Alt-Svc: quic=\":443\"\r\n\r\n"), |
| 1053 MockRead("hello world from mail.example.com"), | 1052 MockRead("hello world from www.example.org"), |
| 1054 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 1053 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 1055 MockRead(ASYNC, OK)}; | 1054 MockRead(ASYNC, OK)}; |
| 1056 | 1055 |
| 1057 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | 1056 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, |
| 1058 0); | 1057 0); |
| 1059 socket_factory_.AddSocketDataProvider(&http_data); | 1058 socket_factory_.AddSocketDataProvider(&http_data); |
| 1060 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | 1059 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); |
| 1061 | 1060 |
| 1062 // HTTP data for request to mail.example.org. | 1061 // HTTP data for request to mail.example.org. |
| 1063 MockRead http_reads2[] = { | 1062 MockRead http_reads2[] = { |
| 1064 MockRead("HTTP/1.1 200 OK\r\n"), | 1063 MockRead("HTTP/1.1 200 OK\r\n"), |
| 1065 MockRead("Alt-Svc: quic=\":444\", quic=\"mail.example.com:443\"\r\n\r\n"), | 1064 MockRead("Alt-Svc: quic=\":444\", quic=\"www.example.org:443\"\r\n\r\n"), |
| 1066 MockRead("hello world from mail.example.org"), | 1065 MockRead("hello world from mail.example.org"), |
| 1067 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 1066 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 1068 MockRead(ASYNC, OK)}; | 1067 MockRead(ASYNC, OK)}; |
| 1069 | 1068 |
| 1070 StaticSocketDataProvider http_data2(http_reads2, arraysize(http_reads2), | 1069 StaticSocketDataProvider http_data2(http_reads2, arraysize(http_reads2), |
| 1071 nullptr, 0); | 1070 nullptr, 0); |
| 1072 socket_factory_.AddSocketDataProvider(&http_data2); | 1071 socket_factory_.AddSocketDataProvider(&http_data2); |
| 1073 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | 1072 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); |
| 1074 | 1073 |
| 1075 QuicStreamOffset request_header_offset = 0; | 1074 QuicStreamOffset request_header_offset = 0; |
| 1076 QuicStreamOffset response_header_offset = 0; | 1075 QuicStreamOffset response_header_offset = 0; |
| 1077 | 1076 |
| 1078 QuicTestPacketMaker maker(GetParam(), 0, clock_, kDefaultServerHostName); | 1077 QuicTestPacketMaker maker(GetParam(), 0, clock_, "mail.example.org"); |
| 1079 maker.set_hostname("mail.example.org"); | 1078 maker_.set_hostname("www.example.org"); |
| 1080 MockQuicData mock_quic_data; | 1079 MockQuicData mock_quic_data; |
| 1081 | 1080 |
| 1082 // First QUIC request data. | 1081 // First QUIC request data. |
| 1083 mock_quic_data.AddWrite(ConstructRequestHeadersPacket( | 1082 mock_quic_data.AddWrite(ConstructRequestHeadersPacket( |
| 1084 1, kClientDataStreamId1, true, true, | 1083 1, kClientDataStreamId1, true, true, |
| 1085 GetRequestHeaders("GET", "https", "/"), &request_header_offset)); | 1084 GetRequestHeaders("GET", "https", "/"), &request_header_offset)); |
| 1086 | 1085 |
| 1087 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | 1086 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 1088 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"), | 1087 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"), |
| 1089 &response_header_offset)); | 1088 &response_header_offset)); |
| 1090 mock_quic_data.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false, | 1089 mock_quic_data.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false, |
| 1091 true, 0, "hello from mail QUIC!")); | 1090 true, 0, "hello from mail QUIC!")); |
| 1092 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 1091 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 1093 | |
| 1094 // Second QUIC request data. | 1092 // Second QUIC request data. |
| 1095 mock_quic_data.AddWrite(ConstructRequestHeadersPacket( | 1093 mock_quic_data.AddWrite(ConstructRequestHeadersPacket( |
| 1096 3, kClientDataStreamId2, false, true, | 1094 3, kClientDataStreamId2, false, true, |
| 1097 GetRequestHeaders("GET", "https", "/", maker), &request_header_offset, | 1095 GetRequestHeaders("GET", "https", "/", maker), &request_header_offset, |
| 1098 &maker)); | 1096 &maker)); |
| 1099 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | 1097 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 1100 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"), | 1098 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"), |
| 1101 &response_header_offset)); | 1099 &response_header_offset)); |
| 1102 mock_quic_data.AddRead(ConstructDataPacket(4, kClientDataStreamId2, false, | 1100 mock_quic_data.AddRead(ConstructDataPacket(4, kClientDataStreamId2, false, |
| 1103 true, 0, "hello from mail QUIC!")); | 1101 true, 0, "hello from mail QUIC!")); |
| 1104 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1)); | 1102 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1)); |
| 1105 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read | 1103 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read |
| 1106 mock_quic_data.AddRead(ASYNC, 0); // EOF | 1104 mock_quic_data.AddRead(ASYNC, 0); // EOF |
| 1107 | 1105 |
| 1108 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | 1106 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| 1109 AddHangingNonAlternateProtocolSocketData(); | 1107 AddHangingNonAlternateProtocolSocketData(); |
| 1110 | 1108 |
| 1111 CreateSessionWithNextProtos(); | 1109 CreateSessionWithNextProtos(); |
| 1112 | 1110 |
| 1113 // Send two HTTP requests, responses set up alt-svc lists for the origins. | 1111 // Send two HTTP requests, responses set up alt-svc lists for the origins. |
| 1114 SendRequestAndExpectHttpResponse("hello world from mail.example.com"); | 1112 request_.url = GURL("https://www.example.org/"); |
| 1113 SendRequestAndExpectHttpResponse("hello world from www.example.org"); |
| 1115 request_.url = GURL("https://mail.example.org/"); | 1114 request_.url = GURL("https://mail.example.org/"); |
| 1116 SendRequestAndExpectHttpResponse("hello world from mail.example.org"); | 1115 SendRequestAndExpectHttpResponse("hello world from mail.example.org"); |
| 1117 | 1116 |
| 1118 // Open a QUIC session to mail.example.com:443 when making request | 1117 // Open a QUIC session to mail.example.org:443 when making request |
| 1119 // to mail.example.com. | 1118 // to mail.example.org. |
| 1120 request_.url = GURL("https://mail.example.com/"); | 1119 request_.url = GURL("https://www.example.org/"); |
| 1121 SendRequestAndExpectQuicResponseOnPort("hello from mail QUIC!", 443); | 1120 SendRequestAndExpectQuicResponseOnPort("hello from mail QUIC!", 443); |
| 1122 | 1121 |
| 1123 // Uses the existing QUIC session when making request to mail.example.org. | 1122 // Uses the existing QUIC session when making request to www.example.org. |
| 1124 request_.url = GURL("https://mail.example.org/"); | 1123 request_.url = GURL("https://mail.example.org/"); |
| 1125 SendRequestAndExpectQuicResponseOnPort("hello from mail QUIC!", 443); | 1124 SendRequestAndExpectQuicResponseOnPort("hello from mail QUIC!", 443); |
| 1126 } | 1125 } |
| 1127 | 1126 |
| 1128 // Multiple origins have listed the same alternative services. When there's a | 1127 // Multiple origins have listed the same alternative services. When there's a |
| 1129 // existing QUIC session opened by a request to other origin, | 1128 // existing QUIC session opened by a request to other origin, |
| 1130 // if the cert is NOT valid, should ignore this QUIC session. | 1129 // if the cert is NOT valid, should ignore this QUIC session. |
| 1131 TEST_P(QuicNetworkTransactionTest, | 1130 TEST_P(QuicNetworkTransactionTest, |
| 1132 DoNotUseSharedExistingAlternativeServiceForQuicWithInvalidCert) { | 1131 DoNotUseSharedExistingAlternativeServiceForQuicWithInvalidCert) { |
| 1133 // Default cert is only valid for the following origins: | 1132 // Default cert is valid *.example.org |
| 1134 // mail.example.com, mail.example.org, and www.example.org. | 1133 // NOT valid for mail.example.com. |
| 1135 // NOT valid for docs.example.org. | |
| 1136 | 1134 |
| 1137 // HTTP data for request to mail.example.com. | 1135 // HTTP data for request to mail.example.org. |
| 1138 MockRead http_reads[] = { | 1136 MockRead http_reads[] = { |
| 1139 MockRead("HTTP/1.1 200 OK\r\n"), | 1137 MockRead("HTTP/1.1 200 OK\r\n"), |
| 1140 MockRead("Alt-Svc: quic=\":443\"\r\n\r\n"), | 1138 MockRead("Alt-Svc: quic=\":443\"\r\n\r\n"), |
| 1141 MockRead("hello world from mail.example.com"), | 1139 MockRead("hello world from mail.example.org"), |
| 1142 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 1140 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 1143 MockRead(ASYNC, OK)}; | 1141 MockRead(ASYNC, OK)}; |
| 1144 | 1142 |
| 1145 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | 1143 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, |
| 1146 0); | 1144 0); |
| 1147 socket_factory_.AddSocketDataProvider(&http_data); | 1145 socket_factory_.AddSocketDataProvider(&http_data); |
| 1148 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | 1146 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); |
| 1149 | 1147 |
| 1150 // HTTP data for request to docs.example.org. | 1148 // HTTP data for request to mail.example.com. |
| 1151 MockRead http_reads2[] = { | 1149 MockRead http_reads2[] = { |
| 1152 MockRead("HTTP/1.1 200 OK\r\n"), | 1150 MockRead("HTTP/1.1 200 OK\r\n"), |
| 1153 MockRead("Alt-Svc: quic=\":444\", quic=\"mail.example.com:443\"\r\n\r\n"), | 1151 MockRead("Alt-Svc: quic=\":444\", quic=\"mail.example.org:443\"\r\n\r\n"), |
| 1154 MockRead("hello world from docs.example.org"), | 1152 MockRead("hello world from mail.example.com"), |
| 1155 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 1153 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 1156 MockRead(ASYNC, OK)}; | 1154 MockRead(ASYNC, OK)}; |
| 1157 | 1155 |
| 1158 StaticSocketDataProvider http_data2(http_reads2, arraysize(http_reads2), | 1156 StaticSocketDataProvider http_data2(http_reads2, arraysize(http_reads2), |
| 1159 nullptr, 0); | 1157 nullptr, 0); |
| 1160 socket_factory_.AddSocketDataProvider(&http_data2); | 1158 socket_factory_.AddSocketDataProvider(&http_data2); |
| 1161 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | 1159 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); |
| 1162 | 1160 |
| 1163 QuicTestPacketMaker maker(GetParam(), 0, clock_, kDefaultServerHostName); | 1161 QuicTestPacketMaker maker(GetParam(), 0, clock_, "mail.example.org"); |
| 1164 maker.set_hostname("docs.example.org"); | 1162 maker.set_hostname("mail.example.com"); |
| 1165 MockQuicData mock_quic_data; | 1163 MockQuicData mock_quic_data; |
| 1166 MockQuicData mock_quic_data2; | 1164 MockQuicData mock_quic_data2; |
| 1167 | 1165 |
| 1168 // Adding a valid cert for *.example.org but not mail.example.com. | 1166 // Adding a valid cert for *.example.org but not mail.example.com. |
| 1169 ProofVerifyDetailsChromium verify_details; | 1167 ProofVerifyDetailsChromium verify_details; |
| 1170 scoped_refptr<X509Certificate> cert( | 1168 scoped_refptr<X509Certificate> cert( |
| 1171 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem")); | 1169 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem")); |
| 1172 verify_details.cert_verify_result.verified_cert = cert; | 1170 verify_details.cert_verify_result.verified_cert = cert; |
| 1173 verify_details.cert_verify_result.is_issued_by_known_root = true; | 1171 verify_details.cert_verify_result.is_issued_by_known_root = true; |
| 1174 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | 1172 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
| 1175 | 1173 |
| 1176 // First QUIC request data. | 1174 // First QUIC request data. |
| 1177 mock_quic_data.AddWrite( | 1175 mock_quic_data.AddWrite( |
| 1178 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 1176 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
| 1179 GetRequestHeaders("GET", "https", "/"))); | 1177 GetRequestHeaders("GET", "https", "/"))); |
| 1180 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | 1178 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 1181 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); | 1179 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1200 | 1198 |
| 1201 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | 1199 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| 1202 AddHangingNonAlternateProtocolSocketData(); | 1200 AddHangingNonAlternateProtocolSocketData(); |
| 1203 | 1201 |
| 1204 mock_quic_data2.AddSocketDataToFactory(&socket_factory_); | 1202 mock_quic_data2.AddSocketDataToFactory(&socket_factory_); |
| 1205 AddHangingNonAlternateProtocolSocketData(); | 1203 AddHangingNonAlternateProtocolSocketData(); |
| 1206 | 1204 |
| 1207 CreateSessionWithNextProtos(); | 1205 CreateSessionWithNextProtos(); |
| 1208 | 1206 |
| 1209 // Send HTTP requests, responses set up the alt-svc lists for the origins. | 1207 // Send HTTP requests, responses set up the alt-svc lists for the origins. |
| 1208 SendRequestAndExpectHttpResponse("hello world from mail.example.org"); |
| 1209 request_.url = GURL("https://mail.example.com/"); |
| 1210 SendRequestAndExpectHttpResponse("hello world from mail.example.com"); | 1210 SendRequestAndExpectHttpResponse("hello world from mail.example.com"); |
| 1211 request_.url = GURL("https://docs.example.org/"); | |
| 1212 SendRequestAndExpectHttpResponse("hello world from docs.example.org"); | |
| 1213 | 1211 |
| 1214 // Open a QUIC session to mail.example.com:443 when making request | 1212 // Open a QUIC session to mail.example.org:443 when making request |
| 1215 // to mail.example.com. | 1213 // to mail.example.org. |
| 1216 request_.url = GURL("https://mail.example.com/"); | 1214 request_.url = GURL("https://mail.example.org/"); |
| 1217 SendRequestAndExpectQuicResponseOnPort("hello from mail QUIC!", 443); | 1215 SendRequestAndExpectQuicResponseOnPort("hello from mail QUIC!", 443); |
| 1218 | 1216 |
| 1219 // Open another new QUIC session to docs.example.org:444. | 1217 // Open another new QUIC session to mail.example.com:444. |
| 1220 request_.url = GURL("https://docs.example.org/"); | 1218 request_.url = GURL("https://mail.example.com/"); |
| 1221 SendRequestAndExpectQuicResponseOnPort("hello from docs QUIC!", 444); | 1219 SendRequestAndExpectQuicResponseOnPort("hello from docs QUIC!", 444); |
| 1222 } | 1220 } |
| 1223 | 1221 |
| 1224 TEST_P(QuicNetworkTransactionTest, AlternativeServiceDifferentPort) { | 1222 TEST_P(QuicNetworkTransactionTest, AlternativeServiceDifferentPort) { |
| 1225 MockRead http_reads[] = { | 1223 MockRead http_reads[] = { |
| 1226 MockRead("HTTP/1.1 200 OK\r\n"), | 1224 MockRead("HTTP/1.1 200 OK\r\n"), |
| 1227 MockRead(kQuicAlternativeServiceDifferentPortHeader), | 1225 MockRead(kQuicAlternativeServiceDifferentPortHeader), |
| 1228 MockRead("hello world"), | 1226 MockRead("hello world"), |
| 1229 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 1227 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 1230 MockRead(ASYNC, OK)}; | 1228 MockRead(ASYNC, OK)}; |
| (...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1643 CreateSessionWithNextProtos(); | 1641 CreateSessionWithNextProtos(); |
| 1644 | 1642 |
| 1645 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo(). | 1643 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo(). |
| 1646 SendRequestAndExpectHttpResponse("hello world"); | 1644 SendRequestAndExpectHttpResponse("hello world"); |
| 1647 } | 1645 } |
| 1648 | 1646 |
| 1649 class QuicAltSvcCertificateVerificationTest | 1647 class QuicAltSvcCertificateVerificationTest |
| 1650 : public QuicNetworkTransactionTest { | 1648 : public QuicNetworkTransactionTest { |
| 1651 public: | 1649 public: |
| 1652 void Run(bool valid) { | 1650 void Run(bool valid) { |
| 1653 HostPortPair origin(valid ? "mail.example.org" : "invalid.example.org", | 1651 HostPortPair origin(valid ? "mail.example.org" : "mail.example.com", 443); |
| 1654 443); | |
| 1655 HostPortPair alternative("www.example.org", 443); | 1652 HostPortPair alternative("www.example.org", 443); |
| 1656 std::string url("https://"); | 1653 std::string url("https://"); |
| 1657 url.append(origin.host()); | 1654 url.append(origin.host()); |
| 1658 url.append(":443"); | 1655 url.append(":443"); |
| 1659 request_.url = GURL(url); | 1656 request_.url = GURL(url); |
| 1660 | 1657 |
| 1661 maker_.set_hostname(origin.host()); | 1658 maker_.set_hostname(origin.host()); |
| 1662 MockQuicData mock_quic_data; | 1659 MockQuicData mock_quic_data; |
| 1663 mock_quic_data.AddWrite( | 1660 mock_quic_data.AddWrite( |
| 1664 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 1661 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
| 1665 GetRequestHeaders("GET", "https", "/"))); | 1662 GetRequestHeaders("GET", "https", "/"))); |
| 1666 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | 1663 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 1667 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); | 1664 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); |
| 1668 mock_quic_data.AddRead( | 1665 mock_quic_data.AddRead( |
| 1669 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 1666 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 1670 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 1667 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 1671 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); | 1668 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); |
| 1672 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | 1669 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| 1673 | 1670 |
| 1674 scoped_refptr<X509Certificate> cert( | 1671 scoped_refptr<X509Certificate> cert( |
| 1675 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem")); | 1672 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem")); |
| 1676 ASSERT_TRUE(cert.get()); | 1673 ASSERT_TRUE(cert.get()); |
| 1677 bool common_name_fallback_used; | 1674 bool common_name_fallback_used; |
| 1678 EXPECT_EQ(valid, | 1675 EXPECT_EQ(valid, |
| 1679 cert->VerifyNameMatch(origin.host(), &common_name_fallback_used)); | 1676 cert->VerifyNameMatch(origin.host(), &common_name_fallback_used)); |
| 1680 EXPECT_TRUE( | 1677 EXPECT_TRUE( |
| 1681 cert->VerifyNameMatch(alternative.host(), &common_name_fallback_used)); | 1678 cert->VerifyNameMatch(alternative.host(), &common_name_fallback_used)); |
| 1682 ProofVerifyDetailsChromium verify_details; | 1679 ProofVerifyDetailsChromium verify_details; |
| 1683 verify_details.cert_verify_result.verified_cert = cert; | 1680 verify_details.cert_verify_result.verified_cert = cert; |
| 1684 verify_details.cert_verify_result.is_issued_by_known_root = true; | 1681 verify_details.cert_verify_result.is_issued_by_known_root = true; |
| 1685 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | 1682 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1728 RequestFailsWithInvalidCertificate) { | 1725 RequestFailsWithInvalidCertificate) { |
| 1729 Run(false); | 1726 Run(false); |
| 1730 } | 1727 } |
| 1731 | 1728 |
| 1732 TEST_P(QuicNetworkTransactionTest, HungAlternateProtocol) { | 1729 TEST_P(QuicNetworkTransactionTest, HungAlternateProtocol) { |
| 1733 crypto_client_stream_factory_.set_handshake_mode( | 1730 crypto_client_stream_factory_.set_handshake_mode( |
| 1734 MockCryptoClientStream::COLD_START); | 1731 MockCryptoClientStream::COLD_START); |
| 1735 | 1732 |
| 1736 MockWrite http_writes[] = { | 1733 MockWrite http_writes[] = { |
| 1737 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"), | 1734 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"), |
| 1738 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.com\r\n"), | 1735 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.org\r\n"), |
| 1739 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n")}; | 1736 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n")}; |
| 1740 | 1737 |
| 1741 MockRead http_reads[] = { | 1738 MockRead http_reads[] = { |
| 1742 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"), | 1739 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"), |
| 1743 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHeader), | 1740 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHeader), |
| 1744 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)}; | 1741 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)}; |
| 1745 | 1742 |
| 1746 MockClientSocketFactory socket_factory; | 1743 MockClientSocketFactory socket_factory; |
| 1747 | 1744 |
| 1748 SequencedSocketData http_data(http_reads, arraysize(http_reads), http_writes, | 1745 SequencedSocketData http_data(http_reads, arraysize(http_reads), http_writes, |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1817 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 1814 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 1818 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 1815 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 1819 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read | 1816 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read |
| 1820 mock_quic_data.AddRead(ASYNC, 0); // EOF | 1817 mock_quic_data.AddRead(ASYNC, 0); // EOF |
| 1821 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | 1818 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| 1822 | 1819 |
| 1823 // In order for a new QUIC session to be established via alternate-protocol | 1820 // In order for a new QUIC session to be established via alternate-protocol |
| 1824 // without racing an HTTP connection, we need the host resolution to happen | 1821 // without racing an HTTP connection, we need the host resolution to happen |
| 1825 // synchronously. | 1822 // synchronously. |
| 1826 host_resolver_.set_synchronous_mode(true); | 1823 host_resolver_.set_synchronous_mode(true); |
| 1827 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1", | 1824 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1", |
| 1828 ""); | 1825 ""); |
| 1829 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443)); | 1826 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443)); |
| 1830 AddressList address; | 1827 AddressList address; |
| 1831 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(), | 1828 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(), |
| 1832 nullptr, net_log_.bound()); | 1829 nullptr, net_log_.bound()); |
| 1833 | 1830 |
| 1834 CreateSessionWithNextProtos(); | 1831 CreateSessionWithNextProtos(); |
| 1835 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 1832 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
| 1836 SendRequestAndExpectQuicResponse("hello!"); | 1833 SendRequestAndExpectQuicResponse("hello!"); |
| 1837 } | 1834 } |
| 1838 | 1835 |
| 1839 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithProxy) { | 1836 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithProxy) { |
| 1840 proxy_service_ = ProxyService::CreateFixedFromPacResult("PROXY myproxy:70"); | 1837 proxy_service_ = ProxyService::CreateFixedFromPacResult("PROXY myproxy:70"); |
| 1841 | 1838 |
| 1842 // Since we are using a proxy, the QUIC job will not succeed. | 1839 // Since we are using a proxy, the QUIC job will not succeed. |
| 1843 MockWrite http_writes[] = { | 1840 MockWrite http_writes[] = { |
| 1844 MockWrite(SYNCHRONOUS, 0, "GET http://mail.example.com/ HTTP/1.1\r\n"), | 1841 MockWrite(SYNCHRONOUS, 0, "GET http://mail.example.org/ HTTP/1.1\r\n"), |
| 1845 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.com\r\n"), | 1842 MockWrite(SYNCHRONOUS, 1, "Host: mail.example.org\r\n"), |
| 1846 MockWrite(SYNCHRONOUS, 2, "Proxy-Connection: keep-alive\r\n\r\n")}; | 1843 MockWrite(SYNCHRONOUS, 2, "Proxy-Connection: keep-alive\r\n\r\n")}; |
| 1847 | 1844 |
| 1848 MockRead http_reads[] = { | 1845 MockRead http_reads[] = { |
| 1849 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"), | 1846 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"), |
| 1850 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHeader), | 1847 MockRead(SYNCHRONOUS, 4, kQuicAlternateProtocolHeader), |
| 1851 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)}; | 1848 MockRead(SYNCHRONOUS, 5, "hello world"), MockRead(SYNCHRONOUS, OK, 6)}; |
| 1852 | 1849 |
| 1853 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 1850 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 1854 http_writes, arraysize(http_writes)); | 1851 http_writes, arraysize(http_writes)); |
| 1855 socket_factory_.AddSocketDataProvider(&http_data); | 1852 socket_factory_.AddSocketDataProvider(&http_data); |
| 1856 | 1853 |
| 1857 // In order for a new QUIC session to be established via alternate-protocol | 1854 // In order for a new QUIC session to be established via alternate-protocol |
| 1858 // without racing an HTTP connection, we need the host resolution to happen | 1855 // without racing an HTTP connection, we need the host resolution to happen |
| 1859 // synchronously. | 1856 // synchronously. |
| 1860 host_resolver_.set_synchronous_mode(true); | 1857 host_resolver_.set_synchronous_mode(true); |
| 1861 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1", | 1858 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1", |
| 1862 ""); | 1859 ""); |
| 1863 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443)); | 1860 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443)); |
| 1864 AddressList address; | 1861 AddressList address; |
| 1865 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(), | 1862 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(), |
| 1866 nullptr, net_log_.bound()); | 1863 nullptr, net_log_.bound()); |
| 1867 | 1864 |
| 1868 request_.url = GURL("http://mail.example.com/"); | 1865 request_.url = GURL("http://mail.example.org/"); |
| 1869 CreateSessionWithNextProtos(); | 1866 CreateSessionWithNextProtos(); |
| 1870 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 1867 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
| 1871 SendRequestAndExpectHttpResponse("hello world"); | 1868 SendRequestAndExpectHttpResponse("hello world"); |
| 1872 } | 1869 } |
| 1873 | 1870 |
| 1874 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) { | 1871 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) { |
| 1875 MockQuicData mock_quic_data; | 1872 MockQuicData mock_quic_data; |
| 1876 mock_quic_data.AddWrite( | 1873 mock_quic_data.AddWrite( |
| 1877 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 1874 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
| 1878 GetRequestHeaders("GET", "https", "/"))); | 1875 GetRequestHeaders("GET", "https", "/"))); |
| 1879 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | 1876 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 1880 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); | 1877 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); |
| 1881 mock_quic_data.AddRead( | 1878 mock_quic_data.AddRead( |
| 1882 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 1879 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 1883 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 1880 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 1884 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read | 1881 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read |
| 1885 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | 1882 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| 1886 | 1883 |
| 1887 // The non-alternate protocol job needs to hang in order to guarantee that | 1884 // The non-alternate protocol job needs to hang in order to guarantee that |
| 1888 // the alternate-protocol job will "win". | 1885 // the alternate-protocol job will "win". |
| 1889 AddHangingNonAlternateProtocolSocketData(); | 1886 AddHangingNonAlternateProtocolSocketData(); |
| 1890 | 1887 |
| 1891 // In order for a new QUIC session to be established via alternate-protocol | 1888 // In order for a new QUIC session to be established via alternate-protocol |
| 1892 // without racing an HTTP connection, we need the host resolution to happen | 1889 // without racing an HTTP connection, we need the host resolution to happen |
| 1893 // synchronously. Of course, even though QUIC *could* perform a 0-RTT | 1890 // synchronously. Of course, even though QUIC *could* perform a 0-RTT |
| 1894 // connection to the the server, in this test we require confirmation | 1891 // connection to the the server, in this test we require confirmation |
| 1895 // before encrypting so the HTTP job will still start. | 1892 // before encrypting so the HTTP job will still start. |
| 1896 host_resolver_.set_synchronous_mode(true); | 1893 host_resolver_.set_synchronous_mode(true); |
| 1897 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1", | 1894 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1", |
| 1898 ""); | 1895 ""); |
| 1899 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443)); | 1896 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443)); |
| 1900 AddressList address; | 1897 AddressList address; |
| 1901 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(), | 1898 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(), |
| 1902 nullptr, net_log_.bound()); | 1899 nullptr, net_log_.bound()); |
| 1903 | 1900 |
| 1904 CreateSessionWithNextProtos(); | 1901 CreateSessionWithNextProtos(); |
| 1905 session_->quic_stream_factory()->set_require_confirmation(true); | 1902 session_->quic_stream_factory()->set_require_confirmation(true); |
| 1906 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 1903 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
| 1907 | 1904 |
| 1908 scoped_ptr<HttpNetworkTransaction> trans( | 1905 scoped_ptr<HttpNetworkTransaction> trans( |
| 1909 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); | 1906 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1933 // The non-alternate protocol job needs to hang in order to guarantee that | 1930 // The non-alternate protocol job needs to hang in order to guarantee that |
| 1934 // the alternate-protocol job will "win". | 1931 // the alternate-protocol job will "win". |
| 1935 AddHangingNonAlternateProtocolSocketData(); | 1932 AddHangingNonAlternateProtocolSocketData(); |
| 1936 | 1933 |
| 1937 // In order for a new QUIC session to be established via alternate-protocol | 1934 // In order for a new QUIC session to be established via alternate-protocol |
| 1938 // without racing an HTTP connection, we need the host resolution to happen | 1935 // without racing an HTTP connection, we need the host resolution to happen |
| 1939 // synchronously. Of course, even though QUIC *could* perform a 0-RTT | 1936 // synchronously. Of course, even though QUIC *could* perform a 0-RTT |
| 1940 // connection to the the server, in this test we require confirmation | 1937 // connection to the the server, in this test we require confirmation |
| 1941 // before encrypting so the HTTP job will still start. | 1938 // before encrypting so the HTTP job will still start. |
| 1942 host_resolver_.set_synchronous_mode(true); | 1939 host_resolver_.set_synchronous_mode(true); |
| 1943 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1", | 1940 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1", |
| 1944 ""); | 1941 ""); |
| 1945 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443)); | 1942 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443)); |
| 1946 AddressList address; | 1943 AddressList address; |
| 1947 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(), | 1944 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(), |
| 1948 nullptr, net_log_.bound()); | 1945 nullptr, net_log_.bound()); |
| 1949 | 1946 |
| 1950 CreateSessionWithNextProtos(); | 1947 CreateSessionWithNextProtos(); |
| 1951 session_->quic_stream_factory()->set_require_confirmation(true); | 1948 session_->quic_stream_factory()->set_require_confirmation(true); |
| 1952 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 1949 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
| 1953 | 1950 |
| 1954 scoped_ptr<HttpNetworkTransaction> trans( | 1951 scoped_ptr<HttpNetworkTransaction> trans( |
| 1955 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); | 1952 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1988 // The non-alternate protocol job needs to hang in order to guarantee that | 1985 // The non-alternate protocol job needs to hang in order to guarantee that |
| 1989 // the alternate-protocol job will "win". | 1986 // the alternate-protocol job will "win". |
| 1990 AddHangingNonAlternateProtocolSocketData(); | 1987 AddHangingNonAlternateProtocolSocketData(); |
| 1991 | 1988 |
| 1992 // In order for a new QUIC session to be established via alternate-protocol | 1989 // In order for a new QUIC session to be established via alternate-protocol |
| 1993 // without racing an HTTP connection, we need the host resolution to happen | 1990 // without racing an HTTP connection, we need the host resolution to happen |
| 1994 // synchronously. Of course, even though QUIC *could* perform a 0-RTT | 1991 // synchronously. Of course, even though QUIC *could* perform a 0-RTT |
| 1995 // connection to the the server, in this test we require confirmation | 1992 // connection to the the server, in this test we require confirmation |
| 1996 // before encrypting so the HTTP job will still start. | 1993 // before encrypting so the HTTP job will still start. |
| 1997 host_resolver_.set_synchronous_mode(true); | 1994 host_resolver_.set_synchronous_mode(true); |
| 1998 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1", | 1995 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1", |
| 1999 ""); | 1996 ""); |
| 2000 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443)); | 1997 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443)); |
| 2001 AddressList address; | 1998 AddressList address; |
| 2002 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(), | 1999 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(), |
| 2003 nullptr, net_log_.bound()); | 2000 nullptr, net_log_.bound()); |
| 2004 | 2001 |
| 2005 CreateSessionWithNextProtos(); | 2002 CreateSessionWithNextProtos(); |
| 2006 session_->quic_stream_factory()->set_require_confirmation(true); | 2003 session_->quic_stream_factory()->set_require_confirmation(true); |
| 2007 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 2004 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
| 2008 | 2005 |
| 2009 scoped_ptr<HttpNetworkTransaction> trans( | 2006 scoped_ptr<HttpNetworkTransaction> trans( |
| 2010 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); | 2007 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2218 | 2215 |
| 2219 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | 2216 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, |
| 2220 0); | 2217 0); |
| 2221 socket_factory_.AddSocketDataProvider(&http_data); | 2218 socket_factory_.AddSocketDataProvider(&http_data); |
| 2222 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | 2219 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); |
| 2223 | 2220 |
| 2224 // In order for a new QUIC session to be established via alternate-protocol | 2221 // In order for a new QUIC session to be established via alternate-protocol |
| 2225 // without racing an HTTP connection, we need the host resolution to happen | 2222 // without racing an HTTP connection, we need the host resolution to happen |
| 2226 // synchronously. | 2223 // synchronously. |
| 2227 host_resolver_.set_synchronous_mode(true); | 2224 host_resolver_.set_synchronous_mode(true); |
| 2228 host_resolver_.rules()->AddIPLiteralRule("mail.example.com", "192.168.0.1", | 2225 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1", |
| 2229 ""); | 2226 ""); |
| 2230 HostResolver::RequestInfo info(HostPortPair("mail.example.com", 443)); | 2227 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443)); |
| 2231 AddressList address; | 2228 AddressList address; |
| 2232 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(), | 2229 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(), |
| 2233 nullptr, net_log_.bound()); | 2230 nullptr, net_log_.bound()); |
| 2234 | 2231 |
| 2235 CreateSessionWithNextProtos(); | 2232 CreateSessionWithNextProtos(); |
| 2236 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 2233 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
| 2237 SendRequestAndExpectHttpResponse("hello world"); | 2234 SendRequestAndExpectHttpResponse("hello world"); |
| 2238 } | 2235 } |
| 2239 | 2236 |
| 2240 TEST_P(QuicNetworkTransactionTest, SecureResourceOverSecureQuic) { | 2237 TEST_P(QuicNetworkTransactionTest, SecureResourceOverSecureQuic) { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 2255 request_.url = GURL("https://www.example.org:443"); | 2252 request_.url = GURL("https://www.example.org:443"); |
| 2256 AddHangingNonAlternateProtocolSocketData(); | 2253 AddHangingNonAlternateProtocolSocketData(); |
| 2257 CreateSessionWithNextProtos(); | 2254 CreateSessionWithNextProtos(); |
| 2258 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE); | 2255 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE); |
| 2259 SendRequestAndExpectQuicResponse("hello!"); | 2256 SendRequestAndExpectQuicResponse("hello!"); |
| 2260 EXPECT_TRUE(rtt_observer_.rtt_notification_received()); | 2257 EXPECT_TRUE(rtt_observer_.rtt_notification_received()); |
| 2261 } | 2258 } |
| 2262 | 2259 |
| 2263 TEST_P(QuicNetworkTransactionTest, QuicUpload) { | 2260 TEST_P(QuicNetworkTransactionTest, QuicUpload) { |
| 2264 params_.origin_to_force_quic_on = | 2261 params_.origin_to_force_quic_on = |
| 2265 HostPortPair::FromString("mail.example.com:443"); | 2262 HostPortPair::FromString("mail.example.org:443"); |
| 2266 | 2263 |
| 2267 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; | 2264 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; |
| 2268 MockWrite writes[] = {MockWrite(SYNCHRONOUS, ERR_FAILED, 1)}; | 2265 MockWrite writes[] = {MockWrite(SYNCHRONOUS, ERR_FAILED, 1)}; |
| 2269 SequencedSocketData socket_data(reads, arraysize(reads), writes, | 2266 SequencedSocketData socket_data(reads, arraysize(reads), writes, |
| 2270 arraysize(writes)); | 2267 arraysize(writes)); |
| 2271 socket_factory_.AddSocketDataProvider(&socket_data); | 2268 socket_factory_.AddSocketDataProvider(&socket_data); |
| 2272 | 2269 |
| 2273 // The non-alternate protocol job needs to hang in order to guarantee that | 2270 // The non-alternate protocol job needs to hang in order to guarantee that |
| 2274 // the alternate-protocol job will "win". | 2271 // the alternate-protocol job will "win". |
| 2275 AddHangingNonAlternateProtocolSocketData(); | 2272 AddHangingNonAlternateProtocolSocketData(); |
| 2276 | 2273 |
| 2277 CreateSession(); | 2274 CreateSession(); |
| 2278 request_.method = "POST"; | 2275 request_.method = "POST"; |
| 2279 ChunkedUploadDataStream upload_data(0); | 2276 ChunkedUploadDataStream upload_data(0); |
| 2280 upload_data.AppendData("1", 1, true); | 2277 upload_data.AppendData("1", 1, true); |
| 2281 | 2278 |
| 2282 request_.upload_data_stream = &upload_data; | 2279 request_.upload_data_stream = &upload_data; |
| 2283 | 2280 |
| 2284 scoped_ptr<HttpNetworkTransaction> trans( | 2281 scoped_ptr<HttpNetworkTransaction> trans( |
| 2285 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); | 2282 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); |
| 2286 TestCompletionCallback callback; | 2283 TestCompletionCallback callback; |
| 2287 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); | 2284 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); |
| 2288 EXPECT_EQ(ERR_IO_PENDING, rv); | 2285 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 2289 EXPECT_NE(OK, callback.WaitForResult()); | 2286 EXPECT_NE(OK, callback.WaitForResult()); |
| 2290 } | 2287 } |
| 2291 | 2288 |
| 2292 } // namespace test | 2289 } // namespace test |
| 2293 } // namespace net | 2290 } // namespace net |
| OLD | NEW |