Chromium Code Reviews| 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 "net/http/http_stream_factory_impl.h" | 5 #include "net/http/http_stream_factory_impl.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <utility> | 9 #include <utility> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 1514 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1525 protected: | 1525 protected: |
| 1526 HttpStreamFactoryBidirectionalQuicTest() | 1526 HttpStreamFactoryBidirectionalQuicTest() |
| 1527 : clock_(new MockClock), | 1527 : clock_(new MockClock), |
| 1528 packet_maker_(GetParam(), 0, clock_, "www.example.org"), | 1528 packet_maker_(GetParam(), 0, clock_, "www.example.org"), |
| 1529 random_generator_(0), | 1529 random_generator_(0), |
| 1530 proxy_service_(ProxyService::CreateDirect()), | 1530 proxy_service_(ProxyService::CreateDirect()), |
| 1531 ssl_config_service_(new SSLConfigServiceDefaults) { | 1531 ssl_config_service_(new SSLConfigServiceDefaults) { |
| 1532 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20)); | 1532 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20)); |
| 1533 } | 1533 } |
| 1534 | 1534 |
| 1535 void Initialize() { | 1535 void Initialize(bool disable_bidirectional_stream_quic_impl) { |
| 1536 params_.enable_quic = true; | 1536 params_.enable_quic = true; |
| 1537 params_.http_server_properties = http_server_properties_.GetWeakPtr(); | 1537 params_.http_server_properties = http_server_properties_.GetWeakPtr(); |
| 1538 params_.quic_host_whitelist.insert("www.example.org"); | 1538 params_.quic_host_whitelist.insert("www.example.org"); |
| 1539 params_.quic_random = &random_generator_; | 1539 params_.quic_random = &random_generator_; |
| 1540 params_.quic_clock = clock_; | 1540 params_.quic_clock = clock_; |
| 1541 | 1541 |
| 1542 // Load a certificate that is valid for *.example.org | 1542 // Load a certificate that is valid for *.example.org |
| 1543 scoped_refptr<X509Certificate> test_cert( | 1543 scoped_refptr<X509Certificate> test_cert( |
| 1544 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem")); | 1544 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem")); |
| 1545 EXPECT_TRUE(test_cert.get()); | 1545 EXPECT_TRUE(test_cert.get()); |
| 1546 verify_details_.cert_verify_result.verified_cert = test_cert; | 1546 verify_details_.cert_verify_result.verified_cert = test_cert; |
| 1547 verify_details_.cert_verify_result.is_issued_by_known_root = true; | 1547 verify_details_.cert_verify_result.is_issued_by_known_root = true; |
| 1548 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_); | 1548 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_); |
| 1549 crypto_client_stream_factory_.set_handshake_mode( | 1549 crypto_client_stream_factory_.set_handshake_mode( |
| 1550 MockCryptoClientStream::CONFIRM_HANDSHAKE); | 1550 MockCryptoClientStream::CONFIRM_HANDSHAKE); |
| 1551 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_; | 1551 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_; |
| 1552 params_.quic_supported_versions = test::SupportedVersions(GetParam()); | 1552 params_.quic_supported_versions = test::SupportedVersions(GetParam()); |
| 1553 params_.transport_security_state = &transport_security_state_; | 1553 params_.transport_security_state = &transport_security_state_; |
| 1554 params_.host_resolver = &host_resolver_; | 1554 params_.host_resolver = &host_resolver_; |
| 1555 params_.proxy_service = proxy_service_.get(); | 1555 params_.proxy_service = proxy_service_.get(); |
| 1556 params_.ssl_config_service = ssl_config_service_.get(); | 1556 params_.ssl_config_service = ssl_config_service_.get(); |
| 1557 params_.client_socket_factory = &socket_factory_; | 1557 params_.client_socket_factory = &socket_factory_; |
| 1558 params_.disable_bidirectional_stream_quic_impl = | |
| 1559 disable_bidirectional_stream_quic_impl; | |
| 1558 session_.reset(new HttpNetworkSession(params_)); | 1560 session_.reset(new HttpNetworkSession(params_)); |
| 1559 session_->quic_stream_factory()->set_require_confirmation(false); | 1561 session_->quic_stream_factory()->set_require_confirmation(false); |
| 1560 } | 1562 } |
| 1561 | 1563 |
| 1562 void AddQuicAlternativeService() { | 1564 void AddQuicAlternativeService() { |
| 1563 const AlternativeService alternative_service(QUIC, "www.example.org", 443); | 1565 const AlternativeService alternative_service(QUIC, "www.example.org", 443); |
| 1564 AlternativeServiceInfoVector alternative_service_info_vector; | 1566 AlternativeServiceInfoVector alternative_service_info_vector; |
| 1565 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); | 1567 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); |
| 1566 alternative_service_info_vector.push_back( | 1568 alternative_service_info_vector.push_back( |
| 1567 AlternativeServiceInfo(alternative_service, 1.0, expiration)); | 1569 AlternativeServiceInfo(alternative_service, 1.0, expiration)); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1621 scoped_ptr<StaticSocketDataProvider> hanging_data; | 1623 scoped_ptr<StaticSocketDataProvider> hanging_data; |
| 1622 hanging_data.reset(new StaticSocketDataProvider()); | 1624 hanging_data.reset(new StaticSocketDataProvider()); |
| 1623 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING); | 1625 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING); |
| 1624 hanging_data->set_connect_data(hanging_connect); | 1626 hanging_data->set_connect_data(hanging_connect); |
| 1625 socket_factory().AddSocketDataProvider(hanging_data.get()); | 1627 socket_factory().AddSocketDataProvider(hanging_data.get()); |
| 1626 SSLSocketDataProvider ssl_data(ASYNC, OK); | 1628 SSLSocketDataProvider ssl_data(ASYNC, OK); |
| 1627 socket_factory().AddSSLSocketDataProvider(&ssl_data); | 1629 socket_factory().AddSSLSocketDataProvider(&ssl_data); |
| 1628 | 1630 |
| 1629 // Set up QUIC as alternative_service. | 1631 // Set up QUIC as alternative_service. |
| 1630 AddQuicAlternativeService(); | 1632 AddQuicAlternativeService(); |
| 1631 Initialize(); | 1633 Initialize(/*disable_bidirectional_stream_quic_impl=*/false); |
| 1632 | 1634 |
| 1633 // Now request a stream. | 1635 // Now request a stream. |
| 1634 SSLConfig ssl_config; | 1636 SSLConfig ssl_config; |
| 1635 HttpRequestInfo request_info; | 1637 HttpRequestInfo request_info; |
| 1636 request_info.method = "GET"; | 1638 request_info.method = "GET"; |
| 1637 request_info.url = GURL("https://www.example.org"); | 1639 request_info.url = GURL("https://www.example.org"); |
| 1638 request_info.load_flags = 0; | 1640 request_info.load_flags = 0; |
| 1639 | 1641 |
| 1640 StreamRequestWaiter waiter; | 1642 StreamRequestWaiter waiter; |
| 1641 scoped_ptr<HttpStreamRequest> request( | 1643 scoped_ptr<HttpStreamRequest> request( |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 1655 bidi_request_info.url = GURL("https://www.example.org/"); | 1657 bidi_request_info.url = GURL("https://www.example.org/"); |
| 1656 bidi_request_info.end_stream_on_headers = true; | 1658 bidi_request_info.end_stream_on_headers = true; |
| 1657 bidi_request_info.priority = LOWEST; | 1659 bidi_request_info.priority = LOWEST; |
| 1658 | 1660 |
| 1659 TestBidirectionalDelegate delegate; | 1661 TestBidirectionalDelegate delegate; |
| 1660 job->Start(&bidi_request_info, BoundNetLog(), &delegate, nullptr); | 1662 job->Start(&bidi_request_info, BoundNetLog(), &delegate, nullptr); |
| 1661 delegate.WaitUntilDone(); | 1663 delegate.WaitUntilDone(); |
| 1662 | 1664 |
| 1663 scoped_refptr<IOBuffer> buffer = new net::IOBuffer(1); | 1665 scoped_refptr<IOBuffer> buffer = new net::IOBuffer(1); |
| 1664 EXPECT_EQ(OK, job->ReadData(buffer.get(), 1)); | 1666 EXPECT_EQ(OK, job->ReadData(buffer.get(), 1)); |
| 1667 EXPECT_EQ(kProtoQUIC1SPDY3, job->GetProtocol()); | |
| 1665 EXPECT_EQ("200", delegate.response_headers().find(":status")->second); | 1668 EXPECT_EQ("200", delegate.response_headers().find(":status")->second); |
| 1666 EXPECT_EQ(1, GetSocketPoolGroupCount(session()->GetTransportSocketPool( | 1669 EXPECT_EQ(1, GetSocketPoolGroupCount(session()->GetTransportSocketPool( |
| 1667 HttpNetworkSession::NORMAL_SOCKET_POOL))); | 1670 HttpNetworkSession::NORMAL_SOCKET_POOL))); |
| 1668 EXPECT_EQ(1, GetSocketPoolGroupCount(session()->GetSSLSocketPool( | 1671 EXPECT_EQ(1, GetSocketPoolGroupCount(session()->GetSSLSocketPool( |
| 1669 HttpNetworkSession::NORMAL_SOCKET_POOL))); | 1672 HttpNetworkSession::NORMAL_SOCKET_POOL))); |
| 1670 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetTransportSocketPool( | 1673 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetTransportSocketPool( |
| 1671 HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); | 1674 HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); |
| 1672 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetSSLSocketPool( | 1675 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetSSLSocketPool( |
| 1673 HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); | 1676 HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); |
| 1674 EXPECT_TRUE(waiter.used_proxy_info().is_direct()); | 1677 EXPECT_TRUE(waiter.used_proxy_info().is_direct()); |
| 1675 } | 1678 } |
| 1676 | 1679 |
| 1680 // Tests that when QUIC is not enabled for bidirectional streaming, HTTP/2 is | |
| 1681 // used instead. | |
| 1682 TEST_P(HttpStreamFactoryBidirectionalQuicTest, | |
| 1683 RequestBidirectionalStreamJobQuicNotEnabled) { | |
| 1684 GURL url = GURL("https://www.example.org"); | |
| 1685 | |
| 1686 // Make the http job fail. | |
| 1687 scoped_ptr<StaticSocketDataProvider> http_job_data; | |
| 1688 http_job_data.reset(new StaticSocketDataProvider()); | |
| 1689 MockConnect failed_connect(ASYNC, ERR_CONNECTION_REFUSED); | |
| 1690 http_job_data->set_connect_data(failed_connect); | |
| 1691 socket_factory().AddSocketDataProvider(http_job_data.get()); | |
| 1692 SSLSocketDataProvider ssl_data(ASYNC, OK); | |
| 1693 socket_factory().AddSSLSocketDataProvider(&ssl_data); | |
| 1694 | |
| 1695 // Set up QUIC as alternative_service. | |
| 1696 AddQuicAlternativeService(); | |
| 1697 Initialize(/*disable_bidirectional_stream_quic_impl=*/true); | |
|
Ryan Hamilton
2016/03/15 22:41:45
Instead of adding a new arg to Initialized, how ab
xunjieli
2016/03/16 15:47:04
Partially done. |params_| is private. I try not to
Ryan Hamilton
2016/03/16 20:33:55
That works too. FWIW in tests, making members prot
xunjieli
2016/03/16 20:45:01
Good to know! Matt advised me to keep members priv
Ryan Hamilton
2016/03/16 20:47:09
I am happy to defer to Matt in all things! :>
| |
| 1698 | |
| 1699 // Now request a stream. | |
| 1700 SSLConfig ssl_config; | |
| 1701 HttpRequestInfo request_info; | |
| 1702 request_info.method = "GET"; | |
| 1703 request_info.url = GURL("https://www.example.org"); | |
| 1704 request_info.load_flags = 0; | |
| 1705 | |
| 1706 StreamRequestWaiter waiter; | |
| 1707 scoped_ptr<HttpStreamRequest> request( | |
| 1708 session()->http_stream_factory()->RequestBidirectionalStreamJob( | |
| 1709 request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, &waiter, | |
| 1710 BoundNetLog())); | |
| 1711 | |
| 1712 waiter.WaitForStream(); | |
| 1713 EXPECT_TRUE(waiter.stream_done()); | |
| 1714 EXPECT_FALSE(waiter.websocket_stream()); | |
| 1715 ASSERT_FALSE(waiter.stream()); | |
| 1716 ASSERT_FALSE(waiter.bidirectional_stream_job()); | |
| 1717 // Since the alternative service job is not started, we will get the error | |
| 1718 // from the http job. | |
| 1719 ASSERT_EQ(ERR_CONNECTION_REFUSED, waiter.error_status()); | |
| 1720 } | |
| 1721 | |
| 1722 // Tests that if Http job fails, but Quic job succeeds, we return | |
| 1723 // BidirectionalStreamQuicImpl. | |
| 1724 TEST_P(HttpStreamFactoryBidirectionalQuicTest, | |
| 1725 RequestBidirectionalStreamJobHttpJobFailsQuicJobSucceeds) { | |
| 1726 GURL url = GURL("https://www.example.org"); | |
| 1727 | |
| 1728 // Set up Quic data. | |
| 1729 MockQuicData mock_quic_data; | |
| 1730 SpdyPriority priority = | |
| 1731 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY); | |
| 1732 size_t spdy_headers_frame_length; | |
| 1733 mock_quic_data.AddWrite(packet_maker().MakeRequestHeadersPacket( | |
| 1734 1, test::kClientDataStreamId1, /*should_include_version=*/true, | |
| 1735 /*fin=*/true, priority, | |
| 1736 packet_maker().GetRequestHeaders("GET", "https", "/"), | |
| 1737 &spdy_headers_frame_length)); | |
| 1738 size_t spdy_response_headers_frame_length; | |
| 1739 mock_quic_data.AddRead(packet_maker().MakeResponseHeadersPacket( | |
| 1740 1, test::kClientDataStreamId1, /*should_include_version=*/false, | |
| 1741 /*fin=*/true, packet_maker().GetResponseHeaders("200"), | |
| 1742 &spdy_response_headers_frame_length)); | |
| 1743 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data. | |
| 1744 mock_quic_data.AddSocketDataToFactory(&socket_factory()); | |
| 1745 | |
| 1746 // Make the http job fail. | |
| 1747 scoped_ptr<StaticSocketDataProvider> http_job_data; | |
| 1748 http_job_data.reset(new StaticSocketDataProvider()); | |
| 1749 MockConnect failed_connect(ASYNC, ERR_CONNECTION_REFUSED); | |
| 1750 http_job_data->set_connect_data(failed_connect); | |
| 1751 socket_factory().AddSocketDataProvider(http_job_data.get()); | |
| 1752 SSLSocketDataProvider ssl_data(ASYNC, OK); | |
| 1753 socket_factory().AddSSLSocketDataProvider(&ssl_data); | |
| 1754 | |
| 1755 // Set up QUIC as alternative_service. | |
| 1756 AddQuicAlternativeService(); | |
| 1757 Initialize(/*disable_bidirectional_stream_quic_impl=*/false); | |
| 1758 | |
| 1759 // Now request a stream. | |
| 1760 SSLConfig ssl_config; | |
| 1761 HttpRequestInfo request_info; | |
| 1762 request_info.method = "GET"; | |
| 1763 request_info.url = GURL("https://www.example.org"); | |
| 1764 request_info.load_flags = 0; | |
| 1765 | |
| 1766 StreamRequestWaiter waiter; | |
| 1767 scoped_ptr<HttpStreamRequest> request( | |
| 1768 session()->http_stream_factory()->RequestBidirectionalStreamJob( | |
| 1769 request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, &waiter, | |
| 1770 BoundNetLog())); | |
| 1771 | |
| 1772 waiter.WaitForStream(); | |
| 1773 EXPECT_TRUE(waiter.stream_done()); | |
| 1774 EXPECT_FALSE(waiter.websocket_stream()); | |
| 1775 ASSERT_FALSE(waiter.stream()); | |
| 1776 ASSERT_TRUE(waiter.bidirectional_stream_job()); | |
| 1777 BidirectionalStreamJob* job = waiter.bidirectional_stream_job(); | |
| 1778 | |
| 1779 BidirectionalStreamRequestInfo bidi_request_info; | |
| 1780 bidi_request_info.method = "GET"; | |
| 1781 bidi_request_info.url = GURL("https://www.example.org/"); | |
| 1782 bidi_request_info.end_stream_on_headers = true; | |
| 1783 bidi_request_info.priority = LOWEST; | |
| 1784 | |
| 1785 TestBidirectionalDelegate delegate; | |
| 1786 job->Start(&bidi_request_info, BoundNetLog(), &delegate, nullptr); | |
| 1787 delegate.WaitUntilDone(); | |
| 1788 | |
| 1789 // Make sure the BidirectionalStream negotiated goes through QUIC. | |
| 1790 scoped_refptr<IOBuffer> buffer = new net::IOBuffer(1); | |
| 1791 EXPECT_EQ(OK, job->ReadData(buffer.get(), 1)); | |
| 1792 EXPECT_EQ(kProtoQUIC1SPDY3, job->GetProtocol()); | |
| 1793 EXPECT_EQ("200", delegate.response_headers().find(":status")->second); | |
| 1794 // There is no Http2 socket pool. | |
| 1795 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetTransportSocketPool( | |
| 1796 HttpNetworkSession::NORMAL_SOCKET_POOL))); | |
| 1797 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetSSLSocketPool( | |
| 1798 HttpNetworkSession::NORMAL_SOCKET_POOL))); | |
| 1799 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetTransportSocketPool( | |
| 1800 HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); | |
| 1801 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetSSLSocketPool( | |
| 1802 HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); | |
| 1803 EXPECT_TRUE(waiter.used_proxy_info().is_direct()); | |
| 1804 } | |
| 1805 | |
| 1677 TEST_P(HttpStreamFactoryTest, RequestBidirectionalStreamJobFailure) { | 1806 TEST_P(HttpStreamFactoryTest, RequestBidirectionalStreamJobFailure) { |
| 1678 SpdySessionDependencies session_deps(GetParam(), | 1807 SpdySessionDependencies session_deps(GetParam(), |
| 1679 ProxyService::CreateDirect()); | 1808 ProxyService::CreateDirect()); |
| 1680 | 1809 |
| 1681 MockRead mock_read(ASYNC, OK); | 1810 MockRead mock_read(ASYNC, OK); |
| 1682 SequencedSocketData socket_data(&mock_read, 1, nullptr, 0); | 1811 SequencedSocketData socket_data(&mock_read, 1, nullptr, 0); |
| 1683 socket_data.set_connect_data(MockConnect(ASYNC, OK)); | 1812 socket_data.set_connect_data(MockConnect(ASYNC, OK)); |
| 1684 session_deps.socket_factory->AddSocketDataProvider(&socket_data); | 1813 session_deps.socket_factory->AddSocketDataProvider(&socket_data); |
| 1685 | 1814 |
| 1686 SSLSocketDataProvider ssl_socket_data(ASYNC, OK); | 1815 SSLSocketDataProvider ssl_socket_data(ASYNC, OK); |
| (...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1923 EXPECT_TRUE(waiter.used_proxy_info().is_direct()); | 2052 EXPECT_TRUE(waiter.used_proxy_info().is_direct()); |
| 1924 | 2053 |
| 1925 // Make sure there is no orphaned job. it is already canceled. | 2054 // Make sure there is no orphaned job. it is already canceled. |
| 1926 ASSERT_EQ(0u, static_cast<HttpStreamFactoryImpl*>( | 2055 ASSERT_EQ(0u, static_cast<HttpStreamFactoryImpl*>( |
| 1927 session->http_stream_factory_for_websocket())->num_orphaned_jobs()); | 2056 session->http_stream_factory_for_websocket())->num_orphaned_jobs()); |
| 1928 } | 2057 } |
| 1929 | 2058 |
| 1930 } // namespace | 2059 } // namespace |
| 1931 | 2060 |
| 1932 } // namespace net | 2061 } // namespace net |
| OLD | NEW |