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 |