| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <memory> | 5 #include <memory> |
| 6 #include <string> | 6 #include <string> |
| 7 #include <utility> | 7 #include <utility> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 48 #include "net/socket/client_socket_factory.h" | 48 #include "net/socket/client_socket_factory.h" |
| 49 #include "net/socket/mock_client_socket_pool_manager.h" | 49 #include "net/socket/mock_client_socket_pool_manager.h" |
| 50 #include "net/socket/socket_test_util.h" | 50 #include "net/socket/socket_test_util.h" |
| 51 #include "net/socket/ssl_client_socket.h" | 51 #include "net/socket/ssl_client_socket.h" |
| 52 #include "net/spdy/spdy_frame_builder.h" | 52 #include "net/spdy/spdy_frame_builder.h" |
| 53 #include "net/spdy/spdy_framer.h" | 53 #include "net/spdy/spdy_framer.h" |
| 54 #include "net/ssl/ssl_config_service_defaults.h" | 54 #include "net/ssl/ssl_config_service_defaults.h" |
| 55 #include "net/test/cert_test_util.h" | 55 #include "net/test/cert_test_util.h" |
| 56 #include "testing/gtest/include/gtest/gtest.h" | 56 #include "testing/gtest/include/gtest/gtest.h" |
| 57 #include "testing/platform_test.h" | 57 #include "testing/platform_test.h" |
| 58 #include "url/gurl.h" |
| 58 | 59 |
| 59 namespace net { | 60 namespace net { |
| 60 namespace test { | 61 namespace test { |
| 61 | 62 |
| 62 namespace { | 63 namespace { |
| 63 | 64 |
| 64 static const char kQuicAlternateProtocolHeader[] = | 65 static const char kQuicAlternateProtocolHeader[] = |
| 65 "Alternate-Protocol: 443:quic\r\n\r\n"; | 66 "Alternate-Protocol: 443:quic\r\n\r\n"; |
| 66 static const char kQuicAlternateProtocolWithProbabilityHeader[] = | 67 static const char kQuicAlternateProtocolWithProbabilityHeader[] = |
| 67 "Alternate-Protocol: 443:quic,p=.5\r\n\r\n"; | 68 "Alternate-Protocol: 443:quic,p=.5\r\n\r\n"; |
| (...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 530 | 531 |
| 531 void SendRequestAndExpectQuicResponseFromProxyOnPort( | 532 void SendRequestAndExpectQuicResponseFromProxyOnPort( |
| 532 const std::string& expected, | 533 const std::string& expected, |
| 533 uint16_t port) { | 534 uint16_t port) { |
| 534 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, true, port); | 535 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, true, port); |
| 535 } | 536 } |
| 536 | 537 |
| 537 void AddQuicAlternateProtocolMapping( | 538 void AddQuicAlternateProtocolMapping( |
| 538 MockCryptoClientStream::HandshakeMode handshake_mode) { | 539 MockCryptoClientStream::HandshakeMode handshake_mode) { |
| 539 crypto_client_stream_factory_.set_handshake_mode(handshake_mode); | 540 crypto_client_stream_factory_.set_handshake_mode(handshake_mode); |
| 540 HostPortPair host_port_pair = HostPortPair::FromURL(request_.url); | 541 url::SchemeHostPort server(request_.url); |
| 541 AlternativeService alternative_service(QUIC, host_port_pair.host(), 443); | 542 AlternativeService alternative_service(QUIC, server.host(), 443); |
| 542 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); | 543 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); |
| 543 http_server_properties_.SetAlternativeService( | 544 http_server_properties_.SetAlternativeService(server, alternative_service, |
| 544 host_port_pair, alternative_service, expiration); | 545 expiration); |
| 545 } | 546 } |
| 546 | 547 |
| 547 void AddQuicRemoteAlternativeServiceMapping( | 548 void AddQuicRemoteAlternativeServiceMapping( |
| 548 MockCryptoClientStream::HandshakeMode handshake_mode, | 549 MockCryptoClientStream::HandshakeMode handshake_mode, |
| 549 const HostPortPair& alternative) { | 550 const HostPortPair& alternative) { |
| 550 crypto_client_stream_factory_.set_handshake_mode(handshake_mode); | 551 crypto_client_stream_factory_.set_handshake_mode(handshake_mode); |
| 551 HostPortPair host_port_pair = HostPortPair::FromURL(request_.url); | 552 url::SchemeHostPort server(request_.url); |
| 552 AlternativeService alternative_service(QUIC, alternative.host(), | 553 AlternativeService alternative_service(QUIC, alternative.host(), |
| 553 alternative.port()); | 554 alternative.port()); |
| 554 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); | 555 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); |
| 555 http_server_properties_.SetAlternativeService( | 556 http_server_properties_.SetAlternativeService(server, alternative_service, |
| 556 host_port_pair, alternative_service, expiration); | 557 expiration); |
| 557 } | 558 } |
| 558 | 559 |
| 559 void ExpectBrokenAlternateProtocolMapping() { | 560 void ExpectBrokenAlternateProtocolMapping() { |
| 560 const HostPortPair origin = HostPortPair::FromURL(request_.url); | 561 const url::SchemeHostPort server(request_.url); |
| 561 const AlternativeServiceVector alternative_service_vector = | 562 const AlternativeServiceVector alternative_service_vector = |
| 562 http_server_properties_.GetAlternativeServices(origin); | 563 http_server_properties_.GetAlternativeServices(server); |
| 563 EXPECT_EQ(1u, alternative_service_vector.size()); | 564 EXPECT_EQ(1u, alternative_service_vector.size()); |
| 564 EXPECT_TRUE(http_server_properties_.IsAlternativeServiceBroken( | 565 EXPECT_TRUE(http_server_properties_.IsAlternativeServiceBroken( |
| 565 alternative_service_vector[0])); | 566 alternative_service_vector[0])); |
| 566 } | 567 } |
| 567 | 568 |
| 568 void ExpectQuicAlternateProtocolMapping() { | 569 void ExpectQuicAlternateProtocolMapping() { |
| 569 const HostPortPair origin = HostPortPair::FromURL(request_.url); | 570 const url::SchemeHostPort server(request_.url); |
| 570 const AlternativeServiceVector alternative_service_vector = | 571 const AlternativeServiceVector alternative_service_vector = |
| 571 http_server_properties_.GetAlternativeServices(origin); | 572 http_server_properties_.GetAlternativeServices(server); |
| 572 EXPECT_EQ(1u, alternative_service_vector.size()); | 573 EXPECT_EQ(1u, alternative_service_vector.size()); |
| 573 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol); | 574 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol); |
| 574 } | 575 } |
| 575 | 576 |
| 576 void AddHangingNonAlternateProtocolSocketData() { | 577 void AddHangingNonAlternateProtocolSocketData() { |
| 577 std::unique_ptr<StaticSocketDataProvider> hanging_data; | 578 std::unique_ptr<StaticSocketDataProvider> hanging_data; |
| 578 hanging_data.reset(new StaticSocketDataProvider()); | 579 hanging_data.reset(new StaticSocketDataProvider()); |
| 579 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING); | 580 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING); |
| 580 hanging_data->set_connect_data(hanging_connect); | 581 hanging_data->set_connect_data(hanging_connect); |
| 581 hanging_data_.push_back(std::move(hanging_data)); | 582 hanging_data_.push_back(std::move(hanging_data)); |
| (...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 935 | 936 |
| 936 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | 937 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| 937 | 938 |
| 938 AddHangingNonAlternateProtocolSocketData(); | 939 AddHangingNonAlternateProtocolSocketData(); |
| 939 CreateSession(); | 940 CreateSession(); |
| 940 | 941 |
| 941 SendRequestAndExpectHttpResponse("hello world"); | 942 SendRequestAndExpectHttpResponse("hello world"); |
| 942 SendRequestAndExpectQuicResponse("hello!"); | 943 SendRequestAndExpectQuicResponse("hello!"); |
| 943 } | 944 } |
| 944 | 945 |
| 946 TEST_P(QuicNetworkTransactionTest, SetAlternativeServiceWithScheme) { |
| 947 MockRead http_reads[] = { |
| 948 MockRead("HTTP/1.1 200 OK\r\n"), |
| 949 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"), |
| 950 MockRead("hello world"), |
| 951 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 952 MockRead(ASYNC, OK)}; |
| 953 |
| 954 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, |
| 955 0); |
| 956 |
| 957 socket_factory_.AddSocketDataProvider(&http_data); |
| 958 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); |
| 959 |
| 960 CreateSession(); |
| 961 // Send http request, ignore alternative service advertising if response |
| 962 // header advertises alternative service for mail.example.org. |
| 963 request_.url = GURL("http://mail.example.org:443"); |
| 964 SendRequestAndExpectHttpResponse("hello world"); |
| 965 base::WeakPtr<HttpServerProperties> http_server_properties = |
| 966 session_->http_server_properties(); |
| 967 url::SchemeHostPort http_server("http", "mail.example.org", 443); |
| 968 url::SchemeHostPort https_server("https", "mail.example.org", 443); |
| 969 // Check alternative service is set for the correct origin. |
| 970 EXPECT_EQ(2u, |
| 971 http_server_properties->GetAlternativeServices(http_server).size()); |
| 972 EXPECT_EQ( |
| 973 0u, http_server_properties->GetAlternativeServices(https_server).size()); |
| 974 } |
| 975 |
| 976 TEST_P(QuicNetworkTransactionTest, DoNotGetAltSvcForDifferentOrigin) { |
| 977 MockRead http_reads[] = { |
| 978 MockRead("HTTP/1.1 200 OK\r\n"), |
| 979 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"), |
| 980 MockRead("hello world"), |
| 981 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 982 MockRead(ASYNC, OK)}; |
| 983 |
| 984 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, |
| 985 0); |
| 986 |
| 987 socket_factory_.AddSocketDataProvider(&http_data); |
| 988 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); |
| 989 socket_factory_.AddSocketDataProvider(&http_data); |
| 990 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); |
| 991 |
| 992 CreateSession(); |
| 993 |
| 994 // Send https request and set alternative services if response header |
| 995 // advertises alternative service for mail.example.org. |
| 996 SendRequestAndExpectHttpResponse("hello world"); |
| 997 base::WeakPtr<HttpServerProperties> http_server_properties = |
| 998 session_->http_server_properties(); |
| 999 |
| 1000 const url::SchemeHostPort https_server(request_.url); |
| 1001 // Check alternative service is set. |
| 1002 AlternativeServiceVector alternative_service_vector = |
| 1003 http_server_properties->GetAlternativeServices(https_server); |
| 1004 EXPECT_EQ(2u, alternative_service_vector.size()); |
| 1005 |
| 1006 // Send http request to the same origin but with diffrent scheme, should not |
| 1007 // use QUIC. |
| 1008 request_.url = GURL("http://mail.example.org:443"); |
| 1009 SendRequestAndExpectHttpResponse("hello world"); |
| 1010 } |
| 1011 |
| 945 TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceQuicSupportedVersion) { | 1012 TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceQuicSupportedVersion) { |
| 946 std::string altsvc_header = base::StringPrintf( | 1013 std::string altsvc_header = base::StringPrintf( |
| 947 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam()); | 1014 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam()); |
| 948 MockRead http_reads[] = { | 1015 MockRead http_reads[] = { |
| 949 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()), | 1016 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()), |
| 950 MockRead("hello world"), | 1017 MockRead("hello world"), |
| 951 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 1018 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 952 MockRead(ASYNC, OK)}; | 1019 MockRead(ASYNC, OK)}; |
| 953 | 1020 |
| 954 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | 1021 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, |
| (...skipping 749 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1704 CreateSession(); | 1771 CreateSession(); |
| 1705 | 1772 |
| 1706 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo(). | 1773 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo(). |
| 1707 SendRequestAndExpectHttpResponse("hello world"); | 1774 SendRequestAndExpectHttpResponse("hello world"); |
| 1708 } | 1775 } |
| 1709 | 1776 |
| 1710 class QuicAltSvcCertificateVerificationTest | 1777 class QuicAltSvcCertificateVerificationTest |
| 1711 : public QuicNetworkTransactionTest { | 1778 : public QuicNetworkTransactionTest { |
| 1712 public: | 1779 public: |
| 1713 void Run(bool valid) { | 1780 void Run(bool valid) { |
| 1714 HostPortPair origin(valid ? "mail.example.org" : "mail.example.com", 443); | 1781 url::SchemeHostPort server(GURL(valid ? "https://mail.example.org:443" |
| 1782 : "https://mail.example.com:443")); |
| 1715 HostPortPair alternative("www.example.org", 443); | 1783 HostPortPair alternative("www.example.org", 443); |
| 1716 std::string url("https://"); | 1784 std::string url("https://"); |
| 1717 url.append(origin.host()); | 1785 url.append(server.host()); |
| 1718 url.append(":443"); | 1786 url.append(":443"); |
| 1719 request_.url = GURL(url); | 1787 request_.url = GURL(url); |
| 1720 | 1788 |
| 1721 maker_.set_hostname(origin.host()); | 1789 maker_.set_hostname(server.host()); |
| 1722 MockQuicData mock_quic_data; | 1790 MockQuicData mock_quic_data; |
| 1723 mock_quic_data.AddWrite( | 1791 mock_quic_data.AddWrite( |
| 1724 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 1792 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
| 1725 GetRequestHeaders("GET", "https", "/"))); | 1793 GetRequestHeaders("GET", "https", "/"))); |
| 1726 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | 1794 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 1727 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); | 1795 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); |
| 1728 mock_quic_data.AddRead( | 1796 mock_quic_data.AddRead( |
| 1729 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 1797 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 1730 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 1798 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 1731 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); | 1799 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); |
| 1732 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | 1800 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| 1733 | 1801 |
| 1734 scoped_refptr<X509Certificate> cert( | 1802 scoped_refptr<X509Certificate> cert( |
| 1735 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem")); | 1803 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem")); |
| 1736 ASSERT_TRUE(cert.get()); | 1804 ASSERT_TRUE(cert.get()); |
| 1737 bool common_name_fallback_used; | 1805 bool common_name_fallback_used; |
| 1738 EXPECT_EQ(valid, | 1806 EXPECT_EQ(valid, |
| 1739 cert->VerifyNameMatch(origin.host(), &common_name_fallback_used)); | 1807 cert->VerifyNameMatch(server.host(), &common_name_fallback_used)); |
| 1740 EXPECT_TRUE( | 1808 EXPECT_TRUE( |
| 1741 cert->VerifyNameMatch(alternative.host(), &common_name_fallback_used)); | 1809 cert->VerifyNameMatch(alternative.host(), &common_name_fallback_used)); |
| 1742 ProofVerifyDetailsChromium verify_details; | 1810 ProofVerifyDetailsChromium verify_details; |
| 1743 verify_details.cert_verify_result.verified_cert = cert; | 1811 verify_details.cert_verify_result.verified_cert = cert; |
| 1744 verify_details.cert_verify_result.is_issued_by_known_root = true; | 1812 verify_details.cert_verify_result.is_issued_by_known_root = true; |
| 1745 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | 1813 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
| 1746 crypto_client_stream_factory_.set_handshake_mode( | 1814 crypto_client_stream_factory_.set_handshake_mode( |
| 1747 MockCryptoClientStream::CONFIRM_HANDSHAKE); | 1815 MockCryptoClientStream::CONFIRM_HANDSHAKE); |
| 1748 | 1816 |
| 1749 // Connection to |origin| fails, so that success of |request| depends on | 1817 // Connection to |server| fails, so that success of |request| depends on |
| 1750 // connection to |alternate| only. | 1818 // connection to |alternate| only. |
| 1751 MockConnect refused_connect(ASYNC, ERR_CONNECTION_REFUSED); | 1819 MockConnect refused_connect(ASYNC, ERR_CONNECTION_REFUSED); |
| 1752 StaticSocketDataProvider refused_data; | 1820 StaticSocketDataProvider refused_data; |
| 1753 refused_data.set_connect_data(refused_connect); | 1821 refused_data.set_connect_data(refused_connect); |
| 1754 socket_factory_.AddSocketDataProvider(&refused_data); | 1822 socket_factory_.AddSocketDataProvider(&refused_data); |
| 1755 | 1823 |
| 1756 CreateSession(); | 1824 CreateSession(); |
| 1757 AlternativeService alternative_service(QUIC, alternative); | 1825 AlternativeService alternative_service(QUIC, alternative); |
| 1758 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); | 1826 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); |
| 1759 session_->http_server_properties()->SetAlternativeService( | 1827 session_->http_server_properties()->SetAlternativeService( |
| 1760 origin, alternative_service, expiration); | 1828 server, alternative_service, expiration); |
| 1761 std::unique_ptr<HttpNetworkTransaction> trans( | 1829 std::unique_ptr<HttpNetworkTransaction> trans( |
| 1762 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); | 1830 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); |
| 1763 TestCompletionCallback callback; | 1831 TestCompletionCallback callback; |
| 1764 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); | 1832 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); |
| 1765 EXPECT_EQ(ERR_IO_PENDING, rv); | 1833 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1766 rv = callback.WaitForResult(); | 1834 rv = callback.WaitForResult(); |
| 1767 if (valid) { | 1835 if (valid) { |
| 1768 EXPECT_EQ(OK, rv); | 1836 EXPECT_EQ(OK, rv); |
| 1769 CheckWasQuicResponse(trans); | 1837 CheckWasQuicResponse(trans); |
| 1770 CheckResponsePort(trans, 443); | 1838 CheckResponsePort(trans, 443); |
| (...skipping 577 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2348 std::unique_ptr<HttpNetworkTransaction> trans( | 2416 std::unique_ptr<HttpNetworkTransaction> trans( |
| 2349 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); | 2417 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); |
| 2350 TestCompletionCallback callback; | 2418 TestCompletionCallback callback; |
| 2351 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); | 2419 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); |
| 2352 EXPECT_EQ(ERR_IO_PENDING, rv); | 2420 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 2353 EXPECT_NE(OK, callback.WaitForResult()); | 2421 EXPECT_NE(OK, callback.WaitForResult()); |
| 2354 } | 2422 } |
| 2355 | 2423 |
| 2356 } // namespace test | 2424 } // namespace test |
| 2357 } // namespace net | 2425 } // namespace net |
| OLD | NEW |