| Index: net/http/http_proxy_client_socket_pool_unittest.cc
|
| ===================================================================
|
| --- net/http/http_proxy_client_socket_pool_unittest.cc (revision 124866)
|
| +++ net/http/http_proxy_client_socket_pool_unittest.cc (working copy)
|
| @@ -1,539 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "net/http/http_proxy_client_socket_pool.h"
|
| -
|
| -#include "base/callback.h"
|
| -#include "base/compiler_specific.h"
|
| -#include "base/string_util.h"
|
| -#include "base/utf_string_conversions.h"
|
| -#include "net/base/mock_host_resolver.h"
|
| -#include "net/base/net_errors.h"
|
| -#include "net/base/ssl_config_service_defaults.h"
|
| -#include "net/base/test_completion_callback.h"
|
| -#include "net/http/http_auth_handler_factory.h"
|
| -#include "net/http/http_network_session.h"
|
| -#include "net/http/http_proxy_client_socket.h"
|
| -#include "net/http/http_server_properties_impl.h"
|
| -#include "net/proxy/proxy_service.h"
|
| -#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_protocol.h"
|
| -#include "net/spdy/spdy_test_util.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -namespace net {
|
| -
|
| -namespace {
|
| -
|
| -const int kMaxSockets = 32;
|
| -const int kMaxSocketsPerGroup = 6;
|
| -const char * const kAuthHeaders[] = {
|
| - "proxy-authorization", "Basic Zm9vOmJhcg=="
|
| -};
|
| -const int kAuthHeadersSize = arraysize(kAuthHeaders) / 2;
|
| -
|
| -enum HttpProxyType {
|
| - HTTP,
|
| - HTTPS,
|
| - SPDY
|
| -};
|
| -
|
| -typedef ::testing::TestWithParam<HttpProxyType> TestWithHttpParam;
|
| -
|
| -} // namespace
|
| -
|
| -class HttpProxyClientSocketPoolTest : public TestWithHttpParam {
|
| - protected:
|
| - HttpProxyClientSocketPoolTest()
|
| - : ssl_config_(),
|
| - ignored_transport_socket_params_(new TransportSocketParams(
|
| - HostPortPair("proxy", 80), LOWEST, false, false)),
|
| - ignored_ssl_socket_params_(new SSLSocketParams(
|
| - ignored_transport_socket_params_, NULL, NULL,
|
| - ProxyServer::SCHEME_DIRECT, HostPortPair("www.google.com", 443),
|
| - ssl_config_, 0, false, false)),
|
| - tcp_histograms_("MockTCP"),
|
| - transport_socket_pool_(
|
| - kMaxSockets, kMaxSocketsPerGroup,
|
| - &tcp_histograms_,
|
| - &socket_factory_),
|
| - ssl_histograms_("MockSSL"),
|
| - proxy_service_(ProxyService::CreateDirect()),
|
| - ssl_config_service_(new SSLConfigServiceDefaults),
|
| - ssl_socket_pool_(kMaxSockets, kMaxSocketsPerGroup,
|
| - &ssl_histograms_,
|
| - &host_resolver_,
|
| - &cert_verifier_,
|
| - NULL /* origin_bound_cert_store */,
|
| - NULL /* transport_security_state */,
|
| - NULL /* ssl_host_info_factory */,
|
| - "" /* ssl_session_cache_shard */,
|
| - &socket_factory_,
|
| - &transport_socket_pool_,
|
| - NULL,
|
| - NULL,
|
| - ssl_config_service_.get(),
|
| - BoundNetLog().net_log()),
|
| - http_auth_handler_factory_(
|
| - HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
|
| - session_(CreateNetworkSession()),
|
| - http_proxy_histograms_("HttpProxyUnitTest"),
|
| - ssl_data_(NULL),
|
| - data_(NULL),
|
| - pool_(kMaxSockets, kMaxSocketsPerGroup,
|
| - &http_proxy_histograms_,
|
| - NULL,
|
| - &transport_socket_pool_,
|
| - &ssl_socket_pool_,
|
| - NULL) {
|
| - }
|
| -
|
| - virtual ~HttpProxyClientSocketPoolTest() {
|
| - }
|
| -
|
| - void AddAuthToCache() {
|
| - const string16 kFoo(ASCIIToUTF16("foo"));
|
| - const string16 kBar(ASCIIToUTF16("bar"));
|
| - GURL proxy_url(GetParam() == HTTP ? "http://proxy" : "https://proxy:80");
|
| - session_->http_auth_cache()->Add(proxy_url,
|
| - "MyRealm1",
|
| - HttpAuth::AUTH_SCHEME_BASIC,
|
| - "Basic realm=MyRealm1",
|
| - AuthCredentials(kFoo, kBar),
|
| - "/");
|
| - }
|
| -
|
| - scoped_refptr<TransportSocketParams> GetTcpParams() {
|
| - if (GetParam() != HTTP)
|
| - return scoped_refptr<TransportSocketParams>();
|
| - return ignored_transport_socket_params_;
|
| - }
|
| -
|
| - scoped_refptr<SSLSocketParams> GetSslParams() {
|
| - if (GetParam() == HTTP)
|
| - return scoped_refptr<SSLSocketParams>();
|
| - return ignored_ssl_socket_params_;
|
| - }
|
| -
|
| - // Returns the a correctly constructed HttpProxyParms
|
| - // for the HTTP or HTTPS proxy.
|
| - scoped_refptr<HttpProxySocketParams> GetParams(bool tunnel) {
|
| - return scoped_refptr<HttpProxySocketParams>(
|
| - new HttpProxySocketParams(
|
| - GetTcpParams(),
|
| - GetSslParams(),
|
| - GURL(tunnel ? "https://www.google.com/" : "http://www.google.com"),
|
| - "",
|
| - HostPortPair("www.google.com", tunnel ? 443 : 80),
|
| - session_->http_auth_cache(),
|
| - session_->http_auth_handler_factory(),
|
| - session_->spdy_session_pool(),
|
| - tunnel));
|
| - }
|
| -
|
| - scoped_refptr<HttpProxySocketParams> GetTunnelParams() {
|
| - return GetParams(true);
|
| - }
|
| -
|
| - scoped_refptr<HttpProxySocketParams> GetNoTunnelParams() {
|
| - return GetParams(false);
|
| - }
|
| -
|
| - DeterministicMockClientSocketFactory& socket_factory() {
|
| - return socket_factory_;
|
| - }
|
| -
|
| - void Initialize(MockRead* reads, size_t reads_count,
|
| - MockWrite* writes, size_t writes_count,
|
| - MockRead* spdy_reads, size_t spdy_reads_count,
|
| - MockWrite* spdy_writes, size_t spdy_writes_count) {
|
| - if (GetParam() == SPDY)
|
| - data_ = new DeterministicSocketData(spdy_reads, spdy_reads_count,
|
| - spdy_writes, spdy_writes_count);
|
| - else
|
| - data_ = new DeterministicSocketData(reads, reads_count, writes,
|
| - writes_count);
|
| -
|
| - data_->set_connect_data(MockConnect(SYNCHRONOUS, OK));
|
| - data_->StopAfter(2); // Request / Response
|
| -
|
| - socket_factory_.AddSocketDataProvider(data_.get());
|
| -
|
| - if (GetParam() != HTTP) {
|
| - ssl_data_.reset(new SSLSocketDataProvider(SYNCHRONOUS, OK));
|
| - if (GetParam() == SPDY) {
|
| - InitializeSpdySsl();
|
| - }
|
| - socket_factory_.AddSSLSocketDataProvider(ssl_data_.get());
|
| - }
|
| - }
|
| -
|
| - void InitializeSpdySsl() {
|
| - spdy::SpdyFramer::set_enable_compression_default(false);
|
| - ssl_data_->SetNextProto(SSLClientSocket::kProtoSPDY21);
|
| - }
|
| -
|
| - HttpNetworkSession* CreateNetworkSession() {
|
| - HttpNetworkSession::Params params;
|
| - params.host_resolver = &host_resolver_;
|
| - params.cert_verifier = &cert_verifier_;
|
| - params.proxy_service = proxy_service_.get();
|
| - params.client_socket_factory = &socket_factory_;
|
| - params.ssl_config_service = ssl_config_service_;
|
| - params.http_auth_handler_factory = http_auth_handler_factory_.get();
|
| - params.http_server_properties = &http_server_properties_;
|
| - return new HttpNetworkSession(params);
|
| - }
|
| -
|
| - private:
|
| - SSLConfig ssl_config_;
|
| -
|
| - scoped_refptr<TransportSocketParams> ignored_transport_socket_params_;
|
| - scoped_refptr<SSLSocketParams> ignored_ssl_socket_params_;
|
| - ClientSocketPoolHistograms tcp_histograms_;
|
| - DeterministicMockClientSocketFactory socket_factory_;
|
| - MockTransportClientSocketPool transport_socket_pool_;
|
| - ClientSocketPoolHistograms ssl_histograms_;
|
| - MockHostResolver host_resolver_;
|
| - CertVerifier cert_verifier_;
|
| - const scoped_ptr<ProxyService> proxy_service_;
|
| - const scoped_refptr<SSLConfigService> ssl_config_service_;
|
| - SSLClientSocketPool ssl_socket_pool_;
|
| -
|
| - const scoped_ptr<HttpAuthHandlerFactory> http_auth_handler_factory_;
|
| - HttpServerPropertiesImpl http_server_properties_;
|
| - const scoped_refptr<HttpNetworkSession> session_;
|
| - ClientSocketPoolHistograms http_proxy_histograms_;
|
| -
|
| - protected:
|
| - scoped_ptr<SSLSocketDataProvider> ssl_data_;
|
| - scoped_refptr<DeterministicSocketData> data_;
|
| - HttpProxyClientSocketPool pool_;
|
| - ClientSocketHandle handle_;
|
| - TestCompletionCallback callback_;
|
| -};
|
| -
|
| -//-----------------------------------------------------------------------------
|
| -// All tests are run with three different proxy types: HTTP, HTTPS (non-SPDY)
|
| -// and SPDY.
|
| -INSTANTIATE_TEST_CASE_P(HttpProxyClientSocketPoolTests,
|
| - HttpProxyClientSocketPoolTest,
|
| - ::testing::Values(HTTP, HTTPS, SPDY));
|
| -
|
| -TEST_P(HttpProxyClientSocketPoolTest, NoTunnel) {
|
| - Initialize(NULL, 0, NULL, 0, NULL, 0, NULL, 0);
|
| -
|
| - int rv = handle_.Init("a", GetNoTunnelParams(), LOW, CompletionCallback(),
|
| - &pool_, BoundNetLog());
|
| - EXPECT_EQ(OK, rv);
|
| - EXPECT_TRUE(handle_.is_initialized());
|
| - ASSERT_TRUE(handle_.socket());
|
| - HttpProxyClientSocket* tunnel_socket =
|
| - static_cast<HttpProxyClientSocket*>(handle_.socket());
|
| - EXPECT_TRUE(tunnel_socket->IsConnected());
|
| -}
|
| -
|
| -TEST_P(HttpProxyClientSocketPoolTest, NeedAuth) {
|
| - MockWrite writes[] = {
|
| - MockWrite(ASYNC, 0, "CONNECT www.google.com:443 HTTP/1.1\r\n"
|
| - "Host: www.google.com\r\n"
|
| - "Proxy-Connection: keep-alive\r\n\r\n"),
|
| - };
|
| - MockRead reads[] = {
|
| - // No credentials.
|
| - MockRead(ASYNC, 1, "HTTP/1.1 407 Proxy Authentication Required\r\n"),
|
| - MockRead(ASYNC, 2, "Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"),
|
| - MockRead(ASYNC, 3, "Content-Length: 10\r\n\r\n"),
|
| - MockRead(ASYNC, 4, "0123456789"),
|
| - };
|
| - scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyConnect(NULL, 0, 1));
|
| - scoped_ptr<spdy::SpdyFrame> rst(ConstructSpdyRstStream(1, spdy::CANCEL));
|
| - MockWrite spdy_writes[] = {
|
| - CreateMockWrite(*req, 0, ASYNC),
|
| - CreateMockWrite(*rst, 2, ASYNC),
|
| - };
|
| - static const char* const kAuthChallenge[] = {
|
| - "status", "407 Proxy Authentication Required",
|
| - "version", "HTTP/1.1",
|
| - "proxy-authenticate", "Basic realm=\"MyRealm1\"",
|
| - };
|
| - scoped_ptr<spdy::SpdyFrame> resp(
|
| -
|
| - ConstructSpdyControlFrame(NULL,
|
| - 0,
|
| - false,
|
| - 1,
|
| - LOWEST,
|
| - spdy::SYN_REPLY,
|
| - spdy::CONTROL_FLAG_NONE,
|
| - kAuthChallenge,
|
| - arraysize(kAuthChallenge)));
|
| - MockRead spdy_reads[] = {
|
| - CreateMockWrite(*resp, 1, ASYNC),
|
| - MockRead(ASYNC, 0, 3)
|
| - };
|
| -
|
| - Initialize(reads, arraysize(reads), writes, arraysize(writes),
|
| - spdy_reads, arraysize(spdy_reads), spdy_writes,
|
| - arraysize(spdy_writes));
|
| -
|
| - data_->StopAfter(4);
|
| - int rv = handle_.Init("a", GetTunnelParams(), LOW, callback_.callback(),
|
| - &pool_, BoundNetLog());
|
| - EXPECT_EQ(ERR_IO_PENDING, rv);
|
| - EXPECT_FALSE(handle_.is_initialized());
|
| - EXPECT_FALSE(handle_.socket());
|
| -
|
| - data_->RunFor(GetParam() == SPDY ? 2 : 4);
|
| - rv = callback_.WaitForResult();
|
| - EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, rv);
|
| - EXPECT_TRUE(handle_.is_initialized());
|
| - ASSERT_TRUE(handle_.socket());
|
| - ProxyClientSocket* tunnel_socket =
|
| - static_cast<ProxyClientSocket*>(handle_.socket());
|
| - if (GetParam() == SPDY) {
|
| - EXPECT_TRUE(tunnel_socket->IsConnected());
|
| - EXPECT_TRUE(tunnel_socket->IsUsingSpdy());
|
| - } else {
|
| - EXPECT_FALSE(tunnel_socket->IsConnected());
|
| - EXPECT_FALSE(tunnel_socket->IsUsingSpdy());
|
| - EXPECT_FALSE(tunnel_socket->IsUsingSpdy());
|
| - }
|
| -}
|
| -
|
| -TEST_P(HttpProxyClientSocketPoolTest, HaveAuth) {
|
| - // It's pretty much impossible to make the SPDY case behave synchronously
|
| - // so we skip this test for SPDY
|
| - if (GetParam() == SPDY)
|
| - return;
|
| - MockWrite writes[] = {
|
| - MockWrite(SYNCHRONOUS, 0,
|
| - "CONNECT www.google.com:443 HTTP/1.1\r\n"
|
| - "Host: www.google.com\r\n"
|
| - "Proxy-Connection: keep-alive\r\n"
|
| - "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"),
|
| - };
|
| - MockRead reads[] = {
|
| - MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 Connection Established\r\n\r\n"),
|
| - };
|
| -
|
| - Initialize(reads, arraysize(reads), writes, arraysize(writes), NULL, 0,
|
| - NULL, 0);
|
| - AddAuthToCache();
|
| -
|
| - int rv = handle_.Init("a", GetTunnelParams(), LOW, callback_.callback(),
|
| - &pool_, BoundNetLog());
|
| - EXPECT_EQ(OK, rv);
|
| - EXPECT_TRUE(handle_.is_initialized());
|
| - ASSERT_TRUE(handle_.socket());
|
| - HttpProxyClientSocket* tunnel_socket =
|
| - static_cast<HttpProxyClientSocket*>(handle_.socket());
|
| - EXPECT_TRUE(tunnel_socket->IsConnected());
|
| -}
|
| -
|
| -TEST_P(HttpProxyClientSocketPoolTest, AsyncHaveAuth) {
|
| - MockWrite writes[] = {
|
| - MockWrite("CONNECT www.google.com:443 HTTP/1.1\r\n"
|
| - "Host: www.google.com\r\n"
|
| - "Proxy-Connection: keep-alive\r\n"
|
| - "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"),
|
| - };
|
| - MockRead reads[] = {
|
| - MockRead(SYNCHRONOUS, "HTTP/1.1 200 Connection Established\r\n\r\n"),
|
| - };
|
| -
|
| - scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyConnect(kAuthHeaders,
|
| - kAuthHeadersSize, 1));
|
| - MockWrite spdy_writes[] = {
|
| - CreateMockWrite(*req, 0, ASYNC)
|
| - };
|
| - scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1));
|
| - MockRead spdy_reads[] = {
|
| - CreateMockRead(*resp, 1, ASYNC),
|
| - MockRead(ASYNC, 0, 2)
|
| - };
|
| -
|
| - Initialize(reads, arraysize(reads), writes, arraysize(writes),
|
| - spdy_reads, arraysize(spdy_reads), spdy_writes,
|
| - arraysize(spdy_writes));
|
| - AddAuthToCache();
|
| -
|
| - int rv = handle_.Init("a", GetTunnelParams(), LOW, callback_.callback(),
|
| - &pool_, BoundNetLog());
|
| - EXPECT_EQ(ERR_IO_PENDING, rv);
|
| - EXPECT_FALSE(handle_.is_initialized());
|
| - EXPECT_FALSE(handle_.socket());
|
| -
|
| - data_->RunFor(2);
|
| - EXPECT_EQ(OK, callback_.WaitForResult());
|
| - EXPECT_TRUE(handle_.is_initialized());
|
| - ASSERT_TRUE(handle_.socket());
|
| - HttpProxyClientSocket* tunnel_socket =
|
| - static_cast<HttpProxyClientSocket*>(handle_.socket());
|
| - EXPECT_TRUE(tunnel_socket->IsConnected());
|
| -}
|
| -
|
| -TEST_P(HttpProxyClientSocketPoolTest, TCPError) {
|
| - if (GetParam() == SPDY) return;
|
| - data_ = new DeterministicSocketData(NULL, 0, NULL, 0);
|
| - data_->set_connect_data(MockConnect(ASYNC, ERR_CONNECTION_CLOSED));
|
| -
|
| - socket_factory().AddSocketDataProvider(data_.get());
|
| -
|
| - int rv = handle_.Init("a", GetTunnelParams(), LOW, callback_.callback(),
|
| - &pool_, BoundNetLog());
|
| - EXPECT_EQ(ERR_IO_PENDING, rv);
|
| - EXPECT_FALSE(handle_.is_initialized());
|
| - EXPECT_FALSE(handle_.socket());
|
| -
|
| - EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, callback_.WaitForResult());
|
| -
|
| - EXPECT_FALSE(handle_.is_initialized());
|
| - EXPECT_FALSE(handle_.socket());
|
| -}
|
| -
|
| -TEST_P(HttpProxyClientSocketPoolTest, SSLError) {
|
| - if (GetParam() == HTTP) return;
|
| - data_ = new DeterministicSocketData(NULL, 0, NULL, 0);
|
| - data_->set_connect_data(MockConnect(ASYNC, OK));
|
| - socket_factory().AddSocketDataProvider(data_.get());
|
| -
|
| - ssl_data_.reset(new SSLSocketDataProvider(ASYNC,
|
| - ERR_CERT_AUTHORITY_INVALID));
|
| - if (GetParam() == SPDY) {
|
| - InitializeSpdySsl();
|
| - }
|
| - socket_factory().AddSSLSocketDataProvider(ssl_data_.get());
|
| -
|
| - int rv = handle_.Init("a", GetTunnelParams(), LOW, callback_.callback(),
|
| - &pool_, BoundNetLog());
|
| - EXPECT_EQ(ERR_IO_PENDING, rv);
|
| - EXPECT_FALSE(handle_.is_initialized());
|
| - EXPECT_FALSE(handle_.socket());
|
| -
|
| - EXPECT_EQ(ERR_PROXY_CERTIFICATE_INVALID, callback_.WaitForResult());
|
| -
|
| - EXPECT_FALSE(handle_.is_initialized());
|
| - EXPECT_FALSE(handle_.socket());
|
| -}
|
| -
|
| -TEST_P(HttpProxyClientSocketPoolTest, SslClientAuth) {
|
| - if (GetParam() == HTTP) return;
|
| - data_ = new DeterministicSocketData(NULL, 0, NULL, 0);
|
| - data_->set_connect_data(MockConnect(ASYNC, OK));
|
| - socket_factory().AddSocketDataProvider(data_.get());
|
| -
|
| - ssl_data_.reset(new SSLSocketDataProvider(ASYNC,
|
| - ERR_SSL_CLIENT_AUTH_CERT_NEEDED));
|
| - if (GetParam() == SPDY) {
|
| - InitializeSpdySsl();
|
| - }
|
| - socket_factory().AddSSLSocketDataProvider(ssl_data_.get());
|
| -
|
| - int rv = handle_.Init("a", GetTunnelParams(), LOW, callback_.callback(),
|
| - &pool_, BoundNetLog());
|
| - EXPECT_EQ(ERR_IO_PENDING, rv);
|
| - EXPECT_FALSE(handle_.is_initialized());
|
| - EXPECT_FALSE(handle_.socket());
|
| -
|
| - EXPECT_EQ(ERR_SSL_CLIENT_AUTH_CERT_NEEDED, callback_.WaitForResult());
|
| -
|
| - EXPECT_FALSE(handle_.is_initialized());
|
| - EXPECT_FALSE(handle_.socket());
|
| -}
|
| -
|
| -TEST_P(HttpProxyClientSocketPoolTest, TunnelUnexpectedClose) {
|
| - MockWrite writes[] = {
|
| - MockWrite(ASYNC, 0,
|
| - "CONNECT www.google.com:443 HTTP/1.1\r\n"
|
| - "Host: www.google.com\r\n"
|
| - "Proxy-Connection: keep-alive\r\n"
|
| - "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"),
|
| - };
|
| - MockRead reads[] = {
|
| - MockRead(ASYNC, 1, "HTTP/1.1 200 Conn"),
|
| - MockRead(ASYNC, ERR_CONNECTION_CLOSED, 2),
|
| - };
|
| - scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyConnect(kAuthHeaders,
|
| - kAuthHeadersSize, 1));
|
| - MockWrite spdy_writes[] = {
|
| - CreateMockWrite(*req, 0, ASYNC)
|
| - };
|
| - MockRead spdy_reads[] = {
|
| - MockRead(ASYNC, ERR_CONNECTION_CLOSED, 1),
|
| - };
|
| -
|
| - Initialize(reads, arraysize(reads), writes, arraysize(writes),
|
| - spdy_reads, arraysize(spdy_reads), spdy_writes,
|
| - arraysize(spdy_writes));
|
| - AddAuthToCache();
|
| -
|
| - int rv = handle_.Init("a", GetTunnelParams(), LOW, callback_.callback(),
|
| - &pool_, BoundNetLog());
|
| - EXPECT_EQ(ERR_IO_PENDING, rv);
|
| - EXPECT_FALSE(handle_.is_initialized());
|
| - EXPECT_FALSE(handle_.socket());
|
| -
|
| - data_->RunFor(3);
|
| - EXPECT_EQ(ERR_CONNECTION_CLOSED, callback_.WaitForResult());
|
| - EXPECT_FALSE(handle_.is_initialized());
|
| - EXPECT_FALSE(handle_.socket());
|
| -}
|
| -
|
| -TEST_P(HttpProxyClientSocketPoolTest, TunnelSetupError) {
|
| - MockWrite writes[] = {
|
| - MockWrite(ASYNC, 0,
|
| - "CONNECT www.google.com:443 HTTP/1.1\r\n"
|
| - "Host: www.google.com\r\n"
|
| - "Proxy-Connection: keep-alive\r\n"
|
| - "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"),
|
| - };
|
| - MockRead reads[] = {
|
| - MockRead(ASYNC, 1, "HTTP/1.1 304 Not Modified\r\n\r\n"),
|
| - };
|
| - scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyConnect(kAuthHeaders,
|
| - kAuthHeadersSize, 1));
|
| - scoped_ptr<spdy::SpdyFrame> rst(ConstructSpdyRstStream(1, spdy::CANCEL));
|
| - MockWrite spdy_writes[] = {
|
| - CreateMockWrite(*req, 0, ASYNC),
|
| - CreateMockWrite(*rst, 2, ASYNC),
|
| - };
|
| - scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdySynReplyError(1));
|
| - MockRead spdy_reads[] = {
|
| - CreateMockRead(*resp, 1, ASYNC),
|
| - MockRead(ASYNC, 0, 3),
|
| - };
|
| -
|
| - Initialize(reads, arraysize(reads), writes, arraysize(writes),
|
| - spdy_reads, arraysize(spdy_reads), spdy_writes,
|
| - arraysize(spdy_writes));
|
| - AddAuthToCache();
|
| -
|
| - int rv = handle_.Init("a", GetTunnelParams(), LOW, callback_.callback(),
|
| - &pool_, BoundNetLog());
|
| - EXPECT_EQ(ERR_IO_PENDING, rv);
|
| - EXPECT_FALSE(handle_.is_initialized());
|
| - EXPECT_FALSE(handle_.socket());
|
| -
|
| - data_->RunFor(2);
|
| -
|
| - rv = callback_.WaitForResult();
|
| - if (GetParam() == HTTP) {
|
| - // HTTP Proxy CONNECT responses are not trustworthy
|
| - EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, rv);
|
| - EXPECT_FALSE(handle_.is_initialized());
|
| - EXPECT_FALSE(handle_.socket());
|
| - } else {
|
| - // HTTPS or SPDY Proxy CONNECT responses are trustworthy
|
| - EXPECT_EQ(ERR_HTTPS_PROXY_TUNNEL_RESPONSE, rv);
|
| - EXPECT_TRUE(handle_.is_initialized());
|
| - EXPECT_TRUE(handle_.socket());
|
| - }
|
| -}
|
| -
|
| -// It would be nice to also test the timeouts in HttpProxyClientSocketPool.
|
| -
|
| -} // namespace net
|
|
|