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 | 8 |
9 #include <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
11 | 11 |
12 #include "base/basictypes.h" | 12 #include "base/basictypes.h" |
13 #include "base/compiler_specific.h" | 13 #include "base/compiler_specific.h" |
14 #include "net/base/port_util.h" | 14 #include "net/base/port_util.h" |
15 #include "net/base/test_completion_callback.h" | 15 #include "net/base/test_completion_callback.h" |
16 #include "net/cert/mock_cert_verifier.h" | 16 #include "net/cert/mock_cert_verifier.h" |
17 #include "net/dns/mock_host_resolver.h" | 17 #include "net/dns/mock_host_resolver.h" |
18 #include "net/http/http_auth_handler_factory.h" | 18 #include "net/http/http_auth_handler_factory.h" |
19 #include "net/http/http_network_session.h" | 19 #include "net/http/http_network_session.h" |
20 #include "net/http/http_network_session_peer.h" | 20 #include "net/http/http_network_session_peer.h" |
21 #include "net/http/http_network_transaction.h" | 21 #include "net/http/http_network_transaction.h" |
22 #include "net/http/http_request_info.h" | 22 #include "net/http/http_request_info.h" |
23 #include "net/http/http_server_properties.h" | 23 #include "net/http/http_server_properties.h" |
24 #include "net/http/http_server_properties_impl.h" | 24 #include "net/http/http_server_properties_impl.h" |
25 #include "net/http/http_stream.h" | 25 #include "net/http/http_stream.h" |
26 #include "net/http/transport_security_state.h" | 26 #include "net/http/transport_security_state.h" |
27 #include "net/log/net_log.h" | 27 #include "net/log/net_log.h" |
28 #include "net/proxy/proxy_info.h" | 28 #include "net/proxy/proxy_info.h" |
29 #include "net/proxy/proxy_service.h" | 29 #include "net/proxy/proxy_service.h" |
| 30 #include "net/quic/quic_server_id.h" |
| 31 #include "net/quic/test_tools/quic_stream_factory_peer.h" |
30 #include "net/socket/client_socket_handle.h" | 32 #include "net/socket/client_socket_handle.h" |
31 #include "net/socket/mock_client_socket_pool_manager.h" | 33 #include "net/socket/mock_client_socket_pool_manager.h" |
32 #include "net/socket/next_proto.h" | 34 #include "net/socket/next_proto.h" |
33 #include "net/socket/socket_test_util.h" | 35 #include "net/socket/socket_test_util.h" |
34 #include "net/spdy/spdy_session.h" | 36 #include "net/spdy/spdy_session.h" |
35 #include "net/spdy/spdy_session_pool.h" | 37 #include "net/spdy/spdy_session_pool.h" |
36 #include "net/spdy/spdy_test_util_common.h" | 38 #include "net/spdy/spdy_test_util_common.h" |
37 #include "net/ssl/ssl_config_service.h" | 39 #include "net/ssl/ssl_config_service.h" |
38 #include "net/ssl/ssl_config_service_defaults.h" | 40 #include "net/ssl/ssl_config_service_defaults.h" |
39 // This file can be included from net/http even though | 41 // This file can be included from net/http even though |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
109 | 111 |
110 // HttpStreamFactoryImpl subclass that can wait until a preconnect is complete. | 112 // HttpStreamFactoryImpl subclass that can wait until a preconnect is complete. |
111 class MockHttpStreamFactoryImplForPreconnect : public HttpStreamFactoryImpl { | 113 class MockHttpStreamFactoryImplForPreconnect : public HttpStreamFactoryImpl { |
112 public: | 114 public: |
113 MockHttpStreamFactoryImplForPreconnect(HttpNetworkSession* session, | 115 MockHttpStreamFactoryImplForPreconnect(HttpNetworkSession* session, |
114 bool for_websockets) | 116 bool for_websockets) |
115 : HttpStreamFactoryImpl(session, for_websockets), | 117 : HttpStreamFactoryImpl(session, for_websockets), |
116 preconnect_done_(false), | 118 preconnect_done_(false), |
117 waiting_for_preconnect_(false) {} | 119 waiting_for_preconnect_(false) {} |
118 | 120 |
119 | |
120 void WaitForPreconnects() { | 121 void WaitForPreconnects() { |
121 while (!preconnect_done_) { | 122 while (!preconnect_done_) { |
122 waiting_for_preconnect_ = true; | 123 waiting_for_preconnect_ = true; |
123 base::MessageLoop::current()->Run(); | 124 base::MessageLoop::current()->Run(); |
124 waiting_for_preconnect_ = false; | 125 waiting_for_preconnect_ = false; |
125 } | 126 } |
126 } | 127 } |
127 | 128 |
128 private: | 129 private: |
129 // HttpStreamFactoryImpl methods. | 130 // HttpStreamFactoryImpl methods. |
(...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
632 ERR_QUIC_HANDSHAKE_FAILED, | 633 ERR_QUIC_HANDSHAKE_FAILED, |
633 ERR_SSL_PROTOCOL_ERROR, | 634 ERR_SSL_PROTOCOL_ERROR, |
634 ERR_MSG_TOO_BIG}; | 635 ERR_MSG_TOO_BIG}; |
635 for (size_t i = 0; i < arraysize(mock_error); ++i) { | 636 for (size_t i = 0; i < arraysize(mock_error); ++i) { |
636 scoped_ptr<ProxyService> proxy_service; | 637 scoped_ptr<ProxyService> proxy_service; |
637 proxy_service = | 638 proxy_service = |
638 ProxyService::CreateFixedFromPacResult("QUIC bad:99; DIRECT"); | 639 ProxyService::CreateFixedFromPacResult("QUIC bad:99; DIRECT"); |
639 | 640 |
640 HttpNetworkSession::Params params; | 641 HttpNetworkSession::Params params; |
641 params.enable_quic = true; | 642 params.enable_quic = true; |
| 643 params.quic_disable_preconnect_if_0rtt = false; |
642 params.enable_quic_for_proxies = true; | 644 params.enable_quic_for_proxies = true; |
643 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service( | 645 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service( |
644 new SSLConfigServiceDefaults); | 646 new SSLConfigServiceDefaults); |
645 HttpServerPropertiesImpl http_server_properties; | 647 HttpServerPropertiesImpl http_server_properties; |
646 MockClientSocketFactory socket_factory; | 648 MockClientSocketFactory socket_factory; |
647 params.client_socket_factory = &socket_factory; | 649 params.client_socket_factory = &socket_factory; |
648 MockHostResolver host_resolver; | 650 MockHostResolver host_resolver; |
649 params.host_resolver = &host_resolver; | 651 params.host_resolver = &host_resolver; |
650 TransportSecurityState transport_security_state; | 652 TransportSecurityState transport_security_state; |
651 params.transport_security_state = &transport_security_state; | 653 params.transport_security_state = &transport_security_state; |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
693 } // namespace | 695 } // namespace |
694 | 696 |
695 TEST_P(HttpStreamFactoryTest, QuicLossyProxyMarkedAsBad) { | 697 TEST_P(HttpStreamFactoryTest, QuicLossyProxyMarkedAsBad) { |
696 // Checks if a | 698 // Checks if a |
697 scoped_ptr<ProxyService> proxy_service; | 699 scoped_ptr<ProxyService> proxy_service; |
698 proxy_service = ProxyService::CreateFixedFromPacResult("QUIC bad:99; DIRECT"); | 700 proxy_service = ProxyService::CreateFixedFromPacResult("QUIC bad:99; DIRECT"); |
699 | 701 |
700 HttpNetworkSession::Params params; | 702 HttpNetworkSession::Params params; |
701 params.enable_quic = true; | 703 params.enable_quic = true; |
702 params.enable_quic_for_proxies = true; | 704 params.enable_quic_for_proxies = true; |
| 705 params.quic_disable_preconnect_if_0rtt = false; |
703 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service( | 706 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service( |
704 new SSLConfigServiceDefaults); | 707 new SSLConfigServiceDefaults); |
705 HttpServerPropertiesImpl http_server_properties; | 708 HttpServerPropertiesImpl http_server_properties; |
706 MockClientSocketFactory socket_factory; | 709 MockClientSocketFactory socket_factory; |
707 params.client_socket_factory = &socket_factory; | 710 params.client_socket_factory = &socket_factory; |
708 MockHostResolver host_resolver; | 711 MockHostResolver host_resolver; |
709 params.host_resolver = &host_resolver; | 712 params.host_resolver = &host_resolver; |
710 TransportSecurityState transport_security_state; | 713 TransportSecurityState transport_security_state; |
711 params.transport_security_state = &transport_security_state; | 714 params.transport_security_state = &transport_security_state; |
712 params.proxy_service = proxy_service.get(); | 715 params.proxy_service = proxy_service.get(); |
(...skipping 28 matching lines...) Expand all Loading... |
741 // The proxy that failed should now be known to the proxy_service as bad. | 744 // The proxy that failed should now be known to the proxy_service as bad. |
742 const ProxyRetryInfoMap& retry_info = | 745 const ProxyRetryInfoMap& retry_info = |
743 session->proxy_service()->proxy_retry_info(); | 746 session->proxy_service()->proxy_retry_info(); |
744 EXPECT_EQ(1u, retry_info.size()); | 747 EXPECT_EQ(1u, retry_info.size()); |
745 EXPECT_TRUE(waiter.used_proxy_info().is_direct()); | 748 EXPECT_TRUE(waiter.used_proxy_info().is_direct()); |
746 | 749 |
747 ProxyRetryInfoMap::const_iterator iter = retry_info.find("quic://bad:99"); | 750 ProxyRetryInfoMap::const_iterator iter = retry_info.find("quic://bad:99"); |
748 EXPECT_TRUE(iter != retry_info.end()); | 751 EXPECT_TRUE(iter != retry_info.end()); |
749 } | 752 } |
750 | 753 |
| 754 TEST_P(HttpStreamFactoryTest, UsePreConnectIfNoZeroRTT) { |
| 755 for (int num_streams = 1; num_streams < 3; ++num_streams) { |
| 756 GURL url = GURL("https://www.google.com"); |
| 757 |
| 758 // Set up QUIC as alternative_service. |
| 759 HttpServerPropertiesImpl http_server_properties; |
| 760 const AlternativeService alternative_service(QUIC, url.host().c_str(), |
| 761 url.IntPort()); |
| 762 AlternativeServiceInfoVector alternative_service_info_vector; |
| 763 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); |
| 764 alternative_service_info_vector.push_back( |
| 765 AlternativeServiceInfo(alternative_service, 1.0, expiration)); |
| 766 HostPortPair host_port_pair(alternative_service.host_port_pair()); |
| 767 http_server_properties.SetAlternativeServices( |
| 768 host_port_pair, alternative_service_info_vector); |
| 769 |
| 770 SpdySessionDependencies session_deps( |
| 771 GetParam(), ProxyService::CreateFixed("http_proxy")); |
| 772 |
| 773 // Setup params to disable preconnect, but QUIC doesn't 0RTT. |
| 774 HttpNetworkSession::Params params = |
| 775 SpdySessionDependencies::CreateSessionParams(&session_deps); |
| 776 params.enable_quic = true; |
| 777 params.quic_disable_preconnect_if_0rtt = true; |
| 778 params.http_server_properties = http_server_properties.GetWeakPtr(); |
| 779 |
| 780 scoped_ptr<HttpNetworkSession> session(new HttpNetworkSession(params)); |
| 781 HttpNetworkSessionPeer peer(session.get()); |
| 782 HostPortPair proxy_host("http_proxy", 80); |
| 783 CapturePreconnectsHttpProxySocketPool* http_proxy_pool = |
| 784 new CapturePreconnectsHttpProxySocketPool( |
| 785 session_deps.host_resolver.get(), session_deps.cert_verifier.get()); |
| 786 CapturePreconnectsSSLSocketPool* ssl_conn_pool = |
| 787 new CapturePreconnectsSSLSocketPool(session_deps.host_resolver.get(), |
| 788 session_deps.cert_verifier.get()); |
| 789 scoped_ptr<MockClientSocketPoolManager> mock_pool_manager( |
| 790 new MockClientSocketPoolManager); |
| 791 mock_pool_manager->SetSocketPoolForHTTPProxy(proxy_host, http_proxy_pool); |
| 792 mock_pool_manager->SetSocketPoolForSSLWithProxy(proxy_host, ssl_conn_pool); |
| 793 peer.SetClientSocketPoolManager(mock_pool_manager.Pass()); |
| 794 PreconnectHelperForURL(num_streams, url, session.get()); |
| 795 EXPECT_EQ(num_streams, ssl_conn_pool->last_num_streams()); |
| 796 } |
| 797 } |
| 798 |
| 799 TEST_P(HttpStreamFactoryTest, QuicDisablePreConnectIfZeroRtt) { |
| 800 for (int num_streams = 1; num_streams < 3; ++num_streams) { |
| 801 GURL url = GURL("https://www.google.com"); |
| 802 |
| 803 // Set up QUIC as alternative_service. |
| 804 HttpServerPropertiesImpl http_server_properties; |
| 805 const AlternativeService alternative_service(QUIC, "www.google.com", 443); |
| 806 AlternativeServiceInfoVector alternative_service_info_vector; |
| 807 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); |
| 808 alternative_service_info_vector.push_back( |
| 809 AlternativeServiceInfo(alternative_service, 1.0, expiration)); |
| 810 HostPortPair host_port_pair(alternative_service.host_port_pair()); |
| 811 http_server_properties.SetAlternativeServices( |
| 812 host_port_pair, alternative_service_info_vector); |
| 813 |
| 814 SpdySessionDependencies session_deps(GetParam()); |
| 815 |
| 816 // Setup params to disable preconnect, but QUIC does 0RTT. |
| 817 HttpNetworkSession::Params params = |
| 818 SpdySessionDependencies::CreateSessionParams(&session_deps); |
| 819 params.enable_quic = true; |
| 820 params.quic_disable_preconnect_if_0rtt = true; |
| 821 params.http_server_properties = http_server_properties.GetWeakPtr(); |
| 822 |
| 823 scoped_ptr<HttpNetworkSession> session(new HttpNetworkSession(params)); |
| 824 |
| 825 // Setup 0RTT for QUIC. |
| 826 QuicStreamFactory* factory = session->quic_stream_factory(); |
| 827 factory->set_require_confirmation(false); |
| 828 test::QuicStreamFactoryPeer::CacheDummyServerConfig( |
| 829 factory, QuicServerId(host_port_pair, PRIVACY_MODE_DISABLED)); |
| 830 |
| 831 HttpNetworkSessionPeer peer(session.get()); |
| 832 CapturePreconnectsTransportSocketPool* transport_conn_pool = |
| 833 new CapturePreconnectsTransportSocketPool( |
| 834 session_deps.host_resolver.get(), session_deps.cert_verifier.get()); |
| 835 scoped_ptr<MockClientSocketPoolManager> mock_pool_manager( |
| 836 new MockClientSocketPoolManager); |
| 837 mock_pool_manager->SetTransportSocketPool(transport_conn_pool); |
| 838 peer.SetClientSocketPoolManager(mock_pool_manager.Pass()); |
| 839 |
| 840 HttpRequestInfo request; |
| 841 request.method = "GET"; |
| 842 request.url = url; |
| 843 request.load_flags = 0; |
| 844 |
| 845 SSLConfig ssl_config; |
| 846 session->ssl_config_service()->GetSSLConfig(&ssl_config); |
| 847 session->http_stream_factory()->PreconnectStreams(num_streams, request, |
| 848 ssl_config, ssl_config); |
| 849 EXPECT_EQ(-1, transport_conn_pool->last_num_streams()); |
| 850 } |
| 851 } |
| 852 |
751 namespace { | 853 namespace { |
752 | 854 |
753 TEST_P(HttpStreamFactoryTest, PrivacyModeDisablesChannelId) { | 855 TEST_P(HttpStreamFactoryTest, PrivacyModeDisablesChannelId) { |
754 SpdySessionDependencies session_deps( | 856 SpdySessionDependencies session_deps( |
755 GetParam(), ProxyService::CreateDirect()); | 857 GetParam(), ProxyService::CreateDirect()); |
756 | 858 |
757 StaticSocketDataProvider socket_data; | 859 StaticSocketDataProvider socket_data; |
758 socket_data.set_connect_data(MockConnect(ASYNC, OK)); | 860 socket_data.set_connect_data(MockConnect(ASYNC, OK)); |
759 session_deps.socket_factory->AddSocketDataProvider(&socket_data); | 861 session_deps.socket_factory->AddSocketDataProvider(&socket_data); |
760 | 862 |
(...skipping 679 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1440 EXPECT_TRUE(waiter.used_proxy_info().is_direct()); | 1542 EXPECT_TRUE(waiter.used_proxy_info().is_direct()); |
1441 | 1543 |
1442 // Make sure there is no orphaned job. it is already canceled. | 1544 // Make sure there is no orphaned job. it is already canceled. |
1443 ASSERT_EQ(0u, static_cast<HttpStreamFactoryImpl*>( | 1545 ASSERT_EQ(0u, static_cast<HttpStreamFactoryImpl*>( |
1444 session->http_stream_factory_for_websocket())->num_orphaned_jobs()); | 1546 session->http_stream_factory_for_websocket())->num_orphaned_jobs()); |
1445 } | 1547 } |
1446 | 1548 |
1447 } // namespace | 1549 } // namespace |
1448 | 1550 |
1449 } // namespace net | 1551 } // namespace net |
OLD | NEW |