| Index: net/socket/ssl_client_socket_pool_unittest.cc
|
| ===================================================================
|
| --- net/socket/ssl_client_socket_pool_unittest.cc (revision 54615)
|
| +++ net/socket/ssl_client_socket_pool_unittest.cc (working copy)
|
| @@ -6,14 +6,13 @@
|
|
|
| #include "base/callback.h"
|
| #include "base/compiler_specific.h"
|
| -#include "base/string_util.h"
|
| #include "base/time.h"
|
| #include "net/base/auth.h"
|
| #include "net/base/mock_host_resolver.h"
|
| #include "net/base/net_errors.h"
|
| #include "net/base/test_completion_callback.h"
|
| #include "net/base/ssl_config_service_defaults.h"
|
| -#include "net/http/http_auth_handler_factory.h"
|
| +#include "net/http/http_auth_controller.h"
|
| #include "net/http/http_network_session.h"
|
| #include "net/http/http_request_headers.h"
|
| #include "net/http/http_response_headers.h"
|
| @@ -21,7 +20,6 @@
|
| #include "net/socket/client_socket_handle.h"
|
| #include "net/socket/client_socket_pool_histograms.h"
|
| #include "net/socket/socket_test_util.h"
|
| -#include "net/spdy/spdy_session_pool.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| namespace net {
|
| @@ -34,16 +32,7 @@
|
| class SSLClientSocketPoolTest : public ClientSocketPoolTest {
|
| protected:
|
| SSLClientSocketPoolTest()
|
| - : http_auth_handler_factory_(HttpAuthHandlerFactory::CreateDefault()),
|
| - session_(new HttpNetworkSession(new MockHostResolver,
|
| - ProxyService::CreateNull(),
|
| - &socket_factory_,
|
| - new SSLConfigServiceDefaults,
|
| - new SpdySessionPool(),
|
| - http_auth_handler_factory_.get(),
|
| - NULL,
|
| - NULL)),
|
| - direct_tcp_socket_params_(new TCPSocketParams(
|
| + : direct_tcp_socket_params_(new TCPSocketParams(
|
| HostPortPair("host", 443), MEDIUM, GURL(), false)),
|
| tcp_socket_pool_(new MockTCPClientSocketPool(
|
| kMaxSockets,
|
| @@ -52,9 +41,6 @@
|
| &socket_factory_)),
|
| proxy_tcp_socket_params_(new TCPSocketParams(
|
| HostPortPair("proxy", 443), MEDIUM, GURL(), false)),
|
| - http_proxy_socket_params_(new HttpProxySocketParams(
|
| - proxy_tcp_socket_params_, GURL("http://host"),
|
| - HostPortPair("host", 80), session_, true)),
|
| http_proxy_socket_pool_(new HttpProxyClientSocketPool(
|
| kMaxSockets,
|
| kMaxSocketsPerGroup,
|
| @@ -88,30 +74,33 @@
|
| NULL);
|
| }
|
|
|
| - scoped_refptr<SSLSocketParams> SSLParams(ProxyServer::Scheme proxy,
|
| - bool want_spdy_over_npn) {
|
| + scoped_refptr<SSLSocketParams> SSLParams(
|
| + ProxyServer::Scheme proxy, struct MockHttpAuthControllerData* auth_data,
|
| + size_t auth_data_len, bool want_spdy_over_ssl, bool want_spdy_over_npn) {
|
| + scoped_refptr<HttpProxySocketParams> http_proxy_params;
|
| + if (proxy == ProxyServer::SCHEME_HTTP) {
|
| + scoped_refptr<MockHttpAuthController> auth_controller =
|
| + new MockHttpAuthController();
|
| + auth_controller->SetMockAuthControllerData(auth_data, auth_data_len);
|
| + http_proxy_params = new HttpProxySocketParams(proxy_tcp_socket_params_,
|
| + GURL("http://host"),
|
| + HostPortPair("host", 80),
|
| + auth_controller, true);
|
| + }
|
| +
|
| return make_scoped_refptr(new SSLSocketParams(
|
| proxy == ProxyServer::SCHEME_DIRECT ? direct_tcp_socket_params_ : NULL,
|
| - proxy == ProxyServer::SCHEME_HTTP ? http_proxy_socket_params_ : NULL,
|
| + http_proxy_params,
|
| proxy == ProxyServer::SCHEME_SOCKS5 ? socks_socket_params_ : NULL,
|
| proxy,
|
| "host",
|
| ssl_config_,
|
| 0,
|
| - false,
|
| + want_spdy_over_ssl,
|
| want_spdy_over_npn));
|
| }
|
|
|
| - void AddAuthToCache() {
|
| - const string16 kFoo(ASCIIToUTF16("foo"));
|
| - const string16 kBar(ASCIIToUTF16("bar"));
|
| - session_->auth_cache()->Add(GURL("http://proxy:443/"), "MyRealm1", "Basic",
|
| - "Basic realm=MyRealm1", kFoo, kBar, "/");
|
| - }
|
| -
|
| MockClientSocketFactory socket_factory_;
|
| - scoped_ptr<HttpAuthHandlerFactory> http_auth_handler_factory_;
|
| - scoped_refptr<HttpNetworkSession> session_;
|
|
|
| scoped_refptr<TCPSocketParams> direct_tcp_socket_params_;
|
| scoped_refptr<MockTCPClientSocketPool> tcp_socket_pool_;
|
| @@ -134,7 +123,7 @@
|
|
|
| CreatePool(true /* tcp pool */, false, false);
|
| scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
|
| - false);
|
| + NULL, 0, false, false);
|
|
|
| ClientSocketHandle handle;
|
| int rv = handle.Init("a", params, MEDIUM, NULL, pool_, BoundNetLog());
|
| @@ -151,7 +140,7 @@
|
|
|
| CreatePool(true /* tcp pool */, false, false);
|
| scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
|
| - false);
|
| + NULL, 0, false, false);
|
|
|
| ClientSocketHandle handle;
|
| TestCompletionCallback callback;
|
| @@ -175,7 +164,7 @@
|
|
|
| CreatePool(true /* tcp pool */, false, false);
|
| scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
|
| - false);
|
| + NULL, 0, false, false);
|
|
|
| ClientSocketHandle handle;
|
| TestCompletionCallback callback;
|
| @@ -193,7 +182,7 @@
|
|
|
| CreatePool(true /* tcp pool */, false, false);
|
| scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
|
| - false);
|
| + NULL, 0, false, false);
|
|
|
| ClientSocketHandle handle;
|
| TestCompletionCallback callback;
|
| @@ -215,7 +204,7 @@
|
|
|
| CreatePool(true /* tcp pool */, false, false);
|
| scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
|
| - false);
|
| + NULL, 0, false, false);
|
|
|
| ClientSocketHandle handle;
|
| TestCompletionCallback callback;
|
| @@ -237,7 +226,7 @@
|
|
|
| CreatePool(true /* tcp pool */, false, false);
|
| scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
|
| - false);
|
| + NULL, 0, false, false);
|
|
|
| ClientSocketHandle handle;
|
| TestCompletionCallback callback;
|
| @@ -262,7 +251,7 @@
|
|
|
| CreatePool(true /* tcp pool */, false, false);
|
| scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
|
| - false);
|
| + NULL, 0, false, false);
|
|
|
| ClientSocketHandle handle;
|
| TestCompletionCallback callback;
|
| @@ -288,7 +277,7 @@
|
|
|
| CreatePool(true /* tcp pool */, false, false);
|
| scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
|
| - true);
|
| + NULL, 0, false, true);
|
|
|
| ClientSocketHandle handle;
|
| TestCompletionCallback callback;
|
| @@ -313,7 +302,7 @@
|
|
|
| CreatePool(true /* tcp pool */, false, false);
|
| scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
|
| - true);
|
| + NULL, 0, false, true);
|
|
|
| ClientSocketHandle handle;
|
| TestCompletionCallback callback;
|
| @@ -344,7 +333,7 @@
|
|
|
| CreatePool(true /* tcp pool */, false, false);
|
| scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
|
| - true);
|
| + NULL, 0, false, true);
|
|
|
| ClientSocketHandle handle;
|
| TestCompletionCallback callback;
|
| @@ -372,7 +361,7 @@
|
|
|
| CreatePool(false, true /* http proxy pool */, true /* socks pool */);
|
| scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_SOCKS5,
|
| - false);
|
| + NULL, 0, false, false);
|
|
|
| ClientSocketHandle handle;
|
| TestCompletionCallback callback;
|
| @@ -390,7 +379,7 @@
|
|
|
| CreatePool(false, true /* http proxy pool */, true /* socks pool */);
|
| scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_SOCKS5,
|
| - false);
|
| + NULL, 0, false, false);
|
|
|
| ClientSocketHandle handle;
|
| TestCompletionCallback callback;
|
| @@ -414,7 +403,7 @@
|
|
|
| CreatePool(false, true /* http proxy pool */, true /* socks pool */);
|
| scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_SOCKS5,
|
| - false);
|
| + NULL, 0, false, false);
|
|
|
| ClientSocketHandle handle;
|
| TestCompletionCallback callback;
|
| @@ -432,7 +421,7 @@
|
|
|
| CreatePool(false, true /* http proxy pool */, true /* socks pool */);
|
| scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_SOCKS5,
|
| - false);
|
| + NULL, 0, false, false);
|
|
|
| ClientSocketHandle handle;
|
| TestCompletionCallback callback;
|
| @@ -453,7 +442,7 @@
|
|
|
| CreatePool(false, true /* http proxy pool */, true /* socks pool */);
|
| scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP,
|
| - false);
|
| + NULL, 0, false, false);
|
|
|
| ClientSocketHandle handle;
|
| TestCompletionCallback callback;
|
| @@ -471,7 +460,7 @@
|
|
|
| CreatePool(false, true /* http proxy pool */, true /* socks pool */);
|
| scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP,
|
| - false);
|
| + NULL, 0, false, false);
|
|
|
| ClientSocketHandle handle;
|
| TestCompletionCallback callback;
|
| @@ -492,7 +481,7 @@
|
| "CONNECT host:80 HTTP/1.1\r\n"
|
| "Host: host\r\n"
|
| "Proxy-Connection: keep-alive\r\n"
|
| - "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"),
|
| + "Proxy-Authorization: Basic Zm9vOmJheg==\r\n\r\n"),
|
| };
|
| MockRead reads[] = {
|
| MockRead(false, "HTTP/1.1 200 Connection Established\r\n\r\n"),
|
| @@ -501,12 +490,17 @@
|
| arraysize(writes));
|
| data.set_connect_data(MockConnect(false, OK));
|
| socket_factory_.AddSocketDataProvider(&data);
|
| - AddAuthToCache();
|
| + MockHttpAuthControllerData auth_data[] = {
|
| + MockHttpAuthControllerData("Proxy-Authorization: Basic Zm9vOmJheg=="),
|
| + };
|
| SSLSocketDataProvider ssl(false, OK);
|
| socket_factory_.AddSSLSocketDataProvider(&ssl);
|
|
|
| CreatePool(false, true /* http proxy pool */, true /* socks pool */);
|
| scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP,
|
| + auth_data,
|
| + arraysize(auth_data),
|
| + false,
|
| false);
|
|
|
| ClientSocketHandle handle;
|
| @@ -522,7 +516,7 @@
|
| MockWrite("CONNECT host:80 HTTP/1.1\r\n"
|
| "Host: host\r\n"
|
| "Proxy-Connection: keep-alive\r\n"
|
| - "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"),
|
| + "Proxy-Authorization: Basic Zm9vOmJheg==\r\n\r\n"),
|
| };
|
| MockRead reads[] = {
|
| MockRead("HTTP/1.1 200 Connection Established\r\n\r\n"),
|
| @@ -530,12 +524,17 @@
|
| StaticSocketDataProvider data(reads, arraysize(reads), writes,
|
| arraysize(writes));
|
| socket_factory_.AddSocketDataProvider(&data);
|
| - AddAuthToCache();
|
| + MockHttpAuthControllerData auth_data[] = {
|
| + MockHttpAuthControllerData("Proxy-Authorization: Basic Zm9vOmJheg=="),
|
| + };
|
| SSLSocketDataProvider ssl(true, OK);
|
| socket_factory_.AddSSLSocketDataProvider(&ssl);
|
|
|
| CreatePool(false, true /* http proxy pool */, true /* socks pool */);
|
| scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP,
|
| + auth_data,
|
| + arraysize(auth_data),
|
| + false,
|
| false);
|
|
|
| ClientSocketHandle handle;
|
| @@ -565,11 +564,17 @@
|
| StaticSocketDataProvider data(reads, arraysize(reads), writes,
|
| arraysize(writes));
|
| socket_factory_.AddSocketDataProvider(&data);
|
| + MockHttpAuthControllerData auth_data[] = {
|
| + MockHttpAuthControllerData(""),
|
| + };
|
| SSLSocketDataProvider ssl(true, OK);
|
| socket_factory_.AddSSLSocketDataProvider(&ssl);
|
|
|
| CreatePool(false, true /* http proxy pool */, true /* socks pool */);
|
| scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP,
|
| + auth_data,
|
| + arraysize(auth_data),
|
| + false,
|
| false);
|
|
|
| ClientSocketHandle handle;
|
| @@ -585,12 +590,137 @@
|
| EXPECT_FALSE(handle.is_ssl_error());
|
| const HttpResponseInfo& tunnel_info = handle.ssl_error_response_info();
|
| EXPECT_EQ(tunnel_info.headers->response_code(), 407);
|
| - scoped_ptr<ClientSocketHandle> tunnel_handle(
|
| - handle.release_pending_http_proxy_connection());
|
| - EXPECT_TRUE(tunnel_handle->socket());
|
| - EXPECT_FALSE(tunnel_handle->socket()->IsConnected());
|
| }
|
|
|
| +TEST_F(SSLClientSocketPoolTest, DoProxyAuth) {
|
| + MockWrite writes[] = {
|
| + MockWrite("CONNECT host:80 HTTP/1.1\r\n"
|
| + "Host: host\r\n"
|
| + "Proxy-Connection: keep-alive\r\n\r\n"),
|
| + MockWrite("CONNECT host:80 HTTP/1.1\r\n"
|
| + "Host: host\r\n"
|
| + "Proxy-Connection: keep-alive\r\n"
|
| + "Proxy-Authorization: Basic Zm9vOmJheg==\r\n\r\n"),
|
| + };
|
| + MockRead reads[] = {
|
| + MockRead("HTTP/1.1 407 Proxy Authentication Required\r\n"),
|
| + MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"),
|
| + MockRead("Content-Length: 10\r\n\r\n"),
|
| + MockRead("0123456789"),
|
| + MockRead("HTTP/1.1 200 Connection Established\r\n\r\n"),
|
| + };
|
| + StaticSocketDataProvider data(reads, arraysize(reads), writes,
|
| + arraysize(writes));
|
| + socket_factory_.AddSocketDataProvider(&data);
|
| + MockHttpAuthControllerData auth_data[] = {
|
| + MockHttpAuthControllerData(""),
|
| + MockHttpAuthControllerData("Proxy-Authorization: Basic Zm9vOmJheg=="),
|
| + };
|
| + SSLSocketDataProvider ssl(true, OK);
|
| + socket_factory_.AddSSLSocketDataProvider(&ssl);
|
| +
|
| + CreatePool(false, true /* http proxy pool */, true /* socks pool */);
|
| + scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP,
|
| + auth_data,
|
| + arraysize(auth_data),
|
| + false,
|
| + false);
|
| +
|
| + ClientSocketHandle handle;
|
| + TestCompletionCallback callback;
|
| + int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
|
| + EXPECT_EQ(ERR_IO_PENDING, rv);
|
| + EXPECT_FALSE(handle.is_initialized());
|
| + EXPECT_FALSE(handle.socket());
|
| +
|
| + EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, callback.WaitForResult());
|
| + EXPECT_FALSE(handle.is_initialized());
|
| + EXPECT_FALSE(handle.socket());
|
| + EXPECT_FALSE(handle.is_ssl_error());
|
| + const HttpResponseInfo& tunnel_info = handle.ssl_error_response_info();
|
| + EXPECT_EQ(tunnel_info.headers->response_code(), 407);
|
| +
|
| + params->http_proxy_params()->auth_controller()->ResetAuth(string16(),
|
| + string16());
|
| + rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
|
| + EXPECT_EQ(ERR_IO_PENDING, rv);
|
| + EXPECT_FALSE(handle.is_initialized());
|
| + EXPECT_FALSE(handle.socket());
|
| +
|
| + // Test that http://crbug.com/49325 doesn't regress.
|
| + EXPECT_EQ(handle.GetLoadState(), LOAD_STATE_ESTABLISHING_PROXY_TUNNEL);
|
| +
|
| + EXPECT_EQ(OK, callback.WaitForResult());
|
| + EXPECT_TRUE(handle.is_initialized());
|
| + EXPECT_TRUE(handle.socket());
|
| +}
|
| +
|
| +TEST_F(SSLClientSocketPoolTest, DoProxyAuthNoKeepAlive) {
|
| + MockWrite writes1[] = {
|
| + MockWrite("CONNECT host:80 HTTP/1.1\r\n"
|
| + "Host: host\r\n"
|
| + "Proxy-Connection: keep-alive\r\n\r\n"),
|
| + };
|
| + MockWrite writes2[] = {
|
| + MockWrite("CONNECT host:80 HTTP/1.1\r\n"
|
| + "Host: host\r\n"
|
| + "Proxy-Connection: keep-alive\r\n"
|
| + "Proxy-Authorization: Basic Zm9vOmJheg==\r\n\r\n"),
|
| + };
|
| + MockRead reads1[] = {
|
| + MockRead("HTTP/1.1 407 Proxy Authentication Required\r\n"),
|
| + MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n\r\n"),
|
| + MockRead("Content0123456789"),
|
| + };
|
| + MockRead reads2[] = {
|
| + MockRead("HTTP/1.1 200 Connection Established\r\n\r\n"),
|
| + };
|
| + StaticSocketDataProvider data1(reads1, arraysize(reads1), writes1,
|
| + arraysize(writes1));
|
| + socket_factory_.AddSocketDataProvider(&data1);
|
| + StaticSocketDataProvider data2(reads2, arraysize(reads2), writes2,
|
| + arraysize(writes2));
|
| + socket_factory_.AddSocketDataProvider(&data2);
|
| + MockHttpAuthControllerData auth_data[] = {
|
| + MockHttpAuthControllerData(""),
|
| + MockHttpAuthControllerData("Proxy-Authorization: Basic Zm9vOmJheg=="),
|
| + };
|
| + SSLSocketDataProvider ssl(true, OK);
|
| + socket_factory_.AddSSLSocketDataProvider(&ssl);
|
| +
|
| + CreatePool(false, true /* http proxy pool */, true /* socks pool */);
|
| + scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP,
|
| + auth_data,
|
| + arraysize(auth_data),
|
| + false,
|
| + false);
|
| +
|
| + ClientSocketHandle handle;
|
| + TestCompletionCallback callback;
|
| + int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
|
| + EXPECT_EQ(ERR_IO_PENDING, rv);
|
| + EXPECT_FALSE(handle.is_initialized());
|
| + EXPECT_FALSE(handle.socket());
|
| +
|
| + EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, callback.WaitForResult());
|
| + EXPECT_FALSE(handle.is_initialized());
|
| + EXPECT_FALSE(handle.socket());
|
| + EXPECT_FALSE(handle.is_ssl_error());
|
| + const HttpResponseInfo& tunnel_info = handle.ssl_error_response_info();
|
| + EXPECT_EQ(tunnel_info.headers->response_code(), 407);
|
| +
|
| + params->http_proxy_params()->auth_controller()->ResetAuth(string16(),
|
| + string16());
|
| + rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
|
| + EXPECT_EQ(ERR_IO_PENDING, rv);
|
| + EXPECT_FALSE(handle.is_initialized());
|
| + EXPECT_FALSE(handle.socket());
|
| +
|
| + EXPECT_EQ(OK, callback.WaitForResult());
|
| + EXPECT_TRUE(handle.is_initialized());
|
| + EXPECT_TRUE(handle.socket());
|
| +}
|
| +
|
| // It would be nice to also test the timeouts in SSLClientSocketPool.
|
|
|
| } // namespace
|
|
|
| Property changes on: net\socket\ssl_client_socket_pool_unittest.cc
|
| ___________________________________________________________________
|
| Added: svn:mergeinfo
|
|
|
|
|