OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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_network_transaction.h" | 5 #include "net/http/http_network_transaction.h" |
6 | 6 |
7 #include <math.h> // ceil | 7 #include <math.h> // ceil |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
(...skipping 8666 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8677 | 8677 |
8678 // Now that the new handshake has failed, ensure that the client | 8678 // Now that the new handshake has failed, ensure that the client |
8679 // certificate was removed from the client auth cache. | 8679 // certificate was removed from the client auth cache. |
8680 ASSERT_FALSE(session->ssl_client_auth_cache()->Lookup("proxy:70", | 8680 ASSERT_FALSE(session->ssl_client_auth_cache()->Lookup("proxy:70", |
8681 &client_cert)); | 8681 &client_cert)); |
8682 ASSERT_FALSE(session->ssl_client_auth_cache()->Lookup("www.example.com:443", | 8682 ASSERT_FALSE(session->ssl_client_auth_cache()->Lookup("www.example.com:443", |
8683 &client_cert)); | 8683 &client_cert)); |
8684 } | 8684 } |
8685 } | 8685 } |
8686 | 8686 |
| 8687 void IPPoolingPreloadHostCache(MockCachingHostResolver* host_resolver, |
| 8688 SpdySessionPoolPeer* pool_peer) { |
| 8689 const int kTestPort = 443; |
| 8690 struct TestHosts { |
| 8691 std::string name; |
| 8692 std::string iplist; |
| 8693 } test_hosts[] = { |
| 8694 { "www.google.com", "127.0.0.1"}, |
| 8695 }; |
| 8696 |
| 8697 // Preload cache entries into HostCache. |
| 8698 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_hosts); i++) { |
| 8699 host_resolver->rules()->AddIPLiteralRule(test_hosts[i].name, |
| 8700 test_hosts[i].iplist, ""); |
| 8701 |
| 8702 AddressList addresses; |
| 8703 // This test requires that the HostResolver cache be populated. Normal |
| 8704 // code would have done this already, but we do it manually. |
| 8705 HostResolver::RequestInfo info(HostPortPair(test_hosts[i].name, kTestPort)); |
| 8706 host_resolver->Resolve( |
| 8707 info, &addresses, NULL, NULL, BoundNetLog()); |
| 8708 |
| 8709 // Setup a HostPortProxyPair |
| 8710 HostPortProxyPair pair = HostPortProxyPair( |
| 8711 HostPortPair(test_hosts[i].name, kTestPort), ProxyServer::Direct()); |
| 8712 |
| 8713 const addrinfo* address = addresses.head(); |
| 8714 pool_peer->AddAlias(address, pair); |
| 8715 } |
| 8716 } |
| 8717 |
8687 TEST_F(HttpNetworkTransactionTest, UseIPConnectionPooling) { | 8718 TEST_F(HttpNetworkTransactionTest, UseIPConnectionPooling) { |
8688 HttpStreamFactory::set_use_alternate_protocols(true); | 8719 HttpStreamFactory::set_use_alternate_protocols(true); |
8689 HttpStreamFactory::set_next_protos(kExpectedNPNString); | 8720 HttpStreamFactory::set_next_protos(kExpectedNPNString); |
8690 DisableSpdySessionDomainVerification(); | 8721 DisableSpdySessionDomainVerification(); |
8691 | 8722 |
8692 // Set up a special HttpNetworkSession with a MockCachingHostResolver. | 8723 // Set up a special HttpNetworkSession with a MockCachingHostResolver. |
8693 SessionDependencies session_deps; | 8724 SessionDependencies session_deps; |
8694 MockCachingHostResolver host_resolver; | 8725 MockCachingHostResolver host_resolver; |
8695 net::HttpNetworkSession::Params params; | 8726 net::HttpNetworkSession::Params params; |
8696 params.client_socket_factory = &session_deps.socket_factory; | 8727 params.client_socket_factory = &session_deps.socket_factory; |
8697 params.host_resolver = &host_resolver; | 8728 params.host_resolver = &host_resolver; |
8698 params.cert_verifier = session_deps.cert_verifier.get(); | 8729 params.cert_verifier = session_deps.cert_verifier.get(); |
8699 params.proxy_service = session_deps.proxy_service.get(); | 8730 params.proxy_service = session_deps.proxy_service.get(); |
8700 params.ssl_config_service = session_deps.ssl_config_service; | 8731 params.ssl_config_service = session_deps.ssl_config_service; |
8701 params.http_auth_handler_factory = | 8732 params.http_auth_handler_factory = |
8702 session_deps.http_auth_handler_factory.get(); | 8733 session_deps.http_auth_handler_factory.get(); |
8703 params.net_log = session_deps.net_log; | 8734 params.net_log = session_deps.net_log; |
8704 scoped_refptr<HttpNetworkSession> session(new HttpNetworkSession(params)); | 8735 scoped_refptr<HttpNetworkSession> session(new HttpNetworkSession(params)); |
| 8736 SpdySessionPoolPeer pool_peer(session->spdy_session_pool()); |
8705 | 8737 |
8706 SSLSocketDataProvider ssl(true, OK); | 8738 SSLSocketDataProvider ssl(true, OK); |
8707 ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated; | 8739 ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated; |
8708 ssl.next_proto = "spdy/2"; | 8740 ssl.next_proto = "spdy/2"; |
8709 ssl.was_npn_negotiated = true; | 8741 ssl.was_npn_negotiated = true; |
8710 session_deps.socket_factory.AddSSLSocketDataProvider(&ssl); | 8742 session_deps.socket_factory.AddSSLSocketDataProvider(&ssl); |
8711 | 8743 |
8712 scoped_ptr<spdy::SpdyFrame> host1_req(ConstructSpdyGet( | 8744 scoped_ptr<spdy::SpdyFrame> host1_req(ConstructSpdyGet( |
8713 "https://www.google.com", false, 1, LOWEST)); | 8745 "https://www.google.com", false, 1, LOWEST)); |
8714 scoped_ptr<spdy::SpdyFrame> host2_req(ConstructSpdyGet( | 8746 scoped_ptr<spdy::SpdyFrame> host2_req(ConstructSpdyGet( |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8754 std::string response_data; | 8786 std::string response_data; |
8755 ASSERT_EQ(OK, ReadTransaction(&trans1, &response_data)); | 8787 ASSERT_EQ(OK, ReadTransaction(&trans1, &response_data)); |
8756 EXPECT_EQ("hello!", response_data); | 8788 EXPECT_EQ("hello!", response_data); |
8757 | 8789 |
8758 // Preload www.gmail.com into HostCache. | 8790 // Preload www.gmail.com into HostCache. |
8759 HostPortPair host_port("www.gmail.com", 443); | 8791 HostPortPair host_port("www.gmail.com", 443); |
8760 HostResolver::RequestInfo resolve_info(host_port); | 8792 HostResolver::RequestInfo resolve_info(host_port); |
8761 AddressList ignored; | 8793 AddressList ignored; |
8762 host_resolver.Resolve(resolve_info, &ignored, NULL, NULL, BoundNetLog()); | 8794 host_resolver.Resolve(resolve_info, &ignored, NULL, NULL, BoundNetLog()); |
8763 | 8795 |
| 8796 IPPoolingPreloadHostCache(&host_resolver, &pool_peer); |
| 8797 |
8764 HttpRequestInfo request2; | 8798 HttpRequestInfo request2; |
8765 request2.method = "GET"; | 8799 request2.method = "GET"; |
8766 request2.url = GURL("https://www.gmail.com/"); | 8800 request2.url = GURL("https://www.gmail.com/"); |
8767 request2.load_flags = 0; | 8801 request2.load_flags = 0; |
8768 HttpNetworkTransaction trans2(session); | 8802 HttpNetworkTransaction trans2(session); |
8769 | 8803 |
8770 rv = trans2.Start(&request2, &callback, BoundNetLog()); | 8804 rv = trans2.Start(&request2, &callback, BoundNetLog()); |
8771 EXPECT_EQ(ERR_IO_PENDING, rv); | 8805 EXPECT_EQ(ERR_IO_PENDING, rv); |
8772 EXPECT_EQ(OK, callback.WaitForResult()); | 8806 EXPECT_EQ(OK, callback.WaitForResult()); |
8773 | 8807 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8813 } | 8847 } |
8814 | 8848 |
8815 virtual void AddObserver(Observer* observer) { | 8849 virtual void AddObserver(Observer* observer) { |
8816 return host_resolver_.AddObserver(observer); | 8850 return host_resolver_.AddObserver(observer); |
8817 } | 8851 } |
8818 | 8852 |
8819 virtual void RemoveObserver(Observer* observer) { | 8853 virtual void RemoveObserver(Observer* observer) { |
8820 return host_resolver_.RemoveObserver(observer); | 8854 return host_resolver_.RemoveObserver(observer); |
8821 } | 8855 } |
8822 | 8856 |
| 8857 MockCachingHostResolver* GetMockHostResolver() { |
| 8858 return &host_resolver_; |
| 8859 } |
| 8860 |
8823 private: | 8861 private: |
8824 MockCachingHostResolver host_resolver_; | 8862 MockCachingHostResolver host_resolver_; |
8825 const HostPortPair host_port_; | 8863 const HostPortPair host_port_; |
8826 }; | 8864 }; |
8827 | 8865 |
8828 TEST_F(HttpNetworkTransactionTest, | 8866 TEST_F(HttpNetworkTransactionTest, |
8829 UseIPConnectionPoolingWithHostCacheExpiration) { | 8867 UseIPConnectionPoolingWithHostCacheExpiration) { |
8830 HttpStreamFactory::set_use_alternate_protocols(true); | 8868 HttpStreamFactory::set_use_alternate_protocols(true); |
8831 HttpStreamFactory::set_next_protos(kExpectedNPNString); | 8869 HttpStreamFactory::set_next_protos(kExpectedNPNString); |
8832 DisableSpdySessionDomainVerification(); | 8870 DisableSpdySessionDomainVerification(); |
8833 | 8871 |
8834 // Set up a special HttpNetworkSession with a OneTimeCachingHostResolver. | 8872 // Set up a special HttpNetworkSession with a OneTimeCachingHostResolver. |
8835 SessionDependencies session_deps; | 8873 SessionDependencies session_deps; |
8836 OneTimeCachingHostResolver host_resolver(HostPortPair("www.gmail.com", 443)); | 8874 OneTimeCachingHostResolver host_resolver(HostPortPair("www.gmail.com", 443)); |
8837 net::HttpNetworkSession::Params params; | 8875 net::HttpNetworkSession::Params params; |
8838 params.client_socket_factory = &session_deps.socket_factory; | 8876 params.client_socket_factory = &session_deps.socket_factory; |
8839 params.host_resolver = &host_resolver; | 8877 params.host_resolver = &host_resolver; |
8840 params.cert_verifier = session_deps.cert_verifier.get(); | 8878 params.cert_verifier = session_deps.cert_verifier.get(); |
8841 params.proxy_service = session_deps.proxy_service.get(); | 8879 params.proxy_service = session_deps.proxy_service.get(); |
8842 params.ssl_config_service = session_deps.ssl_config_service; | 8880 params.ssl_config_service = session_deps.ssl_config_service; |
8843 params.http_auth_handler_factory = | 8881 params.http_auth_handler_factory = |
8844 session_deps.http_auth_handler_factory.get(); | 8882 session_deps.http_auth_handler_factory.get(); |
8845 params.net_log = session_deps.net_log; | 8883 params.net_log = session_deps.net_log; |
8846 scoped_refptr<HttpNetworkSession> session(new HttpNetworkSession(params)); | 8884 scoped_refptr<HttpNetworkSession> session(new HttpNetworkSession(params)); |
| 8885 SpdySessionPoolPeer pool_peer(session->spdy_session_pool()); |
8847 | 8886 |
8848 SSLSocketDataProvider ssl(true, OK); | 8887 SSLSocketDataProvider ssl(true, OK); |
8849 ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated; | 8888 ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated; |
8850 ssl.next_proto = "spdy/2"; | 8889 ssl.next_proto = "spdy/2"; |
8851 ssl.was_npn_negotiated = true; | 8890 ssl.was_npn_negotiated = true; |
8852 session_deps.socket_factory.AddSSLSocketDataProvider(&ssl); | 8891 session_deps.socket_factory.AddSSLSocketDataProvider(&ssl); |
8853 | 8892 |
8854 scoped_ptr<spdy::SpdyFrame> host1_req(ConstructSpdyGet( | 8893 scoped_ptr<spdy::SpdyFrame> host1_req(ConstructSpdyGet( |
8855 "https://www.google.com", false, 1, LOWEST)); | 8894 "https://www.google.com", false, 1, LOWEST)); |
8856 scoped_ptr<spdy::SpdyFrame> host2_req(ConstructSpdyGet( | 8895 scoped_ptr<spdy::SpdyFrame> host2_req(ConstructSpdyGet( |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8901 HostResolver::RequestInfo resolve_info(HostPortPair("www.gmail.com", 443)); | 8940 HostResolver::RequestInfo resolve_info(HostPortPair("www.gmail.com", 443)); |
8902 AddressList ignored; | 8941 AddressList ignored; |
8903 host_resolver.Resolve(resolve_info, &ignored, NULL, NULL, BoundNetLog()); | 8942 host_resolver.Resolve(resolve_info, &ignored, NULL, NULL, BoundNetLog()); |
8904 | 8943 |
8905 HttpRequestInfo request2; | 8944 HttpRequestInfo request2; |
8906 request2.method = "GET"; | 8945 request2.method = "GET"; |
8907 request2.url = GURL("https://www.gmail.com/"); | 8946 request2.url = GURL("https://www.gmail.com/"); |
8908 request2.load_flags = 0; | 8947 request2.load_flags = 0; |
8909 HttpNetworkTransaction trans2(session); | 8948 HttpNetworkTransaction trans2(session); |
8910 | 8949 |
| 8950 IPPoolingPreloadHostCache(host_resolver.GetMockHostResolver(), &pool_peer); |
| 8951 |
8911 rv = trans2.Start(&request2, &callback, BoundNetLog()); | 8952 rv = trans2.Start(&request2, &callback, BoundNetLog()); |
8912 EXPECT_EQ(ERR_IO_PENDING, rv); | 8953 EXPECT_EQ(ERR_IO_PENDING, rv); |
8913 EXPECT_EQ(OK, callback.WaitForResult()); | 8954 EXPECT_EQ(OK, callback.WaitForResult()); |
8914 | 8955 |
8915 response = trans2.GetResponseInfo(); | 8956 response = trans2.GetResponseInfo(); |
8916 ASSERT_TRUE(response != NULL); | 8957 ASSERT_TRUE(response != NULL); |
8917 ASSERT_TRUE(response->headers != NULL); | 8958 ASSERT_TRUE(response->headers != NULL); |
8918 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); | 8959 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
8919 EXPECT_TRUE(response->was_fetched_via_spdy); | 8960 EXPECT_TRUE(response->was_fetched_via_spdy); |
8920 EXPECT_TRUE(response->was_npn_negotiated); | 8961 EXPECT_TRUE(response->was_npn_negotiated); |
8921 ASSERT_EQ(OK, ReadTransaction(&trans2, &response_data)); | 8962 ASSERT_EQ(OK, ReadTransaction(&trans2, &response_data)); |
8922 EXPECT_EQ("hello!", response_data); | 8963 EXPECT_EQ("hello!", response_data); |
8923 | 8964 |
8924 HttpStreamFactory::set_next_protos(""); | 8965 HttpStreamFactory::set_next_protos(""); |
8925 HttpStreamFactory::set_use_alternate_protocols(false); | 8966 HttpStreamFactory::set_use_alternate_protocols(false); |
8926 } | 8967 } |
8927 | 8968 |
8928 } // namespace net | 8969 } // namespace net |
OLD | NEW |