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/string_util.h" | 9 #include "base/string_util.h" |
10 #include "base/utf_string_conversions.h" | 10 #include "base/utf_string_conversions.h" |
11 #include "net/base/mock_host_resolver.h" | 11 #include "net/base/mock_host_resolver.h" |
12 #include "net/base/net_errors.h" | 12 #include "net/base/net_errors.h" |
13 #include "net/base/ssl_config_service_defaults.h" | 13 #include "net/base/ssl_config_service_defaults.h" |
14 #include "net/base/test_completion_callback.h" | 14 #include "net/base/test_completion_callback.h" |
15 #include "net/http/http_auth_handler_factory.h" | 15 #include "net/http/http_auth_handler_factory.h" |
16 #include "net/http/http_network_session.h" | 16 #include "net/http/http_network_session.h" |
17 #include "net/http/http_proxy_client_socket.h" | 17 #include "net/http/http_proxy_client_socket.h" |
18 #include "net/http/http_server_properties_impl.h" | 18 #include "net/http/http_server_properties_impl.h" |
19 #include "net/proxy/proxy_service.h" | 19 #include "net/proxy/proxy_service.h" |
20 #include "net/socket/client_socket_handle.h" | 20 #include "net/socket/client_socket_handle.h" |
21 #include "net/socket/client_socket_pool_histograms.h" | 21 #include "net/socket/client_socket_pool_histograms.h" |
22 #include "net/socket/socket_test_util.h" | 22 #include "net/socket/socket_test_util.h" |
23 #include "net/spdy/spdy_protocol.h" | 23 #include "net/spdy/spdy_protocol.h" |
24 #include "net/spdy/spdy_test_util.h" | 24 #include "net/spdy/spdy_test_util_spdy2.h" |
25 #include "testing/gtest/include/gtest/gtest.h" | 25 #include "testing/gtest/include/gtest/gtest.h" |
26 | 26 |
| 27 using namespace net::test_spdy2; |
| 28 |
27 namespace net { | 29 namespace net { |
28 | 30 |
29 namespace { | 31 namespace { |
30 | 32 |
31 const int kMaxSockets = 32; | 33 const int kMaxSockets = 32; |
32 const int kMaxSocketsPerGroup = 6; | 34 const int kMaxSocketsPerGroup = 6; |
33 const char * const kAuthHeaders[] = { | 35 const char * const kAuthHeaders[] = { |
34 "proxy-authorization", "Basic Zm9vOmJhcg==" | 36 "proxy-authorization", "Basic Zm9vOmJhcg==" |
35 }; | 37 }; |
36 const int kAuthHeadersSize = arraysize(kAuthHeaders) / 2; | 38 const int kAuthHeadersSize = arraysize(kAuthHeaders) / 2; |
37 | 39 |
38 enum HttpProxyType { | 40 enum HttpProxyType { |
39 HTTP, | 41 HTTP, |
40 HTTPS, | 42 HTTPS, |
41 SPDY | 43 SPDY |
42 }; | 44 }; |
43 | 45 |
44 typedef ::testing::TestWithParam<HttpProxyType> TestWithHttpParam; | 46 typedef ::testing::TestWithParam<HttpProxyType> TestWithHttpParam; |
45 | 47 |
46 } // namespace | 48 } // namespace |
47 | 49 |
48 class HttpProxyClientSocketPoolTest : public TestWithHttpParam { | 50 class HttpProxyClientSocketPoolSpdy21Test : public TestWithHttpParam { |
49 protected: | 51 protected: |
50 HttpProxyClientSocketPoolTest() | 52 HttpProxyClientSocketPoolSpdy21Test() |
51 : ssl_config_(), | 53 : ssl_config_(), |
52 ignored_transport_socket_params_(new TransportSocketParams( | 54 ignored_transport_socket_params_(new TransportSocketParams( |
53 HostPortPair("proxy", 80), LOWEST, false, false)), | 55 HostPortPair("proxy", 80), LOWEST, false, false)), |
54 ignored_ssl_socket_params_(new SSLSocketParams( | 56 ignored_ssl_socket_params_(new SSLSocketParams( |
55 ignored_transport_socket_params_, NULL, NULL, | 57 ignored_transport_socket_params_, NULL, NULL, |
56 ProxyServer::SCHEME_DIRECT, HostPortPair("www.google.com", 443), | 58 ProxyServer::SCHEME_DIRECT, HostPortPair("www.google.com", 443), |
57 ssl_config_, 0, false, false)), | 59 ssl_config_, 0, false, false)), |
58 tcp_histograms_("MockTCP"), | 60 tcp_histograms_("MockTCP"), |
59 transport_socket_pool_( | 61 transport_socket_pool_( |
60 kMaxSockets, kMaxSocketsPerGroup, | 62 kMaxSockets, kMaxSocketsPerGroup, |
(...skipping 23 matching lines...) Expand all Loading... |
84 ssl_data_(NULL), | 86 ssl_data_(NULL), |
85 data_(NULL), | 87 data_(NULL), |
86 pool_(kMaxSockets, kMaxSocketsPerGroup, | 88 pool_(kMaxSockets, kMaxSocketsPerGroup, |
87 &http_proxy_histograms_, | 89 &http_proxy_histograms_, |
88 NULL, | 90 NULL, |
89 &transport_socket_pool_, | 91 &transport_socket_pool_, |
90 &ssl_socket_pool_, | 92 &ssl_socket_pool_, |
91 NULL) { | 93 NULL) { |
92 } | 94 } |
93 | 95 |
94 virtual ~HttpProxyClientSocketPoolTest() { | 96 virtual ~HttpProxyClientSocketPoolSpdy21Test() { |
95 } | 97 } |
96 | 98 |
97 void AddAuthToCache() { | 99 void AddAuthToCache() { |
98 const string16 kFoo(ASCIIToUTF16("foo")); | 100 const string16 kFoo(ASCIIToUTF16("foo")); |
99 const string16 kBar(ASCIIToUTF16("bar")); | 101 const string16 kBar(ASCIIToUTF16("bar")); |
100 GURL proxy_url(GetParam() == HTTP ? "http://proxy" : "https://proxy:80"); | 102 GURL proxy_url(GetParam() == HTTP ? "http://proxy" : "https://proxy:80"); |
101 session_->http_auth_cache()->Add(proxy_url, | 103 session_->http_auth_cache()->Add(proxy_url, |
102 "MyRealm1", | 104 "MyRealm1", |
103 HttpAuth::AUTH_SCHEME_BASIC, | 105 HttpAuth::AUTH_SCHEME_BASIC, |
104 "Basic realm=MyRealm1", | 106 "Basic realm=MyRealm1", |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
212 scoped_ptr<SSLSocketDataProvider> ssl_data_; | 214 scoped_ptr<SSLSocketDataProvider> ssl_data_; |
213 scoped_refptr<DeterministicSocketData> data_; | 215 scoped_refptr<DeterministicSocketData> data_; |
214 HttpProxyClientSocketPool pool_; | 216 HttpProxyClientSocketPool pool_; |
215 ClientSocketHandle handle_; | 217 ClientSocketHandle handle_; |
216 TestCompletionCallback callback_; | 218 TestCompletionCallback callback_; |
217 }; | 219 }; |
218 | 220 |
219 //----------------------------------------------------------------------------- | 221 //----------------------------------------------------------------------------- |
220 // All tests are run with three different proxy types: HTTP, HTTPS (non-SPDY) | 222 // All tests are run with three different proxy types: HTTP, HTTPS (non-SPDY) |
221 // and SPDY. | 223 // and SPDY. |
222 INSTANTIATE_TEST_CASE_P(HttpProxyClientSocketPoolTests, | 224 INSTANTIATE_TEST_CASE_P(HttpProxyClientSocketPoolSpdy21Tests, |
223 HttpProxyClientSocketPoolTest, | 225 HttpProxyClientSocketPoolSpdy21Test, |
224 ::testing::Values(HTTP, HTTPS, SPDY)); | 226 ::testing::Values(HTTP, HTTPS, SPDY)); |
225 | 227 |
226 TEST_P(HttpProxyClientSocketPoolTest, NoTunnel) { | 228 TEST_P(HttpProxyClientSocketPoolSpdy21Test, NoTunnel) { |
227 Initialize(NULL, 0, NULL, 0, NULL, 0, NULL, 0); | 229 Initialize(NULL, 0, NULL, 0, NULL, 0, NULL, 0); |
228 | 230 |
229 int rv = handle_.Init("a", GetNoTunnelParams(), LOW, CompletionCallback(), | 231 int rv = handle_.Init("a", GetNoTunnelParams(), LOW, CompletionCallback(), |
230 &pool_, BoundNetLog()); | 232 &pool_, BoundNetLog()); |
231 EXPECT_EQ(OK, rv); | 233 EXPECT_EQ(OK, rv); |
232 EXPECT_TRUE(handle_.is_initialized()); | 234 EXPECT_TRUE(handle_.is_initialized()); |
233 ASSERT_TRUE(handle_.socket()); | 235 ASSERT_TRUE(handle_.socket()); |
234 HttpProxyClientSocket* tunnel_socket = | 236 HttpProxyClientSocket* tunnel_socket = |
235 static_cast<HttpProxyClientSocket*>(handle_.socket()); | 237 static_cast<HttpProxyClientSocket*>(handle_.socket()); |
236 EXPECT_TRUE(tunnel_socket->IsConnected()); | 238 EXPECT_TRUE(tunnel_socket->IsConnected()); |
237 } | 239 } |
238 | 240 |
239 TEST_P(HttpProxyClientSocketPoolTest, NeedAuth) { | 241 TEST_P(HttpProxyClientSocketPoolSpdy21Test, NeedAuth) { |
240 MockWrite writes[] = { | 242 MockWrite writes[] = { |
241 MockWrite(ASYNC, 0, "CONNECT www.google.com:443 HTTP/1.1\r\n" | 243 MockWrite(ASYNC, 0, "CONNECT www.google.com:443 HTTP/1.1\r\n" |
242 "Host: www.google.com\r\n" | 244 "Host: www.google.com\r\n" |
243 "Proxy-Connection: keep-alive\r\n\r\n"), | 245 "Proxy-Connection: keep-alive\r\n\r\n"), |
244 }; | 246 }; |
245 MockRead reads[] = { | 247 MockRead reads[] = { |
246 // No credentials. | 248 // No credentials. |
247 MockRead(ASYNC, 1, "HTTP/1.1 407 Proxy Authentication Required\r\n"), | 249 MockRead(ASYNC, 1, "HTTP/1.1 407 Proxy Authentication Required\r\n"), |
248 MockRead(ASYNC, 2, "Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"), | 250 MockRead(ASYNC, 2, "Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"), |
249 MockRead(ASYNC, 3, "Content-Length: 10\r\n\r\n"), | 251 MockRead(ASYNC, 3, "Content-Length: 10\r\n\r\n"), |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
297 if (GetParam() == SPDY) { | 299 if (GetParam() == SPDY) { |
298 EXPECT_TRUE(tunnel_socket->IsConnected()); | 300 EXPECT_TRUE(tunnel_socket->IsConnected()); |
299 EXPECT_TRUE(tunnel_socket->IsUsingSpdy()); | 301 EXPECT_TRUE(tunnel_socket->IsUsingSpdy()); |
300 } else { | 302 } else { |
301 EXPECT_FALSE(tunnel_socket->IsConnected()); | 303 EXPECT_FALSE(tunnel_socket->IsConnected()); |
302 EXPECT_FALSE(tunnel_socket->IsUsingSpdy()); | 304 EXPECT_FALSE(tunnel_socket->IsUsingSpdy()); |
303 EXPECT_FALSE(tunnel_socket->IsUsingSpdy()); | 305 EXPECT_FALSE(tunnel_socket->IsUsingSpdy()); |
304 } | 306 } |
305 } | 307 } |
306 | 308 |
307 TEST_P(HttpProxyClientSocketPoolTest, HaveAuth) { | 309 TEST_P(HttpProxyClientSocketPoolSpdy21Test, HaveAuth) { |
308 // It's pretty much impossible to make the SPDY case behave synchronously | 310 // It's pretty much impossible to make the SPDY case behave synchronously |
309 // so we skip this test for SPDY | 311 // so we skip this test for SPDY |
310 if (GetParam() == SPDY) | 312 if (GetParam() == SPDY) |
311 return; | 313 return; |
312 MockWrite writes[] = { | 314 MockWrite writes[] = { |
313 MockWrite(SYNCHRONOUS, 0, | 315 MockWrite(SYNCHRONOUS, 0, |
314 "CONNECT www.google.com:443 HTTP/1.1\r\n" | 316 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
315 "Host: www.google.com\r\n" | 317 "Host: www.google.com\r\n" |
316 "Proxy-Connection: keep-alive\r\n" | 318 "Proxy-Connection: keep-alive\r\n" |
317 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 319 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), |
318 }; | 320 }; |
319 MockRead reads[] = { | 321 MockRead reads[] = { |
320 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 Connection Established\r\n\r\n"), | 322 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 Connection Established\r\n\r\n"), |
321 }; | 323 }; |
322 | 324 |
323 Initialize(reads, arraysize(reads), writes, arraysize(writes), NULL, 0, | 325 Initialize(reads, arraysize(reads), writes, arraysize(writes), NULL, 0, |
324 NULL, 0); | 326 NULL, 0); |
325 AddAuthToCache(); | 327 AddAuthToCache(); |
326 | 328 |
327 int rv = handle_.Init("a", GetTunnelParams(), LOW, callback_.callback(), | 329 int rv = handle_.Init("a", GetTunnelParams(), LOW, callback_.callback(), |
328 &pool_, BoundNetLog()); | 330 &pool_, BoundNetLog()); |
329 EXPECT_EQ(OK, rv); | 331 EXPECT_EQ(OK, rv); |
330 EXPECT_TRUE(handle_.is_initialized()); | 332 EXPECT_TRUE(handle_.is_initialized()); |
331 ASSERT_TRUE(handle_.socket()); | 333 ASSERT_TRUE(handle_.socket()); |
332 HttpProxyClientSocket* tunnel_socket = | 334 HttpProxyClientSocket* tunnel_socket = |
333 static_cast<HttpProxyClientSocket*>(handle_.socket()); | 335 static_cast<HttpProxyClientSocket*>(handle_.socket()); |
334 EXPECT_TRUE(tunnel_socket->IsConnected()); | 336 EXPECT_TRUE(tunnel_socket->IsConnected()); |
335 } | 337 } |
336 | 338 |
337 TEST_P(HttpProxyClientSocketPoolTest, AsyncHaveAuth) { | 339 TEST_P(HttpProxyClientSocketPoolSpdy21Test, AsyncHaveAuth) { |
338 MockWrite writes[] = { | 340 MockWrite writes[] = { |
339 MockWrite("CONNECT www.google.com:443 HTTP/1.1\r\n" | 341 MockWrite("CONNECT www.google.com:443 HTTP/1.1\r\n" |
340 "Host: www.google.com\r\n" | 342 "Host: www.google.com\r\n" |
341 "Proxy-Connection: keep-alive\r\n" | 343 "Proxy-Connection: keep-alive\r\n" |
342 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 344 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), |
343 }; | 345 }; |
344 MockRead reads[] = { | 346 MockRead reads[] = { |
345 MockRead(SYNCHRONOUS, "HTTP/1.1 200 Connection Established\r\n\r\n"), | 347 MockRead(SYNCHRONOUS, "HTTP/1.1 200 Connection Established\r\n\r\n"), |
346 }; | 348 }; |
347 | 349 |
(...skipping 21 matching lines...) Expand all Loading... |
369 | 371 |
370 data_->RunFor(2); | 372 data_->RunFor(2); |
371 EXPECT_EQ(OK, callback_.WaitForResult()); | 373 EXPECT_EQ(OK, callback_.WaitForResult()); |
372 EXPECT_TRUE(handle_.is_initialized()); | 374 EXPECT_TRUE(handle_.is_initialized()); |
373 ASSERT_TRUE(handle_.socket()); | 375 ASSERT_TRUE(handle_.socket()); |
374 HttpProxyClientSocket* tunnel_socket = | 376 HttpProxyClientSocket* tunnel_socket = |
375 static_cast<HttpProxyClientSocket*>(handle_.socket()); | 377 static_cast<HttpProxyClientSocket*>(handle_.socket()); |
376 EXPECT_TRUE(tunnel_socket->IsConnected()); | 378 EXPECT_TRUE(tunnel_socket->IsConnected()); |
377 } | 379 } |
378 | 380 |
379 TEST_P(HttpProxyClientSocketPoolTest, TCPError) { | 381 TEST_P(HttpProxyClientSocketPoolSpdy21Test, TCPError) { |
380 if (GetParam() == SPDY) return; | 382 if (GetParam() == SPDY) return; |
381 data_ = new DeterministicSocketData(NULL, 0, NULL, 0); | 383 data_ = new DeterministicSocketData(NULL, 0, NULL, 0); |
382 data_->set_connect_data(MockConnect(ASYNC, ERR_CONNECTION_CLOSED)); | 384 data_->set_connect_data(MockConnect(ASYNC, ERR_CONNECTION_CLOSED)); |
383 | 385 |
384 socket_factory().AddSocketDataProvider(data_.get()); | 386 socket_factory().AddSocketDataProvider(data_.get()); |
385 | 387 |
386 int rv = handle_.Init("a", GetTunnelParams(), LOW, callback_.callback(), | 388 int rv = handle_.Init("a", GetTunnelParams(), LOW, callback_.callback(), |
387 &pool_, BoundNetLog()); | 389 &pool_, BoundNetLog()); |
388 EXPECT_EQ(ERR_IO_PENDING, rv); | 390 EXPECT_EQ(ERR_IO_PENDING, rv); |
389 EXPECT_FALSE(handle_.is_initialized()); | 391 EXPECT_FALSE(handle_.is_initialized()); |
390 EXPECT_FALSE(handle_.socket()); | 392 EXPECT_FALSE(handle_.socket()); |
391 | 393 |
392 EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, callback_.WaitForResult()); | 394 EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, callback_.WaitForResult()); |
393 | 395 |
394 EXPECT_FALSE(handle_.is_initialized()); | 396 EXPECT_FALSE(handle_.is_initialized()); |
395 EXPECT_FALSE(handle_.socket()); | 397 EXPECT_FALSE(handle_.socket()); |
396 } | 398 } |
397 | 399 |
398 TEST_P(HttpProxyClientSocketPoolTest, SSLError) { | 400 TEST_P(HttpProxyClientSocketPoolSpdy21Test, SSLError) { |
399 if (GetParam() == HTTP) return; | 401 if (GetParam() == HTTP) return; |
400 data_ = new DeterministicSocketData(NULL, 0, NULL, 0); | 402 data_ = new DeterministicSocketData(NULL, 0, NULL, 0); |
401 data_->set_connect_data(MockConnect(ASYNC, OK)); | 403 data_->set_connect_data(MockConnect(ASYNC, OK)); |
402 socket_factory().AddSocketDataProvider(data_.get()); | 404 socket_factory().AddSocketDataProvider(data_.get()); |
403 | 405 |
404 ssl_data_.reset(new SSLSocketDataProvider(ASYNC, | 406 ssl_data_.reset(new SSLSocketDataProvider(ASYNC, |
405 ERR_CERT_AUTHORITY_INVALID)); | 407 ERR_CERT_AUTHORITY_INVALID)); |
406 if (GetParam() == SPDY) { | 408 if (GetParam() == SPDY) { |
407 InitializeSpdySsl(); | 409 InitializeSpdySsl(); |
408 } | 410 } |
409 socket_factory().AddSSLSocketDataProvider(ssl_data_.get()); | 411 socket_factory().AddSSLSocketDataProvider(ssl_data_.get()); |
410 | 412 |
411 int rv = handle_.Init("a", GetTunnelParams(), LOW, callback_.callback(), | 413 int rv = handle_.Init("a", GetTunnelParams(), LOW, callback_.callback(), |
412 &pool_, BoundNetLog()); | 414 &pool_, BoundNetLog()); |
413 EXPECT_EQ(ERR_IO_PENDING, rv); | 415 EXPECT_EQ(ERR_IO_PENDING, rv); |
414 EXPECT_FALSE(handle_.is_initialized()); | 416 EXPECT_FALSE(handle_.is_initialized()); |
415 EXPECT_FALSE(handle_.socket()); | 417 EXPECT_FALSE(handle_.socket()); |
416 | 418 |
417 EXPECT_EQ(ERR_PROXY_CERTIFICATE_INVALID, callback_.WaitForResult()); | 419 EXPECT_EQ(ERR_PROXY_CERTIFICATE_INVALID, callback_.WaitForResult()); |
418 | 420 |
419 EXPECT_FALSE(handle_.is_initialized()); | 421 EXPECT_FALSE(handle_.is_initialized()); |
420 EXPECT_FALSE(handle_.socket()); | 422 EXPECT_FALSE(handle_.socket()); |
421 } | 423 } |
422 | 424 |
423 TEST_P(HttpProxyClientSocketPoolTest, SslClientAuth) { | 425 TEST_P(HttpProxyClientSocketPoolSpdy21Test, SslClientAuth) { |
424 if (GetParam() == HTTP) return; | 426 if (GetParam() == HTTP) return; |
425 data_ = new DeterministicSocketData(NULL, 0, NULL, 0); | 427 data_ = new DeterministicSocketData(NULL, 0, NULL, 0); |
426 data_->set_connect_data(MockConnect(ASYNC, OK)); | 428 data_->set_connect_data(MockConnect(ASYNC, OK)); |
427 socket_factory().AddSocketDataProvider(data_.get()); | 429 socket_factory().AddSocketDataProvider(data_.get()); |
428 | 430 |
429 ssl_data_.reset(new SSLSocketDataProvider(ASYNC, | 431 ssl_data_.reset(new SSLSocketDataProvider(ASYNC, |
430 ERR_SSL_CLIENT_AUTH_CERT_NEEDED)); | 432 ERR_SSL_CLIENT_AUTH_CERT_NEEDED)); |
431 if (GetParam() == SPDY) { | 433 if (GetParam() == SPDY) { |
432 InitializeSpdySsl(); | 434 InitializeSpdySsl(); |
433 } | 435 } |
434 socket_factory().AddSSLSocketDataProvider(ssl_data_.get()); | 436 socket_factory().AddSSLSocketDataProvider(ssl_data_.get()); |
435 | 437 |
436 int rv = handle_.Init("a", GetTunnelParams(), LOW, callback_.callback(), | 438 int rv = handle_.Init("a", GetTunnelParams(), LOW, callback_.callback(), |
437 &pool_, BoundNetLog()); | 439 &pool_, BoundNetLog()); |
438 EXPECT_EQ(ERR_IO_PENDING, rv); | 440 EXPECT_EQ(ERR_IO_PENDING, rv); |
439 EXPECT_FALSE(handle_.is_initialized()); | 441 EXPECT_FALSE(handle_.is_initialized()); |
440 EXPECT_FALSE(handle_.socket()); | 442 EXPECT_FALSE(handle_.socket()); |
441 | 443 |
442 EXPECT_EQ(ERR_SSL_CLIENT_AUTH_CERT_NEEDED, callback_.WaitForResult()); | 444 EXPECT_EQ(ERR_SSL_CLIENT_AUTH_CERT_NEEDED, callback_.WaitForResult()); |
443 | 445 |
444 EXPECT_FALSE(handle_.is_initialized()); | 446 EXPECT_FALSE(handle_.is_initialized()); |
445 EXPECT_FALSE(handle_.socket()); | 447 EXPECT_FALSE(handle_.socket()); |
446 } | 448 } |
447 | 449 |
448 TEST_P(HttpProxyClientSocketPoolTest, TunnelUnexpectedClose) { | 450 TEST_P(HttpProxyClientSocketPoolSpdy21Test, TunnelUnexpectedClose) { |
449 MockWrite writes[] = { | 451 MockWrite writes[] = { |
450 MockWrite(ASYNC, 0, | 452 MockWrite(ASYNC, 0, |
451 "CONNECT www.google.com:443 HTTP/1.1\r\n" | 453 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
452 "Host: www.google.com\r\n" | 454 "Host: www.google.com\r\n" |
453 "Proxy-Connection: keep-alive\r\n" | 455 "Proxy-Connection: keep-alive\r\n" |
454 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 456 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), |
455 }; | 457 }; |
456 MockRead reads[] = { | 458 MockRead reads[] = { |
457 MockRead(ASYNC, 1, "HTTP/1.1 200 Conn"), | 459 MockRead(ASYNC, 1, "HTTP/1.1 200 Conn"), |
458 MockRead(ASYNC, ERR_CONNECTION_CLOSED, 2), | 460 MockRead(ASYNC, ERR_CONNECTION_CLOSED, 2), |
(...skipping 17 matching lines...) Expand all Loading... |
476 EXPECT_EQ(ERR_IO_PENDING, rv); | 478 EXPECT_EQ(ERR_IO_PENDING, rv); |
477 EXPECT_FALSE(handle_.is_initialized()); | 479 EXPECT_FALSE(handle_.is_initialized()); |
478 EXPECT_FALSE(handle_.socket()); | 480 EXPECT_FALSE(handle_.socket()); |
479 | 481 |
480 data_->RunFor(3); | 482 data_->RunFor(3); |
481 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback_.WaitForResult()); | 483 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback_.WaitForResult()); |
482 EXPECT_FALSE(handle_.is_initialized()); | 484 EXPECT_FALSE(handle_.is_initialized()); |
483 EXPECT_FALSE(handle_.socket()); | 485 EXPECT_FALSE(handle_.socket()); |
484 } | 486 } |
485 | 487 |
486 TEST_P(HttpProxyClientSocketPoolTest, TunnelSetupError) { | 488 TEST_P(HttpProxyClientSocketPoolSpdy21Test, TunnelSetupError) { |
487 MockWrite writes[] = { | 489 MockWrite writes[] = { |
488 MockWrite(ASYNC, 0, | 490 MockWrite(ASYNC, 0, |
489 "CONNECT www.google.com:443 HTTP/1.1\r\n" | 491 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
490 "Host: www.google.com\r\n" | 492 "Host: www.google.com\r\n" |
491 "Proxy-Connection: keep-alive\r\n" | 493 "Proxy-Connection: keep-alive\r\n" |
492 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 494 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), |
493 }; | 495 }; |
494 MockRead reads[] = { | 496 MockRead reads[] = { |
495 MockRead(ASYNC, 1, "HTTP/1.1 304 Not Modified\r\n\r\n"), | 497 MockRead(ASYNC, 1, "HTTP/1.1 304 Not Modified\r\n\r\n"), |
496 }; | 498 }; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
530 // HTTPS or SPDY Proxy CONNECT responses are trustworthy | 532 // HTTPS or SPDY Proxy CONNECT responses are trustworthy |
531 EXPECT_EQ(ERR_HTTPS_PROXY_TUNNEL_RESPONSE, rv); | 533 EXPECT_EQ(ERR_HTTPS_PROXY_TUNNEL_RESPONSE, rv); |
532 EXPECT_TRUE(handle_.is_initialized()); | 534 EXPECT_TRUE(handle_.is_initialized()); |
533 EXPECT_TRUE(handle_.socket()); | 535 EXPECT_TRUE(handle_.socket()); |
534 } | 536 } |
535 } | 537 } |
536 | 538 |
537 // It would be nice to also test the timeouts in HttpProxyClientSocketPool. | 539 // It would be nice to also test the timeouts in HttpProxyClientSocketPool. |
538 | 540 |
539 } // namespace net | 541 } // namespace net |
OLD | NEW |