| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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_proxy_client_socket_pool.h" | 5 #include "net/http/http_proxy_client_socket_pool.h" |
| 6 | 6 |
| 7 #include "base/callback.h" | 7 #include "base/callback.h" |
| 8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
| 9 #include "base/strings/string_util.h" | 9 #include "base/strings/string_util.h" |
| 10 #include "base/strings/utf_string_conversions.h" | 10 #include "base/strings/utf_string_conversions.h" |
| 11 #include "net/base/net_errors.h" | 11 #include "net/base/net_errors.h" |
| 12 #include "net/base/proxy_delegate.h" |
| 12 #include "net/base/test_completion_callback.h" | 13 #include "net/base/test_completion_callback.h" |
| 13 #include "net/http/http_network_session.h" | 14 #include "net/http/http_network_session.h" |
| 14 #include "net/http/http_proxy_client_socket.h" | 15 #include "net/http/http_proxy_client_socket.h" |
| 15 #include "net/http/http_response_headers.h" | 16 #include "net/http/http_response_headers.h" |
| 16 #include "net/socket/client_socket_handle.h" | 17 #include "net/socket/client_socket_handle.h" |
| 17 #include "net/socket/client_socket_pool_histograms.h" | 18 #include "net/socket/client_socket_pool_histograms.h" |
| 18 #include "net/socket/next_proto.h" | 19 #include "net/socket/next_proto.h" |
| 19 #include "net/socket/socket_test_util.h" | 20 #include "net/socket/socket_test_util.h" |
| 20 #include "net/spdy/spdy_protocol.h" | 21 #include "net/spdy/spdy_protocol.h" |
| 21 #include "net/spdy/spdy_test_util_common.h" | 22 #include "net/spdy/spdy_test_util_common.h" |
| (...skipping 29 matching lines...) Expand all Loading... |
| 51 | 52 |
| 52 HttpProxyType proxy_type; | 53 HttpProxyType proxy_type; |
| 53 NextProto protocol; | 54 NextProto protocol; |
| 54 }; | 55 }; |
| 55 | 56 |
| 56 typedef ::testing::TestWithParam<HttpProxyType> TestWithHttpParam; | 57 typedef ::testing::TestWithParam<HttpProxyType> TestWithHttpParam; |
| 57 | 58 |
| 58 const char kHttpProxyHost[] = "httpproxy.example.com"; | 59 const char kHttpProxyHost[] = "httpproxy.example.com"; |
| 59 const char kHttpsProxyHost[] = "httpsproxy.example.com"; | 60 const char kHttpsProxyHost[] = "httpsproxy.example.com"; |
| 60 | 61 |
| 62 class TestProxyDelegate : public ProxyDelegate { |
| 63 public: |
| 64 TestProxyDelegate() |
| 65 : on_before_tunnel_request_called_(false), |
| 66 on_tunnel_headers_received_called_(false) { |
| 67 } |
| 68 |
| 69 virtual ~TestProxyDelegate() OVERRIDE { |
| 70 } |
| 71 |
| 72 bool on_before_tunnel_request_called() const { |
| 73 return on_before_tunnel_request_called_; |
| 74 } |
| 75 |
| 76 bool on_tunnel_headers_received_called() const { |
| 77 return on_tunnel_headers_received_called_; |
| 78 } |
| 79 |
| 80 void VerifyOnTunnelHeadersReceived(const std::string& origin, |
| 81 const std::string& proxy_server, |
| 82 const std::string& status_line) const { |
| 83 EXPECT_TRUE(on_tunnel_headers_received_called_); |
| 84 EXPECT_TRUE(HostPortPair::FromString(origin).Equals( |
| 85 on_tunnel_headers_received_origin_)); |
| 86 EXPECT_TRUE(HostPortPair::FromString(proxy_server).Equals( |
| 87 on_tunnel_headers_received_proxy_server_)); |
| 88 EXPECT_EQ(status_line, on_tunnel_headers_received_status_line_); |
| 89 } |
| 90 |
| 91 // ProxyDelegate: |
| 92 virtual void OnResolveProxy(const GURL& url, |
| 93 int load_flags, |
| 94 const ProxyService& proxy_service, |
| 95 ProxyInfo* result) OVERRIDE { |
| 96 } |
| 97 |
| 98 virtual void OnFallback(const ProxyServer& bad_proxy, |
| 99 int net_error) OVERRIDE { |
| 100 } |
| 101 |
| 102 virtual void OnBeforeSendHeaders(URLRequest* request, |
| 103 const ProxyInfo& proxy_info, |
| 104 HttpRequestHeaders* headers) OVERRIDE { |
| 105 } |
| 106 |
| 107 virtual void OnBeforeTunnelRequest( |
| 108 const net::HostPortPair& proxy_server, |
| 109 net::HttpRequestHeaders* extra_headers) OVERRIDE { |
| 110 on_before_tunnel_request_called_ = true; |
| 111 if (extra_headers) { |
| 112 extra_headers->SetHeader("Foo", proxy_server.ToString()); |
| 113 } |
| 114 } |
| 115 |
| 116 virtual void OnTunnelHeadersReceived( |
| 117 const net::HostPortPair& origin, |
| 118 const net::HostPortPair& proxy_server, |
| 119 const net::HttpResponseHeaders& response_headers) OVERRIDE { |
| 120 on_tunnel_headers_received_called_ = true; |
| 121 on_tunnel_headers_received_origin_ = origin; |
| 122 on_tunnel_headers_received_proxy_server_ = proxy_server; |
| 123 on_tunnel_headers_received_status_line_ = response_headers.GetStatusLine(); |
| 124 } |
| 125 |
| 126 private: |
| 127 bool on_before_tunnel_request_called_; |
| 128 bool on_tunnel_headers_received_called_; |
| 129 HostPortPair on_tunnel_headers_received_origin_; |
| 130 HostPortPair on_tunnel_headers_received_proxy_server_; |
| 131 std::string on_tunnel_headers_received_status_line_; |
| 132 }; |
| 133 |
| 134 |
| 61 class HttpProxyClientSocketPoolTest | 135 class HttpProxyClientSocketPoolTest |
| 62 : public ::testing::TestWithParam<HttpProxyClientSocketPoolTestParams> { | 136 : public ::testing::TestWithParam<HttpProxyClientSocketPoolTestParams> { |
| 63 protected: | 137 protected: |
| 64 HttpProxyClientSocketPoolTest() | 138 HttpProxyClientSocketPoolTest() |
| 65 : session_deps_(GetParam().protocol), | 139 : session_deps_(GetParam().protocol), |
| 66 tcp_histograms_("MockTCP"), | 140 tcp_histograms_("MockTCP"), |
| 67 transport_socket_pool_( | 141 transport_socket_pool_( |
| 68 kMaxSockets, | 142 kMaxSockets, |
| 69 kMaxSocketsPerGroup, | 143 kMaxSocketsPerGroup, |
| 70 &tcp_histograms_, | 144 &tcp_histograms_, |
| (...skipping 17 matching lines...) Expand all Loading... |
| 88 BoundNetLog().net_log()), | 162 BoundNetLog().net_log()), |
| 89 session_(CreateNetworkSession()), | 163 session_(CreateNetworkSession()), |
| 90 http_proxy_histograms_("HttpProxyUnitTest"), | 164 http_proxy_histograms_("HttpProxyUnitTest"), |
| 91 spdy_util_(GetParam().protocol), | 165 spdy_util_(GetParam().protocol), |
| 92 pool_(kMaxSockets, | 166 pool_(kMaxSockets, |
| 93 kMaxSocketsPerGroup, | 167 kMaxSocketsPerGroup, |
| 94 &http_proxy_histograms_, | 168 &http_proxy_histograms_, |
| 95 NULL, | 169 NULL, |
| 96 &transport_socket_pool_, | 170 &transport_socket_pool_, |
| 97 &ssl_socket_pool_, | 171 &ssl_socket_pool_, |
| 172 NULL, |
| 98 NULL) {} | 173 NULL) {} |
| 99 | 174 |
| 100 virtual ~HttpProxyClientSocketPoolTest() { | 175 virtual ~HttpProxyClientSocketPoolTest() { |
| 101 } | 176 } |
| 102 | 177 |
| 103 void AddAuthToCache() { | 178 void AddAuthToCache() { |
| 104 const base::string16 kFoo(base::ASCIIToUTF16("foo")); | 179 const base::string16 kFoo(base::ASCIIToUTF16("foo")); |
| 105 const base::string16 kBar(base::ASCIIToUTF16("bar")); | 180 const base::string16 kBar(base::ASCIIToUTF16("bar")); |
| 106 GURL proxy_url(GetParam().proxy_type == HTTP ? | 181 GURL proxy_url(GetParam().proxy_type == HTTP ? |
| 107 (std::string("http://") + kHttpProxyHost) : | 182 (std::string("http://") + kHttpProxyHost) : |
| (...skipping 29 matching lines...) Expand all Loading... |
| 137 HostPortPair(kHttpsProxyHost, 443), | 212 HostPortPair(kHttpsProxyHost, 443), |
| 138 SSLConfig(), | 213 SSLConfig(), |
| 139 PRIVACY_MODE_DISABLED, | 214 PRIVACY_MODE_DISABLED, |
| 140 0, | 215 0, |
| 141 false, | 216 false, |
| 142 false); | 217 false); |
| 143 } | 218 } |
| 144 | 219 |
| 145 // Returns the a correctly constructed HttpProxyParms | 220 // Returns the a correctly constructed HttpProxyParms |
| 146 // for the HTTP or HTTPS proxy. | 221 // for the HTTP or HTTPS proxy. |
| 147 scoped_refptr<HttpProxySocketParams> CreateParams(bool tunnel) { | 222 scoped_refptr<HttpProxySocketParams> CreateParams( |
| 223 bool tunnel, |
| 224 ProxyDelegate* proxy_delegate) { |
| 148 return scoped_refptr<HttpProxySocketParams>(new HttpProxySocketParams( | 225 return scoped_refptr<HttpProxySocketParams>(new HttpProxySocketParams( |
| 149 CreateHttpProxyParams(), | 226 CreateHttpProxyParams(), |
| 150 CreateHttpsProxyParams(), | 227 CreateHttpsProxyParams(), |
| 151 GURL(tunnel ? "https://www.google.com/" : "http://www.google.com"), | 228 GURL(tunnel ? "https://www.google.com/" : "http://www.google.com"), |
| 152 std::string(), | 229 std::string(), |
| 153 HostPortPair("www.google.com", tunnel ? 443 : 80), | 230 HostPortPair("www.google.com", tunnel ? 443 : 80), |
| 154 session_->http_auth_cache(), | 231 session_->http_auth_cache(), |
| 155 session_->http_auth_handler_factory(), | 232 session_->http_auth_handler_factory(), |
| 156 session_->spdy_session_pool(), | 233 session_->spdy_session_pool(), |
| 157 tunnel)); | 234 tunnel, |
| 235 proxy_delegate)); |
| 158 } | 236 } |
| 159 | 237 |
| 160 scoped_refptr<HttpProxySocketParams> CreateTunnelParams() { | 238 scoped_refptr<HttpProxySocketParams> CreateTunnelParams( |
| 161 return CreateParams(true); | 239 ProxyDelegate* proxy_delegate) { |
| 240 return CreateParams(true, proxy_delegate); |
| 162 } | 241 } |
| 163 | 242 |
| 164 scoped_refptr<HttpProxySocketParams> CreateNoTunnelParams() { | 243 scoped_refptr<HttpProxySocketParams> CreateNoTunnelParams( |
| 165 return CreateParams(false); | 244 ProxyDelegate* proxy_delegate) { |
| 245 return CreateParams(false, proxy_delegate); |
| 166 } | 246 } |
| 167 | 247 |
| 168 DeterministicMockClientSocketFactory* socket_factory() { | 248 DeterministicMockClientSocketFactory* socket_factory() { |
| 169 return session_deps_.deterministic_socket_factory.get(); | 249 return session_deps_.deterministic_socket_factory.get(); |
| 170 } | 250 } |
| 171 | 251 |
| 172 void Initialize(MockRead* reads, size_t reads_count, | 252 void Initialize(MockRead* reads, size_t reads_count, |
| 173 MockWrite* writes, size_t writes_count, | 253 MockWrite* writes, size_t writes_count, |
| 174 MockRead* spdy_reads, size_t spdy_reads_count, | 254 MockRead* spdy_reads, size_t spdy_reads_count, |
| 175 MockWrite* spdy_writes, size_t spdy_writes_count) { | 255 MockWrite* spdy_writes, size_t spdy_writes_count) { |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 249 HttpProxyClientSocketPoolTestParams(HTTP, kProtoSPDY31), | 329 HttpProxyClientSocketPoolTestParams(HTTP, kProtoSPDY31), |
| 250 HttpProxyClientSocketPoolTestParams(HTTPS, kProtoSPDY31), | 330 HttpProxyClientSocketPoolTestParams(HTTPS, kProtoSPDY31), |
| 251 HttpProxyClientSocketPoolTestParams(SPDY, kProtoSPDY31), | 331 HttpProxyClientSocketPoolTestParams(SPDY, kProtoSPDY31), |
| 252 HttpProxyClientSocketPoolTestParams(HTTP, kProtoSPDY4), | 332 HttpProxyClientSocketPoolTestParams(HTTP, kProtoSPDY4), |
| 253 HttpProxyClientSocketPoolTestParams(HTTPS, kProtoSPDY4), | 333 HttpProxyClientSocketPoolTestParams(HTTPS, kProtoSPDY4), |
| 254 HttpProxyClientSocketPoolTestParams(SPDY, kProtoSPDY4))); | 334 HttpProxyClientSocketPoolTestParams(SPDY, kProtoSPDY4))); |
| 255 | 335 |
| 256 TEST_P(HttpProxyClientSocketPoolTest, NoTunnel) { | 336 TEST_P(HttpProxyClientSocketPoolTest, NoTunnel) { |
| 257 Initialize(NULL, 0, NULL, 0, NULL, 0, NULL, 0); | 337 Initialize(NULL, 0, NULL, 0, NULL, 0, NULL, 0); |
| 258 | 338 |
| 259 int rv = handle_.Init("a", CreateNoTunnelParams(), LOW, CompletionCallback(), | 339 scoped_ptr<TestProxyDelegate> proxy_delegate(new TestProxyDelegate()); |
| 260 &pool_, BoundNetLog()); | 340 int rv = handle_.Init("a", CreateNoTunnelParams(proxy_delegate.get()), LOW, |
| 341 CompletionCallback(), &pool_, BoundNetLog()); |
| 261 EXPECT_EQ(OK, rv); | 342 EXPECT_EQ(OK, rv); |
| 262 EXPECT_TRUE(handle_.is_initialized()); | 343 EXPECT_TRUE(handle_.is_initialized()); |
| 263 ASSERT_TRUE(handle_.socket()); | 344 ASSERT_TRUE(handle_.socket()); |
| 264 HttpProxyClientSocket* tunnel_socket = | 345 HttpProxyClientSocket* tunnel_socket = |
| 265 static_cast<HttpProxyClientSocket*>(handle_.socket()); | 346 static_cast<HttpProxyClientSocket*>(handle_.socket()); |
| 266 EXPECT_TRUE(tunnel_socket->IsConnected()); | 347 EXPECT_TRUE(tunnel_socket->IsConnected()); |
| 348 EXPECT_FALSE(proxy_delegate->on_before_tunnel_request_called()); |
| 349 EXPECT_FALSE(proxy_delegate->on_tunnel_headers_received_called()); |
| 267 } | 350 } |
| 268 | 351 |
| 269 // Make sure that HttpProxyConnectJob passes on its priority to its | 352 // Make sure that HttpProxyConnectJob passes on its priority to its |
| 270 // (non-SSL) socket request on Init. | 353 // (non-SSL) socket request on Init. |
| 271 TEST_P(HttpProxyClientSocketPoolTest, SetSocketRequestPriorityOnInit) { | 354 TEST_P(HttpProxyClientSocketPoolTest, SetSocketRequestPriorityOnInit) { |
| 272 Initialize(NULL, 0, NULL, 0, NULL, 0, NULL, 0); | 355 Initialize(NULL, 0, NULL, 0, NULL, 0, NULL, 0); |
| 273 EXPECT_EQ(OK, | 356 EXPECT_EQ(OK, |
| 274 handle_.Init("a", CreateNoTunnelParams(), HIGHEST, | 357 handle_.Init("a", CreateNoTunnelParams(NULL), HIGHEST, |
| 275 CompletionCallback(), &pool_, BoundNetLog())); | 358 CompletionCallback(), &pool_, BoundNetLog())); |
| 276 EXPECT_EQ(HIGHEST, GetLastTransportRequestPriority()); | 359 EXPECT_EQ(HIGHEST, GetLastTransportRequestPriority()); |
| 277 } | 360 } |
| 278 | 361 |
| 279 TEST_P(HttpProxyClientSocketPoolTest, NeedAuth) { | 362 TEST_P(HttpProxyClientSocketPoolTest, NeedAuth) { |
| 280 MockWrite writes[] = { | 363 MockWrite writes[] = { |
| 281 MockWrite(ASYNC, 0, "CONNECT www.google.com:443 HTTP/1.1\r\n" | 364 MockWrite(ASYNC, 0, "CONNECT www.google.com:443 HTTP/1.1\r\n" |
| 282 "Host: www.google.com\r\n" | 365 "Host: www.google.com\r\n" |
| 283 "Proxy-Connection: keep-alive\r\n\r\n"), | 366 "Proxy-Connection: keep-alive\r\n\r\n"), |
| 284 }; | 367 }; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 306 MockRead spdy_reads[] = { | 389 MockRead spdy_reads[] = { |
| 307 CreateMockRead(*resp, 1, ASYNC), | 390 CreateMockRead(*resp, 1, ASYNC), |
| 308 MockRead(ASYNC, 0, 3) | 391 MockRead(ASYNC, 0, 3) |
| 309 }; | 392 }; |
| 310 | 393 |
| 311 Initialize(reads, arraysize(reads), writes, arraysize(writes), | 394 Initialize(reads, arraysize(reads), writes, arraysize(writes), |
| 312 spdy_reads, arraysize(spdy_reads), spdy_writes, | 395 spdy_reads, arraysize(spdy_reads), spdy_writes, |
| 313 arraysize(spdy_writes)); | 396 arraysize(spdy_writes)); |
| 314 | 397 |
| 315 data_->StopAfter(4); | 398 data_->StopAfter(4); |
| 316 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), | 399 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, |
| 317 &pool_, BoundNetLog()); | 400 callback_.callback(), &pool_, BoundNetLog()); |
| 318 EXPECT_EQ(ERR_IO_PENDING, rv); | 401 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 319 EXPECT_FALSE(handle_.is_initialized()); | 402 EXPECT_FALSE(handle_.is_initialized()); |
| 320 EXPECT_FALSE(handle_.socket()); | 403 EXPECT_FALSE(handle_.socket()); |
| 321 | 404 |
| 322 data_->RunFor(GetParam().proxy_type == SPDY ? 2 : 4); | 405 data_->RunFor(GetParam().proxy_type == SPDY ? 2 : 4); |
| 323 rv = callback_.WaitForResult(); | 406 rv = callback_.WaitForResult(); |
| 324 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, rv); | 407 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, rv); |
| 325 EXPECT_TRUE(handle_.is_initialized()); | 408 EXPECT_TRUE(handle_.is_initialized()); |
| 326 ASSERT_TRUE(handle_.socket()); | 409 ASSERT_TRUE(handle_.socket()); |
| 327 ProxyClientSocket* tunnel_socket = | 410 ProxyClientSocket* tunnel_socket = |
| 328 static_cast<ProxyClientSocket*>(handle_.socket()); | 411 static_cast<ProxyClientSocket*>(handle_.socket()); |
| 329 if (GetParam().proxy_type == SPDY) { | 412 if (GetParam().proxy_type == SPDY) { |
| 330 EXPECT_TRUE(tunnel_socket->IsConnected()); | 413 EXPECT_TRUE(tunnel_socket->IsConnected()); |
| 331 EXPECT_TRUE(tunnel_socket->IsUsingSpdy()); | 414 EXPECT_TRUE(tunnel_socket->IsUsingSpdy()); |
| 332 } else { | 415 } else { |
| 333 EXPECT_FALSE(tunnel_socket->IsConnected()); | 416 EXPECT_FALSE(tunnel_socket->IsConnected()); |
| 334 EXPECT_FALSE(tunnel_socket->IsUsingSpdy()); | 417 EXPECT_FALSE(tunnel_socket->IsUsingSpdy()); |
| 335 } | 418 } |
| 336 } | 419 } |
| 337 | 420 |
| 338 TEST_P(HttpProxyClientSocketPoolTest, HaveAuth) { | 421 TEST_P(HttpProxyClientSocketPoolTest, HaveAuth) { |
| 339 // It's pretty much impossible to make the SPDY case behave synchronously | 422 // It's pretty much impossible to make the SPDY case behave synchronously |
| 340 // so we skip this test for SPDY | 423 // so we skip this test for SPDY |
| 341 if (GetParam().proxy_type == SPDY) | 424 if (GetParam().proxy_type == SPDY) |
| 342 return; | 425 return; |
| 426 std::string proxy_host_port = |
| 427 GetParam().proxy_type == HTTP ? |
| 428 (kHttpProxyHost + std::string(":80")) : |
| 429 (kHttpsProxyHost + std::string(":443")); |
| 430 std::string request = |
| 431 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
| 432 "Host: www.google.com\r\n" |
| 433 "Proxy-Connection: keep-alive\r\n" |
| 434 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n" |
| 435 "Foo: " + proxy_host_port + "\r\n\r\n"; |
| 343 MockWrite writes[] = { | 436 MockWrite writes[] = { |
| 344 MockWrite(SYNCHRONOUS, 0, | 437 MockWrite(SYNCHRONOUS, 0, request.c_str()), |
| 345 "CONNECT www.google.com:443 HTTP/1.1\r\n" | |
| 346 "Host: www.google.com\r\n" | |
| 347 "Proxy-Connection: keep-alive\r\n" | |
| 348 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | |
| 349 }; | 438 }; |
| 350 MockRead reads[] = { | 439 MockRead reads[] = { |
| 351 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 Connection Established\r\n\r\n"), | 440 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 Connection Established\r\n\r\n"), |
| 352 }; | 441 }; |
| 353 | 442 |
| 354 Initialize(reads, arraysize(reads), writes, arraysize(writes), NULL, 0, | 443 Initialize(reads, arraysize(reads), writes, arraysize(writes), NULL, 0, |
| 355 NULL, 0); | 444 NULL, 0); |
| 356 AddAuthToCache(); | 445 AddAuthToCache(); |
| 357 | 446 |
| 358 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), | 447 scoped_ptr<TestProxyDelegate> proxy_delegate(new TestProxyDelegate()); |
| 359 &pool_, BoundNetLog()); | 448 int rv = handle_.Init("a", CreateTunnelParams(proxy_delegate.get()), LOW, |
| 449 callback_.callback(), &pool_, BoundNetLog()); |
| 360 EXPECT_EQ(OK, rv); | 450 EXPECT_EQ(OK, rv); |
| 361 EXPECT_TRUE(handle_.is_initialized()); | 451 EXPECT_TRUE(handle_.is_initialized()); |
| 362 ASSERT_TRUE(handle_.socket()); | 452 ASSERT_TRUE(handle_.socket()); |
| 363 HttpProxyClientSocket* tunnel_socket = | 453 HttpProxyClientSocket* tunnel_socket = |
| 364 static_cast<HttpProxyClientSocket*>(handle_.socket()); | 454 static_cast<HttpProxyClientSocket*>(handle_.socket()); |
| 365 EXPECT_TRUE(tunnel_socket->IsConnected()); | 455 EXPECT_TRUE(tunnel_socket->IsConnected()); |
| 456 proxy_delegate->VerifyOnTunnelHeadersReceived( |
| 457 "www.google.com:443", |
| 458 proxy_host_port.c_str(), |
| 459 "HTTP/1.1 200 Connection Established"); |
| 366 } | 460 } |
| 367 | 461 |
| 368 TEST_P(HttpProxyClientSocketPoolTest, AsyncHaveAuth) { | 462 TEST_P(HttpProxyClientSocketPoolTest, AsyncHaveAuth) { |
| 369 MockWrite writes[] = { | 463 MockWrite writes[] = { |
| 370 MockWrite(ASYNC, 0, "CONNECT www.google.com:443 HTTP/1.1\r\n" | 464 MockWrite(ASYNC, 0, "CONNECT www.google.com:443 HTTP/1.1\r\n" |
| 371 "Host: www.google.com\r\n" | 465 "Host: www.google.com\r\n" |
| 372 "Proxy-Connection: keep-alive\r\n" | 466 "Proxy-Connection: keep-alive\r\n" |
| 373 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 467 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), |
| 374 }; | 468 }; |
| 375 MockRead reads[] = { | 469 MockRead reads[] = { |
| 376 MockRead(ASYNC, 1, "HTTP/1.1 200 Connection Established\r\n\r\n"), | 470 MockRead(ASYNC, 1, "HTTP/1.1 200 Connection Established\r\n\r\n"), |
| 377 }; | 471 }; |
| 378 | 472 |
| 379 scoped_ptr<SpdyFrame> req( | 473 scoped_ptr<SpdyFrame> req( |
| 380 spdy_util_.ConstructSpdyConnect(kAuthHeaders, kAuthHeadersSize, 1, LOW)); | 474 spdy_util_.ConstructSpdyConnect(kAuthHeaders, kAuthHeadersSize, 1, LOW)); |
| 381 MockWrite spdy_writes[] = { | 475 MockWrite spdy_writes[] = { |
| 382 CreateMockWrite(*req, 0, ASYNC) | 476 CreateMockWrite(*req, 0, ASYNC) |
| 383 }; | 477 }; |
| 384 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 478 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 385 MockRead spdy_reads[] = { | 479 MockRead spdy_reads[] = { |
| 386 CreateMockRead(*resp, 1, ASYNC), | 480 CreateMockRead(*resp, 1, ASYNC), |
| 387 MockRead(ASYNC, 0, 2) | 481 MockRead(ASYNC, 0, 2) |
| 388 }; | 482 }; |
| 389 | 483 |
| 390 Initialize(reads, arraysize(reads), writes, arraysize(writes), | 484 Initialize(reads, arraysize(reads), writes, arraysize(writes), |
| 391 spdy_reads, arraysize(spdy_reads), spdy_writes, | 485 spdy_reads, arraysize(spdy_reads), spdy_writes, |
| 392 arraysize(spdy_writes)); | 486 arraysize(spdy_writes)); |
| 393 AddAuthToCache(); | 487 AddAuthToCache(); |
| 394 | 488 |
| 395 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), | 489 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, |
| 396 &pool_, BoundNetLog()); | 490 callback_.callback(), &pool_, BoundNetLog()); |
| 397 EXPECT_EQ(ERR_IO_PENDING, rv); | 491 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 398 EXPECT_FALSE(handle_.is_initialized()); | 492 EXPECT_FALSE(handle_.is_initialized()); |
| 399 EXPECT_FALSE(handle_.socket()); | 493 EXPECT_FALSE(handle_.socket()); |
| 400 | 494 |
| 401 data_->RunFor(2); | 495 data_->RunFor(2); |
| 402 EXPECT_EQ(OK, callback_.WaitForResult()); | 496 EXPECT_EQ(OK, callback_.WaitForResult()); |
| 403 EXPECT_TRUE(handle_.is_initialized()); | 497 EXPECT_TRUE(handle_.is_initialized()); |
| 404 ASSERT_TRUE(handle_.socket()); | 498 ASSERT_TRUE(handle_.socket()); |
| 405 HttpProxyClientSocket* tunnel_socket = | 499 HttpProxyClientSocket* tunnel_socket = |
| 406 static_cast<HttpProxyClientSocket*>(handle_.socket()); | 500 static_cast<HttpProxyClientSocket*>(handle_.socket()); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 425 CreateMockRead(*resp, 1, ASYNC), | 519 CreateMockRead(*resp, 1, ASYNC), |
| 426 MockRead(ASYNC, 0, 2) | 520 MockRead(ASYNC, 0, 2) |
| 427 }; | 521 }; |
| 428 | 522 |
| 429 Initialize(NULL, 0, NULL, 0, | 523 Initialize(NULL, 0, NULL, 0, |
| 430 spdy_reads, arraysize(spdy_reads), | 524 spdy_reads, arraysize(spdy_reads), |
| 431 spdy_writes, arraysize(spdy_writes)); | 525 spdy_writes, arraysize(spdy_writes)); |
| 432 AddAuthToCache(); | 526 AddAuthToCache(); |
| 433 | 527 |
| 434 EXPECT_EQ(ERR_IO_PENDING, | 528 EXPECT_EQ(ERR_IO_PENDING, |
| 435 handle_.Init("a", CreateTunnelParams(), MEDIUM, | 529 handle_.Init("a", CreateTunnelParams(NULL), MEDIUM, |
| 436 callback_.callback(), &pool_, BoundNetLog())); | 530 callback_.callback(), &pool_, BoundNetLog())); |
| 437 EXPECT_EQ(MEDIUM, GetLastTransportRequestPriority()); | 531 EXPECT_EQ(MEDIUM, GetLastTransportRequestPriority()); |
| 438 | 532 |
| 439 data_->RunFor(2); | 533 data_->RunFor(2); |
| 440 EXPECT_EQ(OK, callback_.WaitForResult()); | 534 EXPECT_EQ(OK, callback_.WaitForResult()); |
| 441 } | 535 } |
| 442 | 536 |
| 443 TEST_P(HttpProxyClientSocketPoolTest, TCPError) { | 537 TEST_P(HttpProxyClientSocketPoolTest, TCPError) { |
| 444 if (GetParam().proxy_type == SPDY) return; | 538 if (GetParam().proxy_type == SPDY) return; |
| 445 data_.reset(new DeterministicSocketData(NULL, 0, NULL, 0)); | 539 data_.reset(new DeterministicSocketData(NULL, 0, NULL, 0)); |
| 446 data_->set_connect_data(MockConnect(ASYNC, ERR_CONNECTION_CLOSED)); | 540 data_->set_connect_data(MockConnect(ASYNC, ERR_CONNECTION_CLOSED)); |
| 447 | 541 |
| 448 socket_factory()->AddSocketDataProvider(data_.get()); | 542 socket_factory()->AddSocketDataProvider(data_.get()); |
| 449 | 543 |
| 450 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), | 544 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, |
| 451 &pool_, BoundNetLog()); | 545 callback_.callback(), &pool_, BoundNetLog()); |
| 452 EXPECT_EQ(ERR_IO_PENDING, rv); | 546 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 453 EXPECT_FALSE(handle_.is_initialized()); | 547 EXPECT_FALSE(handle_.is_initialized()); |
| 454 EXPECT_FALSE(handle_.socket()); | 548 EXPECT_FALSE(handle_.socket()); |
| 455 | 549 |
| 456 EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, callback_.WaitForResult()); | 550 EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, callback_.WaitForResult()); |
| 457 | 551 |
| 458 EXPECT_FALSE(handle_.is_initialized()); | 552 EXPECT_FALSE(handle_.is_initialized()); |
| 459 EXPECT_FALSE(handle_.socket()); | 553 EXPECT_FALSE(handle_.socket()); |
| 460 } | 554 } |
| 461 | 555 |
| 462 TEST_P(HttpProxyClientSocketPoolTest, SSLError) { | 556 TEST_P(HttpProxyClientSocketPoolTest, SSLError) { |
| 463 if (GetParam().proxy_type == HTTP) return; | 557 if (GetParam().proxy_type == HTTP) return; |
| 464 data_.reset(new DeterministicSocketData(NULL, 0, NULL, 0)); | 558 data_.reset(new DeterministicSocketData(NULL, 0, NULL, 0)); |
| 465 data_->set_connect_data(MockConnect(ASYNC, OK)); | 559 data_->set_connect_data(MockConnect(ASYNC, OK)); |
| 466 socket_factory()->AddSocketDataProvider(data_.get()); | 560 socket_factory()->AddSocketDataProvider(data_.get()); |
| 467 | 561 |
| 468 ssl_data_.reset(new SSLSocketDataProvider(ASYNC, | 562 ssl_data_.reset(new SSLSocketDataProvider(ASYNC, |
| 469 ERR_CERT_AUTHORITY_INVALID)); | 563 ERR_CERT_AUTHORITY_INVALID)); |
| 470 if (GetParam().proxy_type == SPDY) { | 564 if (GetParam().proxy_type == SPDY) { |
| 471 InitializeSpdySsl(); | 565 InitializeSpdySsl(); |
| 472 } | 566 } |
| 473 socket_factory()->AddSSLSocketDataProvider(ssl_data_.get()); | 567 socket_factory()->AddSSLSocketDataProvider(ssl_data_.get()); |
| 474 | 568 |
| 475 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), | 569 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, |
| 476 &pool_, BoundNetLog()); | 570 callback_.callback(), &pool_, BoundNetLog()); |
| 477 EXPECT_EQ(ERR_IO_PENDING, rv); | 571 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 478 EXPECT_FALSE(handle_.is_initialized()); | 572 EXPECT_FALSE(handle_.is_initialized()); |
| 479 EXPECT_FALSE(handle_.socket()); | 573 EXPECT_FALSE(handle_.socket()); |
| 480 | 574 |
| 481 EXPECT_EQ(ERR_PROXY_CERTIFICATE_INVALID, callback_.WaitForResult()); | 575 EXPECT_EQ(ERR_PROXY_CERTIFICATE_INVALID, callback_.WaitForResult()); |
| 482 | 576 |
| 483 EXPECT_FALSE(handle_.is_initialized()); | 577 EXPECT_FALSE(handle_.is_initialized()); |
| 484 EXPECT_FALSE(handle_.socket()); | 578 EXPECT_FALSE(handle_.socket()); |
| 485 } | 579 } |
| 486 | 580 |
| 487 TEST_P(HttpProxyClientSocketPoolTest, SslClientAuth) { | 581 TEST_P(HttpProxyClientSocketPoolTest, SslClientAuth) { |
| 488 if (GetParam().proxy_type == HTTP) return; | 582 if (GetParam().proxy_type == HTTP) return; |
| 489 data_.reset(new DeterministicSocketData(NULL, 0, NULL, 0)); | 583 data_.reset(new DeterministicSocketData(NULL, 0, NULL, 0)); |
| 490 data_->set_connect_data(MockConnect(ASYNC, OK)); | 584 data_->set_connect_data(MockConnect(ASYNC, OK)); |
| 491 socket_factory()->AddSocketDataProvider(data_.get()); | 585 socket_factory()->AddSocketDataProvider(data_.get()); |
| 492 | 586 |
| 493 ssl_data_.reset(new SSLSocketDataProvider(ASYNC, | 587 ssl_data_.reset(new SSLSocketDataProvider(ASYNC, |
| 494 ERR_SSL_CLIENT_AUTH_CERT_NEEDED)); | 588 ERR_SSL_CLIENT_AUTH_CERT_NEEDED)); |
| 495 if (GetParam().proxy_type == SPDY) { | 589 if (GetParam().proxy_type == SPDY) { |
| 496 InitializeSpdySsl(); | 590 InitializeSpdySsl(); |
| 497 } | 591 } |
| 498 socket_factory()->AddSSLSocketDataProvider(ssl_data_.get()); | 592 socket_factory()->AddSSLSocketDataProvider(ssl_data_.get()); |
| 499 | 593 |
| 500 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), | 594 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, |
| 501 &pool_, BoundNetLog()); | 595 callback_.callback(), &pool_, BoundNetLog()); |
| 502 EXPECT_EQ(ERR_IO_PENDING, rv); | 596 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 503 EXPECT_FALSE(handle_.is_initialized()); | 597 EXPECT_FALSE(handle_.is_initialized()); |
| 504 EXPECT_FALSE(handle_.socket()); | 598 EXPECT_FALSE(handle_.socket()); |
| 505 | 599 |
| 506 EXPECT_EQ(ERR_SSL_CLIENT_AUTH_CERT_NEEDED, callback_.WaitForResult()); | 600 EXPECT_EQ(ERR_SSL_CLIENT_AUTH_CERT_NEEDED, callback_.WaitForResult()); |
| 507 | 601 |
| 508 EXPECT_FALSE(handle_.is_initialized()); | 602 EXPECT_FALSE(handle_.is_initialized()); |
| 509 EXPECT_FALSE(handle_.socket()); | 603 EXPECT_FALSE(handle_.socket()); |
| 510 } | 604 } |
| 511 | 605 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 528 }; | 622 }; |
| 529 MockRead spdy_reads[] = { | 623 MockRead spdy_reads[] = { |
| 530 MockRead(ASYNC, ERR_CONNECTION_CLOSED, 1), | 624 MockRead(ASYNC, ERR_CONNECTION_CLOSED, 1), |
| 531 }; | 625 }; |
| 532 | 626 |
| 533 Initialize(reads, arraysize(reads), writes, arraysize(writes), | 627 Initialize(reads, arraysize(reads), writes, arraysize(writes), |
| 534 spdy_reads, arraysize(spdy_reads), spdy_writes, | 628 spdy_reads, arraysize(spdy_reads), spdy_writes, |
| 535 arraysize(spdy_writes)); | 629 arraysize(spdy_writes)); |
| 536 AddAuthToCache(); | 630 AddAuthToCache(); |
| 537 | 631 |
| 538 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), | 632 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, |
| 539 &pool_, BoundNetLog()); | 633 callback_.callback(), &pool_, BoundNetLog()); |
| 540 EXPECT_EQ(ERR_IO_PENDING, rv); | 634 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 541 EXPECT_FALSE(handle_.is_initialized()); | 635 EXPECT_FALSE(handle_.is_initialized()); |
| 542 EXPECT_FALSE(handle_.socket()); | 636 EXPECT_FALSE(handle_.socket()); |
| 543 | 637 |
| 544 data_->RunFor(3); | 638 data_->RunFor(3); |
| 545 if (GetParam().proxy_type == SPDY) { | 639 if (GetParam().proxy_type == SPDY) { |
| 546 // SPDY cannot process a headers block unless it's complete and so it | 640 // SPDY cannot process a headers block unless it's complete and so it |
| 547 // returns ERR_CONNECTION_CLOSED in this case. | 641 // returns ERR_CONNECTION_CLOSED in this case. |
| 548 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback_.WaitForResult()); | 642 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback_.WaitForResult()); |
| 549 } else { | 643 } else { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 567 "Proxy-Connection: keep-alive\r\n\r\n"), | 661 "Proxy-Connection: keep-alive\r\n\r\n"), |
| 568 }; | 662 }; |
| 569 MockRead reads[] = { | 663 MockRead reads[] = { |
| 570 MockRead(ASYNC, 1, "HTTP/1.1 100 Continue\r\n\r\n"), | 664 MockRead(ASYNC, 1, "HTTP/1.1 100 Continue\r\n\r\n"), |
| 571 MockRead(ASYNC, 2, "HTTP/1.1 200 Connection Established\r\n\r\n"), | 665 MockRead(ASYNC, 2, "HTTP/1.1 200 Connection Established\r\n\r\n"), |
| 572 }; | 666 }; |
| 573 | 667 |
| 574 Initialize(reads, arraysize(reads), writes, arraysize(writes), | 668 Initialize(reads, arraysize(reads), writes, arraysize(writes), |
| 575 NULL, 0, NULL, 0); | 669 NULL, 0, NULL, 0); |
| 576 | 670 |
| 577 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), | 671 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, |
| 578 &pool_, BoundNetLog()); | 672 callback_.callback(), &pool_, BoundNetLog()); |
| 579 EXPECT_EQ(ERR_IO_PENDING, rv); | 673 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 580 EXPECT_FALSE(handle_.is_initialized()); | 674 EXPECT_FALSE(handle_.is_initialized()); |
| 581 EXPECT_FALSE(handle_.socket()); | 675 EXPECT_FALSE(handle_.socket()); |
| 582 | 676 |
| 583 data_->RunFor(2); | 677 data_->RunFor(2); |
| 584 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, callback_.WaitForResult()); | 678 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, callback_.WaitForResult()); |
| 585 } | 679 } |
| 586 | 680 |
| 587 TEST_P(HttpProxyClientSocketPoolTest, TunnelSetupError) { | 681 TEST_P(HttpProxyClientSocketPoolTest, TunnelSetupError) { |
| 588 MockWrite writes[] = { | 682 MockWrite writes[] = { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 607 MockRead spdy_reads[] = { | 701 MockRead spdy_reads[] = { |
| 608 CreateMockRead(*resp, 1, ASYNC), | 702 CreateMockRead(*resp, 1, ASYNC), |
| 609 MockRead(ASYNC, 0, 3), | 703 MockRead(ASYNC, 0, 3), |
| 610 }; | 704 }; |
| 611 | 705 |
| 612 Initialize(reads, arraysize(reads), writes, arraysize(writes), | 706 Initialize(reads, arraysize(reads), writes, arraysize(writes), |
| 613 spdy_reads, arraysize(spdy_reads), spdy_writes, | 707 spdy_reads, arraysize(spdy_reads), spdy_writes, |
| 614 arraysize(spdy_writes)); | 708 arraysize(spdy_writes)); |
| 615 AddAuthToCache(); | 709 AddAuthToCache(); |
| 616 | 710 |
| 617 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), | 711 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, |
| 618 &pool_, BoundNetLog()); | 712 callback_.callback(), &pool_, BoundNetLog()); |
| 619 EXPECT_EQ(ERR_IO_PENDING, rv); | 713 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 620 EXPECT_FALSE(handle_.is_initialized()); | 714 EXPECT_FALSE(handle_.is_initialized()); |
| 621 EXPECT_FALSE(handle_.socket()); | 715 EXPECT_FALSE(handle_.socket()); |
| 622 | 716 |
| 623 data_->RunFor(2); | 717 data_->RunFor(2); |
| 624 | 718 |
| 625 rv = callback_.WaitForResult(); | 719 rv = callback_.WaitForResult(); |
| 626 // All Proxy CONNECT responses are not trustworthy | 720 // All Proxy CONNECT responses are not trustworthy |
| 627 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, rv); | 721 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, rv); |
| 628 EXPECT_FALSE(handle_.is_initialized()); | 722 EXPECT_FALSE(handle_.is_initialized()); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 669 MockRead spdy_reads[] = { | 763 MockRead spdy_reads[] = { |
| 670 CreateMockRead(*resp, 1, ASYNC), | 764 CreateMockRead(*resp, 1, ASYNC), |
| 671 MockRead(ASYNC, 0, 2), | 765 MockRead(ASYNC, 0, 2), |
| 672 }; | 766 }; |
| 673 | 767 |
| 674 Initialize(reads, arraysize(reads), writes, arraysize(writes), | 768 Initialize(reads, arraysize(reads), writes, arraysize(writes), |
| 675 spdy_reads, arraysize(spdy_reads), spdy_writes, | 769 spdy_reads, arraysize(spdy_reads), spdy_writes, |
| 676 arraysize(spdy_writes)); | 770 arraysize(spdy_writes)); |
| 677 AddAuthToCache(); | 771 AddAuthToCache(); |
| 678 | 772 |
| 679 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), | 773 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, |
| 680 &pool_, BoundNetLog()); | 774 callback_.callback(), &pool_, BoundNetLog()); |
| 681 EXPECT_EQ(ERR_IO_PENDING, rv); | 775 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 682 EXPECT_FALSE(handle_.is_initialized()); | 776 EXPECT_FALSE(handle_.is_initialized()); |
| 683 EXPECT_FALSE(handle_.socket()); | 777 EXPECT_FALSE(handle_.socket()); |
| 684 | 778 |
| 685 data_->RunFor(2); | 779 data_->RunFor(2); |
| 686 | 780 |
| 687 rv = callback_.WaitForResult(); | 781 rv = callback_.WaitForResult(); |
| 688 | 782 |
| 689 if (GetParam().proxy_type == HTTP) { | 783 if (GetParam().proxy_type == HTTP) { |
| 690 // We don't trust 302 responses to CONNECT from HTTP proxies. | 784 // We don't trust 302 responses to CONNECT from HTTP proxies. |
| (...skipping 22 matching lines...) Expand all Loading... |
| 713 EXPECT_TRUE(headers->IsRedirect(&location)); | 807 EXPECT_TRUE(headers->IsRedirect(&location)); |
| 714 EXPECT_EQ(location, redirectTarget); | 808 EXPECT_EQ(location, redirectTarget); |
| 715 } | 809 } |
| 716 } | 810 } |
| 717 | 811 |
| 718 // It would be nice to also test the timeouts in HttpProxyClientSocketPool. | 812 // It would be nice to also test the timeouts in HttpProxyClientSocketPool. |
| 719 | 813 |
| 720 } // namespace | 814 } // namespace |
| 721 | 815 |
| 722 } // namespace net | 816 } // namespace net |
| OLD | NEW |