| 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 1499 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1510 protected: | 1510 protected: |
| 1511 HttpStreamFactoryBidirectionalQuicTest() | 1511 HttpStreamFactoryBidirectionalQuicTest() |
| 1512 : clock_(new MockClock), | 1512 : clock_(new MockClock), |
| 1513 packet_maker_(GetParam(), 0, clock_, "www.example.org"), | 1513 packet_maker_(GetParam(), 0, clock_, "www.example.org"), |
| 1514 random_generator_(0), | 1514 random_generator_(0), |
| 1515 proxy_service_(ProxyService::CreateDirect()), | 1515 proxy_service_(ProxyService::CreateDirect()), |
| 1516 ssl_config_service_(new SSLConfigServiceDefaults) { | 1516 ssl_config_service_(new SSLConfigServiceDefaults) { |
| 1517 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20)); | 1517 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20)); |
| 1518 } | 1518 } |
| 1519 | 1519 |
| 1520 // Disable bidirectional stream over QUIC. This should be invoked before |
| 1521 // Initialize(). |
| 1522 void DisableQuicBidirectionalStream() { |
| 1523 params_.quic_disable_bidirectional_streams = true; |
| 1524 } |
| 1525 |
| 1520 void Initialize() { | 1526 void Initialize() { |
| 1521 params_.enable_quic = true; | 1527 params_.enable_quic = true; |
| 1522 params_.http_server_properties = http_server_properties_.GetWeakPtr(); | 1528 params_.http_server_properties = http_server_properties_.GetWeakPtr(); |
| 1523 params_.quic_host_whitelist.insert("www.example.org"); | 1529 params_.quic_host_whitelist.insert("www.example.org"); |
| 1524 params_.quic_random = &random_generator_; | 1530 params_.quic_random = &random_generator_; |
| 1525 params_.quic_clock = clock_; | 1531 params_.quic_clock = clock_; |
| 1526 | 1532 |
| 1527 // Load a certificate that is valid for *.example.org | 1533 // Load a certificate that is valid for *.example.org |
| 1528 scoped_refptr<X509Certificate> test_cert( | 1534 scoped_refptr<X509Certificate> test_cert( |
| 1529 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem")); | 1535 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem")); |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1640 bidi_request_info.url = GURL("https://www.example.org/"); | 1646 bidi_request_info.url = GURL("https://www.example.org/"); |
| 1641 bidi_request_info.end_stream_on_headers = true; | 1647 bidi_request_info.end_stream_on_headers = true; |
| 1642 bidi_request_info.priority = LOWEST; | 1648 bidi_request_info.priority = LOWEST; |
| 1643 | 1649 |
| 1644 TestBidirectionalDelegate delegate; | 1650 TestBidirectionalDelegate delegate; |
| 1645 job->Start(&bidi_request_info, BoundNetLog(), &delegate, nullptr); | 1651 job->Start(&bidi_request_info, BoundNetLog(), &delegate, nullptr); |
| 1646 delegate.WaitUntilDone(); | 1652 delegate.WaitUntilDone(); |
| 1647 | 1653 |
| 1648 scoped_refptr<IOBuffer> buffer = new net::IOBuffer(1); | 1654 scoped_refptr<IOBuffer> buffer = new net::IOBuffer(1); |
| 1649 EXPECT_EQ(OK, job->ReadData(buffer.get(), 1)); | 1655 EXPECT_EQ(OK, job->ReadData(buffer.get(), 1)); |
| 1656 EXPECT_EQ(kProtoQUIC1SPDY3, job->GetProtocol()); |
| 1650 EXPECT_EQ("200", delegate.response_headers().find(":status")->second); | 1657 EXPECT_EQ("200", delegate.response_headers().find(":status")->second); |
| 1651 EXPECT_EQ(1, GetSocketPoolGroupCount(session()->GetTransportSocketPool( | 1658 EXPECT_EQ(1, GetSocketPoolGroupCount(session()->GetTransportSocketPool( |
| 1652 HttpNetworkSession::NORMAL_SOCKET_POOL))); | 1659 HttpNetworkSession::NORMAL_SOCKET_POOL))); |
| 1653 EXPECT_EQ(1, GetSocketPoolGroupCount(session()->GetSSLSocketPool( | 1660 EXPECT_EQ(1, GetSocketPoolGroupCount(session()->GetSSLSocketPool( |
| 1654 HttpNetworkSession::NORMAL_SOCKET_POOL))); | 1661 HttpNetworkSession::NORMAL_SOCKET_POOL))); |
| 1655 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetTransportSocketPool( | 1662 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetTransportSocketPool( |
| 1656 HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); | 1663 HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); |
| 1657 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetSSLSocketPool( | 1664 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetSSLSocketPool( |
| 1658 HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); | 1665 HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); |
| 1659 EXPECT_TRUE(waiter.used_proxy_info().is_direct()); | 1666 EXPECT_TRUE(waiter.used_proxy_info().is_direct()); |
| 1660 } | 1667 } |
| 1661 | 1668 |
| 1669 // Tests that when QUIC is not enabled for bidirectional streaming, HTTP/2 is |
| 1670 // used instead. |
| 1671 TEST_P(HttpStreamFactoryBidirectionalQuicTest, |
| 1672 RequestBidirectionalStreamJobQuicNotEnabled) { |
| 1673 GURL url = GURL("https://www.example.org"); |
| 1674 |
| 1675 // Make the http job fail. |
| 1676 scoped_ptr<StaticSocketDataProvider> http_job_data; |
| 1677 http_job_data.reset(new StaticSocketDataProvider()); |
| 1678 MockConnect failed_connect(ASYNC, ERR_CONNECTION_REFUSED); |
| 1679 http_job_data->set_connect_data(failed_connect); |
| 1680 socket_factory().AddSocketDataProvider(http_job_data.get()); |
| 1681 SSLSocketDataProvider ssl_data(ASYNC, OK); |
| 1682 socket_factory().AddSSLSocketDataProvider(&ssl_data); |
| 1683 |
| 1684 // Set up QUIC as alternative_service. |
| 1685 AddQuicAlternativeService(); |
| 1686 DisableQuicBidirectionalStream(); |
| 1687 Initialize(); |
| 1688 |
| 1689 // Now request a stream. |
| 1690 SSLConfig ssl_config; |
| 1691 HttpRequestInfo request_info; |
| 1692 request_info.method = "GET"; |
| 1693 request_info.url = GURL("https://www.example.org"); |
| 1694 request_info.load_flags = 0; |
| 1695 |
| 1696 StreamRequestWaiter waiter; |
| 1697 scoped_ptr<HttpStreamRequest> request( |
| 1698 session()->http_stream_factory()->RequestBidirectionalStreamJob( |
| 1699 request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, &waiter, |
| 1700 BoundNetLog())); |
| 1701 |
| 1702 waiter.WaitForStream(); |
| 1703 EXPECT_TRUE(waiter.stream_done()); |
| 1704 EXPECT_FALSE(waiter.websocket_stream()); |
| 1705 ASSERT_FALSE(waiter.stream()); |
| 1706 ASSERT_FALSE(waiter.bidirectional_stream_job()); |
| 1707 // Since the alternative service job is not started, we will get the error |
| 1708 // from the http job. |
| 1709 ASSERT_EQ(ERR_CONNECTION_REFUSED, waiter.error_status()); |
| 1710 } |
| 1711 |
| 1712 // Tests that if Http job fails, but Quic job succeeds, we return |
| 1713 // BidirectionalStreamQuicImpl. |
| 1714 TEST_P(HttpStreamFactoryBidirectionalQuicTest, |
| 1715 RequestBidirectionalStreamJobHttpJobFailsQuicJobSucceeds) { |
| 1716 GURL url = GURL("https://www.example.org"); |
| 1717 |
| 1718 // Set up Quic data. |
| 1719 MockQuicData mock_quic_data; |
| 1720 SpdyPriority priority = |
| 1721 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY); |
| 1722 size_t spdy_headers_frame_length; |
| 1723 mock_quic_data.AddWrite(packet_maker().MakeRequestHeadersPacket( |
| 1724 1, test::kClientDataStreamId1, /*should_include_version=*/true, |
| 1725 /*fin=*/true, priority, |
| 1726 packet_maker().GetRequestHeaders("GET", "https", "/"), |
| 1727 &spdy_headers_frame_length)); |
| 1728 size_t spdy_response_headers_frame_length; |
| 1729 mock_quic_data.AddRead(packet_maker().MakeResponseHeadersPacket( |
| 1730 1, test::kClientDataStreamId1, /*should_include_version=*/false, |
| 1731 /*fin=*/true, packet_maker().GetResponseHeaders("200"), |
| 1732 &spdy_response_headers_frame_length)); |
| 1733 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data. |
| 1734 mock_quic_data.AddSocketDataToFactory(&socket_factory()); |
| 1735 |
| 1736 // Make the http job fail. |
| 1737 scoped_ptr<StaticSocketDataProvider> http_job_data; |
| 1738 http_job_data.reset(new StaticSocketDataProvider()); |
| 1739 MockConnect failed_connect(ASYNC, ERR_CONNECTION_REFUSED); |
| 1740 http_job_data->set_connect_data(failed_connect); |
| 1741 socket_factory().AddSocketDataProvider(http_job_data.get()); |
| 1742 SSLSocketDataProvider ssl_data(ASYNC, OK); |
| 1743 socket_factory().AddSSLSocketDataProvider(&ssl_data); |
| 1744 |
| 1745 // Set up QUIC as alternative_service. |
| 1746 AddQuicAlternativeService(); |
| 1747 Initialize(); |
| 1748 |
| 1749 // Now request a stream. |
| 1750 SSLConfig ssl_config; |
| 1751 HttpRequestInfo request_info; |
| 1752 request_info.method = "GET"; |
| 1753 request_info.url = GURL("https://www.example.org"); |
| 1754 request_info.load_flags = 0; |
| 1755 |
| 1756 StreamRequestWaiter waiter; |
| 1757 scoped_ptr<HttpStreamRequest> request( |
| 1758 session()->http_stream_factory()->RequestBidirectionalStreamJob( |
| 1759 request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, &waiter, |
| 1760 BoundNetLog())); |
| 1761 |
| 1762 waiter.WaitForStream(); |
| 1763 EXPECT_TRUE(waiter.stream_done()); |
| 1764 EXPECT_FALSE(waiter.websocket_stream()); |
| 1765 ASSERT_FALSE(waiter.stream()); |
| 1766 ASSERT_TRUE(waiter.bidirectional_stream_job()); |
| 1767 BidirectionalStreamJob* job = waiter.bidirectional_stream_job(); |
| 1768 |
| 1769 BidirectionalStreamRequestInfo bidi_request_info; |
| 1770 bidi_request_info.method = "GET"; |
| 1771 bidi_request_info.url = GURL("https://www.example.org/"); |
| 1772 bidi_request_info.end_stream_on_headers = true; |
| 1773 bidi_request_info.priority = LOWEST; |
| 1774 |
| 1775 TestBidirectionalDelegate delegate; |
| 1776 job->Start(&bidi_request_info, BoundNetLog(), &delegate, nullptr); |
| 1777 delegate.WaitUntilDone(); |
| 1778 |
| 1779 // Make sure the BidirectionalStream negotiated goes through QUIC. |
| 1780 scoped_refptr<IOBuffer> buffer = new net::IOBuffer(1); |
| 1781 EXPECT_EQ(OK, job->ReadData(buffer.get(), 1)); |
| 1782 EXPECT_EQ(kProtoQUIC1SPDY3, job->GetProtocol()); |
| 1783 EXPECT_EQ("200", delegate.response_headers().find(":status")->second); |
| 1784 // There is no Http2 socket pool. |
| 1785 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetTransportSocketPool( |
| 1786 HttpNetworkSession::NORMAL_SOCKET_POOL))); |
| 1787 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetSSLSocketPool( |
| 1788 HttpNetworkSession::NORMAL_SOCKET_POOL))); |
| 1789 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetTransportSocketPool( |
| 1790 HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); |
| 1791 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetSSLSocketPool( |
| 1792 HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); |
| 1793 EXPECT_TRUE(waiter.used_proxy_info().is_direct()); |
| 1794 } |
| 1795 |
| 1662 TEST_P(HttpStreamFactoryTest, RequestBidirectionalStreamJobFailure) { | 1796 TEST_P(HttpStreamFactoryTest, RequestBidirectionalStreamJobFailure) { |
| 1663 SpdySessionDependencies session_deps(GetParam(), | 1797 SpdySessionDependencies session_deps(GetParam(), |
| 1664 ProxyService::CreateDirect()); | 1798 ProxyService::CreateDirect()); |
| 1665 | 1799 |
| 1666 MockRead mock_read(ASYNC, OK); | 1800 MockRead mock_read(ASYNC, OK); |
| 1667 SequencedSocketData socket_data(&mock_read, 1, nullptr, 0); | 1801 SequencedSocketData socket_data(&mock_read, 1, nullptr, 0); |
| 1668 socket_data.set_connect_data(MockConnect(ASYNC, OK)); | 1802 socket_data.set_connect_data(MockConnect(ASYNC, OK)); |
| 1669 session_deps.socket_factory->AddSocketDataProvider(&socket_data); | 1803 session_deps.socket_factory->AddSocketDataProvider(&socket_data); |
| 1670 | 1804 |
| 1671 SSLSocketDataProvider ssl_socket_data(ASYNC, OK); | 1805 SSLSocketDataProvider ssl_socket_data(ASYNC, OK); |
| (...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1907 EXPECT_TRUE(waiter.used_proxy_info().is_direct()); | 2041 EXPECT_TRUE(waiter.used_proxy_info().is_direct()); |
| 1908 | 2042 |
| 1909 // Make sure there is no orphaned job. it is already canceled. | 2043 // Make sure there is no orphaned job. it is already canceled. |
| 1910 ASSERT_EQ(0u, static_cast<HttpStreamFactoryImpl*>( | 2044 ASSERT_EQ(0u, static_cast<HttpStreamFactoryImpl*>( |
| 1911 session->http_stream_factory_for_websocket())->num_orphaned_jobs()); | 2045 session->http_stream_factory_for_websocket())->num_orphaned_jobs()); |
| 1912 } | 2046 } |
| 1913 | 2047 |
| 1914 } // namespace | 2048 } // namespace |
| 1915 | 2049 |
| 1916 } // namespace net | 2050 } // namespace net |
| OLD | NEW |