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