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 |