| 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 |