| Index: net/http/http_proxy_client_socket_pool_unittest.cc
|
| diff --git a/net/http/http_proxy_client_socket_pool_unittest.cc b/net/http/http_proxy_client_socket_pool_unittest.cc
|
| index f2464919e3a72e53a9a3c66a76db1490d50b98f5..95908773068b11c7656c66cc53f1aa2d09670e48 100644
|
| --- a/net/http/http_proxy_client_socket_pool_unittest.cc
|
| +++ b/net/http/http_proxy_client_socket_pool_unittest.cc
|
| @@ -9,6 +9,7 @@
|
| #include "base/strings/string_util.h"
|
| #include "base/strings/utf_string_conversions.h"
|
| #include "net/base/net_errors.h"
|
| +#include "net/base/proxy_delegate.h"
|
| #include "net/base/test_completion_callback.h"
|
| #include "net/http/http_network_session.h"
|
| #include "net/http/http_proxy_client_socket.h"
|
| @@ -58,6 +59,79 @@ typedef ::testing::TestWithParam<HttpProxyType> TestWithHttpParam;
|
| const char kHttpProxyHost[] = "httpproxy.example.com";
|
| const char kHttpsProxyHost[] = "httpsproxy.example.com";
|
|
|
| +class TestProxyDelegate : public ProxyDelegate {
|
| + public:
|
| + TestProxyDelegate()
|
| + : on_before_tunnel_request_called_(false),
|
| + on_tunnel_headers_received_called_(false) {
|
| + }
|
| +
|
| + virtual ~TestProxyDelegate() OVERRIDE {
|
| + }
|
| +
|
| + bool on_before_tunnel_request_called() const {
|
| + return on_before_tunnel_request_called_;
|
| + }
|
| +
|
| + bool on_tunnel_headers_received_called() const {
|
| + return on_tunnel_headers_received_called_;
|
| + }
|
| +
|
| + void VerifyOnTunnelHeadersReceived(const std::string& origin,
|
| + const std::string& proxy_server,
|
| + const std::string& status_line) const {
|
| + EXPECT_TRUE(on_tunnel_headers_received_called_);
|
| + EXPECT_TRUE(HostPortPair::FromString(origin).Equals(
|
| + on_tunnel_headers_received_origin_));
|
| + EXPECT_TRUE(HostPortPair::FromString(proxy_server).Equals(
|
| + on_tunnel_headers_received_proxy_server_));
|
| + EXPECT_EQ(status_line, on_tunnel_headers_received_status_line_);
|
| + }
|
| +
|
| + // ProxyDelegate:
|
| + virtual void OnResolveProxy(const GURL& url,
|
| + int load_flags,
|
| + const ProxyService& proxy_service,
|
| + ProxyInfo* result) OVERRIDE {
|
| + }
|
| +
|
| + virtual void OnFallback(const ProxyServer& bad_proxy,
|
| + int net_error) OVERRIDE {
|
| + }
|
| +
|
| + virtual void OnBeforeSendHeaders(URLRequest* request,
|
| + const ProxyInfo& proxy_info,
|
| + HttpRequestHeaders* headers) OVERRIDE {
|
| + }
|
| +
|
| + virtual void OnBeforeTunnelRequest(
|
| + const net::HostPortPair& proxy_server,
|
| + net::HttpRequestHeaders* extra_headers) OVERRIDE {
|
| + on_before_tunnel_request_called_ = true;
|
| + if (extra_headers) {
|
| + extra_headers->SetHeader("Foo", proxy_server.ToString());
|
| + }
|
| + }
|
| +
|
| + virtual void OnTunnelHeadersReceived(
|
| + const net::HostPortPair& origin,
|
| + const net::HostPortPair& proxy_server,
|
| + const net::HttpResponseHeaders& response_headers) OVERRIDE {
|
| + on_tunnel_headers_received_called_ = true;
|
| + on_tunnel_headers_received_origin_ = origin;
|
| + on_tunnel_headers_received_proxy_server_ = proxy_server;
|
| + on_tunnel_headers_received_status_line_ = response_headers.GetStatusLine();
|
| + }
|
| +
|
| + private:
|
| + bool on_before_tunnel_request_called_;
|
| + bool on_tunnel_headers_received_called_;
|
| + HostPortPair on_tunnel_headers_received_origin_;
|
| + HostPortPair on_tunnel_headers_received_proxy_server_;
|
| + std::string on_tunnel_headers_received_status_line_;
|
| +};
|
| +
|
| +
|
| class HttpProxyClientSocketPoolTest
|
| : public ::testing::TestWithParam<HttpProxyClientSocketPoolTestParams> {
|
| protected:
|
| @@ -95,6 +169,7 @@ class HttpProxyClientSocketPoolTest
|
| NULL,
|
| &transport_socket_pool_,
|
| &ssl_socket_pool_,
|
| + NULL,
|
| NULL) {}
|
|
|
| virtual ~HttpProxyClientSocketPoolTest() {
|
| @@ -144,7 +219,9 @@ class HttpProxyClientSocketPoolTest
|
|
|
| // Returns the a correctly constructed HttpProxyParms
|
| // for the HTTP or HTTPS proxy.
|
| - scoped_refptr<HttpProxySocketParams> CreateParams(bool tunnel) {
|
| + scoped_refptr<HttpProxySocketParams> CreateParams(
|
| + bool tunnel,
|
| + ProxyDelegate* proxy_delegate) {
|
| return scoped_refptr<HttpProxySocketParams>(new HttpProxySocketParams(
|
| CreateHttpProxyParams(),
|
| CreateHttpsProxyParams(),
|
| @@ -154,15 +231,18 @@ class HttpProxyClientSocketPoolTest
|
| session_->http_auth_cache(),
|
| session_->http_auth_handler_factory(),
|
| session_->spdy_session_pool(),
|
| - tunnel));
|
| + tunnel,
|
| + proxy_delegate));
|
| }
|
|
|
| - scoped_refptr<HttpProxySocketParams> CreateTunnelParams() {
|
| - return CreateParams(true);
|
| + scoped_refptr<HttpProxySocketParams> CreateTunnelParams(
|
| + ProxyDelegate* proxy_delegate) {
|
| + return CreateParams(true, proxy_delegate);
|
| }
|
|
|
| - scoped_refptr<HttpProxySocketParams> CreateNoTunnelParams() {
|
| - return CreateParams(false);
|
| + scoped_refptr<HttpProxySocketParams> CreateNoTunnelParams(
|
| + ProxyDelegate* proxy_delegate) {
|
| + return CreateParams(false, proxy_delegate);
|
| }
|
|
|
| DeterministicMockClientSocketFactory* socket_factory() {
|
| @@ -256,14 +336,17 @@ INSTANTIATE_TEST_CASE_P(
|
| TEST_P(HttpProxyClientSocketPoolTest, NoTunnel) {
|
| Initialize(NULL, 0, NULL, 0, NULL, 0, NULL, 0);
|
|
|
| - int rv = handle_.Init("a", CreateNoTunnelParams(), LOW, CompletionCallback(),
|
| - &pool_, BoundNetLog());
|
| + scoped_ptr<TestProxyDelegate> proxy_delegate(new TestProxyDelegate());
|
| + int rv = handle_.Init("a", CreateNoTunnelParams(proxy_delegate.get()), 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());
|
| + EXPECT_FALSE(proxy_delegate->on_before_tunnel_request_called());
|
| + EXPECT_FALSE(proxy_delegate->on_tunnel_headers_received_called());
|
| }
|
|
|
| // Make sure that HttpProxyConnectJob passes on its priority to its
|
| @@ -271,7 +354,7 @@ TEST_P(HttpProxyClientSocketPoolTest, NoTunnel) {
|
| TEST_P(HttpProxyClientSocketPoolTest, SetSocketRequestPriorityOnInit) {
|
| Initialize(NULL, 0, NULL, 0, NULL, 0, NULL, 0);
|
| EXPECT_EQ(OK,
|
| - handle_.Init("a", CreateNoTunnelParams(), HIGHEST,
|
| + handle_.Init("a", CreateNoTunnelParams(NULL), HIGHEST,
|
| CompletionCallback(), &pool_, BoundNetLog()));
|
| EXPECT_EQ(HIGHEST, GetLastTransportRequestPriority());
|
| }
|
| @@ -313,8 +396,8 @@ TEST_P(HttpProxyClientSocketPoolTest, NeedAuth) {
|
| arraysize(spdy_writes));
|
|
|
| data_->StopAfter(4);
|
| - int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(),
|
| - &pool_, BoundNetLog());
|
| + int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW,
|
| + callback_.callback(), &pool_, BoundNetLog());
|
| EXPECT_EQ(ERR_IO_PENDING, rv);
|
| EXPECT_FALSE(handle_.is_initialized());
|
| EXPECT_FALSE(handle_.socket());
|
| @@ -340,12 +423,18 @@ TEST_P(HttpProxyClientSocketPoolTest, HaveAuth) {
|
| // so we skip this test for SPDY
|
| if (GetParam().proxy_type == SPDY)
|
| return;
|
| + std::string proxy_host_port =
|
| + GetParam().proxy_type == HTTP ?
|
| + (kHttpProxyHost + std::string(":80")) :
|
| + (kHttpsProxyHost + std::string(":443"));
|
| + std::string request =
|
| + "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"
|
| + "Foo: " + proxy_host_port + "\r\n\r\n";
|
| 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"),
|
| + MockWrite(SYNCHRONOUS, 0, request.c_str()),
|
| };
|
| MockRead reads[] = {
|
| MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 Connection Established\r\n\r\n"),
|
| @@ -355,14 +444,19 @@ TEST_P(HttpProxyClientSocketPoolTest, HaveAuth) {
|
| NULL, 0);
|
| AddAuthToCache();
|
|
|
| - int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(),
|
| - &pool_, BoundNetLog());
|
| + scoped_ptr<TestProxyDelegate> proxy_delegate(new TestProxyDelegate());
|
| + int rv = handle_.Init("a", CreateTunnelParams(proxy_delegate.get()), 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());
|
| + proxy_delegate->VerifyOnTunnelHeadersReceived(
|
| + "www.google.com:443",
|
| + proxy_host_port.c_str(),
|
| + "HTTP/1.1 200 Connection Established");
|
| }
|
|
|
| TEST_P(HttpProxyClientSocketPoolTest, AsyncHaveAuth) {
|
| @@ -392,8 +486,8 @@ TEST_P(HttpProxyClientSocketPoolTest, AsyncHaveAuth) {
|
| arraysize(spdy_writes));
|
| AddAuthToCache();
|
|
|
| - int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(),
|
| - &pool_, BoundNetLog());
|
| + int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW,
|
| + callback_.callback(), &pool_, BoundNetLog());
|
| EXPECT_EQ(ERR_IO_PENDING, rv);
|
| EXPECT_FALSE(handle_.is_initialized());
|
| EXPECT_FALSE(handle_.socket());
|
| @@ -432,7 +526,7 @@ TEST_P(HttpProxyClientSocketPoolTest,
|
| AddAuthToCache();
|
|
|
| EXPECT_EQ(ERR_IO_PENDING,
|
| - handle_.Init("a", CreateTunnelParams(), MEDIUM,
|
| + handle_.Init("a", CreateTunnelParams(NULL), MEDIUM,
|
| callback_.callback(), &pool_, BoundNetLog()));
|
| EXPECT_EQ(MEDIUM, GetLastTransportRequestPriority());
|
|
|
| @@ -447,8 +541,8 @@ TEST_P(HttpProxyClientSocketPoolTest, TCPError) {
|
|
|
| socket_factory()->AddSocketDataProvider(data_.get());
|
|
|
| - int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(),
|
| - &pool_, BoundNetLog());
|
| + int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW,
|
| + callback_.callback(), &pool_, BoundNetLog());
|
| EXPECT_EQ(ERR_IO_PENDING, rv);
|
| EXPECT_FALSE(handle_.is_initialized());
|
| EXPECT_FALSE(handle_.socket());
|
| @@ -472,8 +566,8 @@ TEST_P(HttpProxyClientSocketPoolTest, SSLError) {
|
| }
|
| socket_factory()->AddSSLSocketDataProvider(ssl_data_.get());
|
|
|
| - int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(),
|
| - &pool_, BoundNetLog());
|
| + int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW,
|
| + callback_.callback(), &pool_, BoundNetLog());
|
| EXPECT_EQ(ERR_IO_PENDING, rv);
|
| EXPECT_FALSE(handle_.is_initialized());
|
| EXPECT_FALSE(handle_.socket());
|
| @@ -497,8 +591,8 @@ TEST_P(HttpProxyClientSocketPoolTest, SslClientAuth) {
|
| }
|
| socket_factory()->AddSSLSocketDataProvider(ssl_data_.get());
|
|
|
| - int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(),
|
| - &pool_, BoundNetLog());
|
| + int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW,
|
| + callback_.callback(), &pool_, BoundNetLog());
|
| EXPECT_EQ(ERR_IO_PENDING, rv);
|
| EXPECT_FALSE(handle_.is_initialized());
|
| EXPECT_FALSE(handle_.socket());
|
| @@ -535,8 +629,8 @@ TEST_P(HttpProxyClientSocketPoolTest, TunnelUnexpectedClose) {
|
| arraysize(spdy_writes));
|
| AddAuthToCache();
|
|
|
| - int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(),
|
| - &pool_, BoundNetLog());
|
| + int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW,
|
| + callback_.callback(), &pool_, BoundNetLog());
|
| EXPECT_EQ(ERR_IO_PENDING, rv);
|
| EXPECT_FALSE(handle_.is_initialized());
|
| EXPECT_FALSE(handle_.socket());
|
| @@ -574,8 +668,8 @@ TEST_P(HttpProxyClientSocketPoolTest, Tunnel1xxResponse) {
|
| Initialize(reads, arraysize(reads), writes, arraysize(writes),
|
| NULL, 0, NULL, 0);
|
|
|
| - int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(),
|
| - &pool_, BoundNetLog());
|
| + int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW,
|
| + callback_.callback(), &pool_, BoundNetLog());
|
| EXPECT_EQ(ERR_IO_PENDING, rv);
|
| EXPECT_FALSE(handle_.is_initialized());
|
| EXPECT_FALSE(handle_.socket());
|
| @@ -614,8 +708,8 @@ TEST_P(HttpProxyClientSocketPoolTest, TunnelSetupError) {
|
| arraysize(spdy_writes));
|
| AddAuthToCache();
|
|
|
| - int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(),
|
| - &pool_, BoundNetLog());
|
| + int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW,
|
| + callback_.callback(), &pool_, BoundNetLog());
|
| EXPECT_EQ(ERR_IO_PENDING, rv);
|
| EXPECT_FALSE(handle_.is_initialized());
|
| EXPECT_FALSE(handle_.socket());
|
| @@ -676,8 +770,8 @@ TEST_P(HttpProxyClientSocketPoolTest, TunnelSetupRedirect) {
|
| arraysize(spdy_writes));
|
| AddAuthToCache();
|
|
|
| - int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(),
|
| - &pool_, BoundNetLog());
|
| + int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW,
|
| + callback_.callback(), &pool_, BoundNetLog());
|
| EXPECT_EQ(ERR_IO_PENDING, rv);
|
| EXPECT_FALSE(handle_.is_initialized());
|
| EXPECT_FALSE(handle_.socket());
|
|
|