| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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_network_transaction.h" | 5 #include "net/http/http_network_transaction.h" |
| 6 | 6 |
| 7 #include <math.h> // ceil | 7 #include <math.h> // ceil |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 52 const scoped_refptr<HttpNetworkSession>& session) | 52 const scoped_refptr<HttpNetworkSession>& session) |
| 53 : session_(session) {} | 53 : session_(session) {} |
| 54 | 54 |
| 55 void SetTCPSocketPool(const scoped_refptr<TCPClientSocketPool>& pool) { | 55 void SetTCPSocketPool(const scoped_refptr<TCPClientSocketPool>& pool) { |
| 56 session_->tcp_socket_pool_ = pool; | 56 session_->tcp_socket_pool_ = pool; |
| 57 } | 57 } |
| 58 | 58 |
| 59 void SetSocketPoolForSOCKSProxy( | 59 void SetSocketPoolForSOCKSProxy( |
| 60 const HostPortPair& socks_proxy, | 60 const HostPortPair& socks_proxy, |
| 61 const scoped_refptr<SOCKSClientSocketPool>& pool) { | 61 const scoped_refptr<SOCKSClientSocketPool>& pool) { |
| 62 session_->socks_socket_pool_[socks_proxy] = pool; | 62 session_->socks_socket_pools_[socks_proxy] = pool; |
| 63 } | 63 } |
| 64 | 64 |
| 65 void SetSocketPoolForHTTPProxy( | 65 void SetSocketPoolForHTTPProxy( |
| 66 const HostPortPair& http_proxy, | 66 const HostPortPair& http_proxy, |
| 67 const scoped_refptr<HttpProxyClientSocketPool>& pool) { | 67 const scoped_refptr<HttpProxyClientSocketPool>& pool) { |
| 68 session_->http_proxy_socket_pool_[http_proxy] = pool; | 68 session_->http_proxy_socket_pools_[http_proxy] = pool; |
| 69 } |
| 70 |
| 71 void SetSSLSocketPool(const scoped_refptr<SSLClientSocketPool>& pool) { |
| 72 session_->ssl_socket_pool_ = pool; |
| 73 } |
| 74 |
| 75 void SetSocketPoolForSSLWithProxy( |
| 76 const HostPortPair& proxy_host, |
| 77 const scoped_refptr<SSLClientSocketPool>& pool) { |
| 78 session_->ssl_socket_pools_for_proxies_[proxy_host] = pool; |
| 69 } | 79 } |
| 70 | 80 |
| 71 private: | 81 private: |
| 72 const scoped_refptr<HttpNetworkSession> session_; | 82 const scoped_refptr<HttpNetworkSession> session_; |
| 73 | 83 |
| 74 DISALLOW_COPY_AND_ASSIGN(HttpNetworkSessionPeer); | 84 DISALLOW_COPY_AND_ASSIGN(HttpNetworkSessionPeer); |
| 75 }; | 85 }; |
| 76 | 86 |
| 77 // Helper to manage the lifetimes of the dependencies for a | 87 // Helper to manage the lifetimes of the dependencies for a |
| 78 // HttpNetworkTransaction. | 88 // HttpNetworkTransaction. |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 231 for (size_t i = 0; i < n; ++i) { | 241 for (size_t i = 0; i < n; ++i) { |
| 232 output[i] = bytes[current_byte++]; | 242 output[i] = bytes[current_byte++]; |
| 233 current_byte %= arraysize(bytes); | 243 current_byte %= arraysize(bytes); |
| 234 } | 244 } |
| 235 } | 245 } |
| 236 | 246 |
| 237 std::string MockGetHostName() { | 247 std::string MockGetHostName() { |
| 238 return "WTC-WIN7"; | 248 return "WTC-WIN7"; |
| 239 } | 249 } |
| 240 | 250 |
| 241 template<typename EmulatedClientSocketPool> | 251 template<typename ParentPool> |
| 242 class CaptureGroupNameSocketPool : public EmulatedClientSocketPool { | 252 class CaptureGroupNameSocketPool : public ParentPool { |
| 243 public: | 253 public: |
| 244 explicit CaptureGroupNameSocketPool(HttpNetworkSession* session) | 254 explicit CaptureGroupNameSocketPool(HttpNetworkSession* session); |
| 245 : EmulatedClientSocketPool(0, 0, NULL, session->host_resolver(), NULL, | 255 |
| 246 NULL) { | |
| 247 } | |
| 248 const std::string last_group_name_received() const { | 256 const std::string last_group_name_received() const { |
| 249 return last_group_name_; | 257 return last_group_name_; |
| 250 } | 258 } |
| 251 | 259 |
| 252 virtual int RequestSocket(const std::string& group_name, | 260 virtual int RequestSocket(const std::string& group_name, |
| 253 const void* socket_params, | 261 const void* socket_params, |
| 254 RequestPriority priority, | 262 RequestPriority priority, |
| 255 ClientSocketHandle* handle, | 263 ClientSocketHandle* handle, |
| 256 CompletionCallback* callback, | 264 CompletionCallback* callback, |
| 257 const BoundNetLog& net_log) { | 265 const BoundNetLog& net_log) { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 283 private: | 291 private: |
| 284 std::string last_group_name_; | 292 std::string last_group_name_; |
| 285 }; | 293 }; |
| 286 | 294 |
| 287 typedef CaptureGroupNameSocketPool<TCPClientSocketPool> | 295 typedef CaptureGroupNameSocketPool<TCPClientSocketPool> |
| 288 CaptureGroupNameTCPSocketPool; | 296 CaptureGroupNameTCPSocketPool; |
| 289 typedef CaptureGroupNameSocketPool<HttpProxyClientSocketPool> | 297 typedef CaptureGroupNameSocketPool<HttpProxyClientSocketPool> |
| 290 CaptureGroupNameHttpProxySocketPool; | 298 CaptureGroupNameHttpProxySocketPool; |
| 291 typedef CaptureGroupNameSocketPool<SOCKSClientSocketPool> | 299 typedef CaptureGroupNameSocketPool<SOCKSClientSocketPool> |
| 292 CaptureGroupNameSOCKSSocketPool; | 300 CaptureGroupNameSOCKSSocketPool; |
| 301 typedef CaptureGroupNameSocketPool<SSLClientSocketPool> |
| 302 CaptureGroupNameSSLSocketPool; |
| 303 |
| 304 template<typename ParentPool> |
| 305 CaptureGroupNameSocketPool<ParentPool>::CaptureGroupNameSocketPool( |
| 306 HttpNetworkSession* session) |
| 307 : ParentPool(0, 0, NULL, session->host_resolver(), NULL, NULL) {} |
| 308 |
| 309 template<> |
| 310 CaptureGroupNameSSLSocketPool::CaptureGroupNameSocketPool( |
| 311 HttpNetworkSession* session) |
| 312 : SSLClientSocketPool(0, 0, NULL, session->host_resolver(), NULL, NULL, |
| 313 NULL, NULL, NULL) {} |
| 293 | 314 |
| 294 //----------------------------------------------------------------------------- | 315 //----------------------------------------------------------------------------- |
| 295 | 316 |
| 296 TEST_F(HttpNetworkTransactionTest, Basic) { | 317 TEST_F(HttpNetworkTransactionTest, Basic) { |
| 297 SessionDependencies session_deps; | 318 SessionDependencies session_deps; |
| 298 scoped_ptr<HttpTransaction> trans( | 319 scoped_ptr<HttpTransaction> trans( |
| 299 new HttpNetworkTransaction(CreateSession(&session_deps))); | 320 new HttpNetworkTransaction(CreateSession(&session_deps))); |
| 300 } | 321 } |
| 301 | 322 |
| 302 TEST_F(HttpNetworkTransactionTest, SimpleGET) { | 323 TEST_F(HttpNetworkTransactionTest, SimpleGET) { |
| (...skipping 1094 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1397 EXPECT_EQ(10, response->headers->GetContentLength()); | 1418 EXPECT_EQ(10, response->headers->GetContentLength()); |
| 1398 EXPECT_TRUE(HttpVersion(1, 1) == response->headers->GetHttpVersion()); | 1419 EXPECT_TRUE(HttpVersion(1, 1) == response->headers->GetHttpVersion()); |
| 1399 | 1420 |
| 1400 // The password prompt info should have been set in response->auth_challenge. | 1421 // The password prompt info should have been set in response->auth_challenge. |
| 1401 EXPECT_FALSE(response->auth_challenge.get() == NULL); | 1422 EXPECT_FALSE(response->auth_challenge.get() == NULL); |
| 1402 | 1423 |
| 1403 EXPECT_EQ(L"myproxy:70", response->auth_challenge->host_and_port); | 1424 EXPECT_EQ(L"myproxy:70", response->auth_challenge->host_and_port); |
| 1404 EXPECT_EQ(L"MyRealm1", response->auth_challenge->realm); | 1425 EXPECT_EQ(L"MyRealm1", response->auth_challenge->realm); |
| 1405 EXPECT_EQ(L"basic", response->auth_challenge->scheme); | 1426 EXPECT_EQ(L"basic", response->auth_challenge->scheme); |
| 1406 | 1427 |
| 1407 // Cleanup the transaction so that the sockets are destroyed before the | 1428 // Flush the idle socket before the NetLog and HttpNetworkTransaction go |
| 1408 // net log goes out of scope. | 1429 // out of scope. |
| 1409 trans.reset(); | 1430 session->FlushSocketPools(); |
| 1410 | |
| 1411 // We also need to run the message queue for the socket releases to complete. | |
| 1412 MessageLoop::current()->RunAllPending(); | |
| 1413 } | 1431 } |
| 1414 | 1432 |
| 1415 // Test that we don't read the response body when we fail to establish a tunnel, | 1433 // Test that we don't read the response body when we fail to establish a tunnel, |
| 1416 // even if the user cancels the proxy's auth attempt. | 1434 // even if the user cancels the proxy's auth attempt. |
| 1417 TEST_F(HttpNetworkTransactionTest, BasicAuthProxyCancelTunnel) { | 1435 TEST_F(HttpNetworkTransactionTest, BasicAuthProxyCancelTunnel) { |
| 1418 // Configure against proxy server "myproxy:70". | 1436 // Configure against proxy server "myproxy:70". |
| 1419 SessionDependencies session_deps(CreateFixedProxyService("myproxy:70")); | 1437 SessionDependencies session_deps(CreateFixedProxyService("myproxy:70")); |
| 1420 | 1438 |
| 1421 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); | 1439 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); |
| 1422 | 1440 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1458 EXPECT_FALSE(response == NULL); | 1476 EXPECT_FALSE(response == NULL); |
| 1459 | 1477 |
| 1460 EXPECT_TRUE(response->headers->IsKeepAlive()); | 1478 EXPECT_TRUE(response->headers->IsKeepAlive()); |
| 1461 EXPECT_EQ(407, response->headers->response_code()); | 1479 EXPECT_EQ(407, response->headers->response_code()); |
| 1462 EXPECT_EQ(10, response->headers->GetContentLength()); | 1480 EXPECT_EQ(10, response->headers->GetContentLength()); |
| 1463 EXPECT_TRUE(HttpVersion(1, 1) == response->headers->GetHttpVersion()); | 1481 EXPECT_TRUE(HttpVersion(1, 1) == response->headers->GetHttpVersion()); |
| 1464 | 1482 |
| 1465 std::string response_data; | 1483 std::string response_data; |
| 1466 rv = ReadTransaction(trans.get(), &response_data); | 1484 rv = ReadTransaction(trans.get(), &response_data); |
| 1467 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, rv); | 1485 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, rv); |
| 1486 |
| 1487 // Flush the idle socket before the HttpNetworkTransaction goes out of scope. |
| 1488 session->FlushSocketPools(); |
| 1468 } | 1489 } |
| 1469 | 1490 |
| 1470 // Test when a server (non-proxy) returns a 407 (proxy-authenticate). | 1491 // Test when a server (non-proxy) returns a 407 (proxy-authenticate). |
| 1471 // The request should fail with ERR_UNEXPECTED_PROXY_AUTH. | 1492 // The request should fail with ERR_UNEXPECTED_PROXY_AUTH. |
| 1472 TEST_F(HttpNetworkTransactionTest, UnexpectedProxyAuth) { | 1493 TEST_F(HttpNetworkTransactionTest, UnexpectedProxyAuth) { |
| 1473 // We are using a DIRECT connection (i.e. no proxy) for this session. | 1494 // We are using a DIRECT connection (i.e. no proxy) for this session. |
| 1474 SessionDependencies session_deps; | 1495 SessionDependencies session_deps; |
| 1475 scoped_ptr<HttpTransaction> trans( | 1496 scoped_ptr<HttpTransaction> trans( |
| 1476 new HttpNetworkTransaction(CreateSession(&session_deps))); | 1497 new HttpNetworkTransaction(CreateSession(&session_deps))); |
| 1477 | 1498 |
| (...skipping 2492 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3970 EXPECT_EQ(OK, rv); | 3991 EXPECT_EQ(OK, rv); |
| 3971 EXPECT_EQ("Payload", response_text); | 3992 EXPECT_EQ("Payload", response_text); |
| 3972 } | 3993 } |
| 3973 | 3994 |
| 3974 // Tests that for connection endpoints the group names are correctly set. | 3995 // Tests that for connection endpoints the group names are correctly set. |
| 3975 | 3996 |
| 3976 struct GroupNameTest { | 3997 struct GroupNameTest { |
| 3977 std::string proxy_server; | 3998 std::string proxy_server; |
| 3978 std::string url; | 3999 std::string url; |
| 3979 std::string expected_group_name; | 4000 std::string expected_group_name; |
| 4001 bool ssl; |
| 3980 }; | 4002 }; |
| 3981 | 4003 |
| 3982 scoped_refptr<HttpNetworkSession> SetupSessionForGroupNameTests( | 4004 scoped_refptr<HttpNetworkSession> SetupSessionForGroupNameTests( |
| 3983 const std::string& proxy_server) { | 4005 const std::string& proxy_server) { |
| 3984 SessionDependencies session_deps(CreateFixedProxyService(proxy_server)); | 4006 SessionDependencies session_deps(CreateFixedProxyService(proxy_server)); |
| 3985 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); | 4007 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); |
| 3986 | 4008 |
| 3987 HttpAlternateProtocols* alternate_protocols = | 4009 HttpAlternateProtocols* alternate_protocols = |
| 3988 session->mutable_alternate_protocols(); | 4010 session->mutable_alternate_protocols(); |
| 3989 alternate_protocols->SetAlternateProtocolFor( | 4011 alternate_protocols->SetAlternateProtocolFor( |
| (...skipping 18 matching lines...) Expand all Loading... |
| 4008 // We do not complete this request, the dtor will clean the transaction up. | 4030 // We do not complete this request, the dtor will clean the transaction up. |
| 4009 return trans->Start(&request, &callback, BoundNetLog()); | 4031 return trans->Start(&request, &callback, BoundNetLog()); |
| 4010 } | 4032 } |
| 4011 | 4033 |
| 4012 TEST_F(HttpNetworkTransactionTest, GroupNameForDirectConnections) { | 4034 TEST_F(HttpNetworkTransactionTest, GroupNameForDirectConnections) { |
| 4013 const GroupNameTest tests[] = { | 4035 const GroupNameTest tests[] = { |
| 4014 { | 4036 { |
| 4015 "", // unused | 4037 "", // unused |
| 4016 "http://www.google.com/direct", | 4038 "http://www.google.com/direct", |
| 4017 "www.google.com:80", | 4039 "www.google.com:80", |
| 4040 false, |
| 4018 }, | 4041 }, |
| 4019 { | 4042 { |
| 4020 "", // unused | 4043 "", // unused |
| 4021 "http://[2001:1418:13:1::25]/direct", | 4044 "http://[2001:1418:13:1::25]/direct", |
| 4022 "[2001:1418:13:1::25]:80", | 4045 "[2001:1418:13:1::25]:80", |
| 4046 false, |
| 4023 }, | 4047 }, |
| 4024 | 4048 |
| 4025 // SSL Tests | 4049 // SSL Tests |
| 4026 { | 4050 { |
| 4027 "", // unused | 4051 "", // unused |
| 4028 "https://www.google.com/direct_ssl", | 4052 "https://www.google.com/direct_ssl", |
| 4029 "ssl/www.google.com:443", | 4053 "ssl/www.google.com:443", |
| 4054 true, |
| 4030 }, | 4055 }, |
| 4031 { | 4056 { |
| 4032 "", // unused | 4057 "", // unused |
| 4033 "https://[2001:1418:13:1::25]/direct", | 4058 "https://[2001:1418:13:1::25]/direct", |
| 4034 "ssl/[2001:1418:13:1::25]:443", | 4059 "ssl/[2001:1418:13:1::25]:443", |
| 4060 true, |
| 4035 }, | 4061 }, |
| 4036 { | 4062 { |
| 4037 "", // unused | 4063 "", // unused |
| 4038 "http://host.with.alternate/direct", | 4064 "http://host.with.alternate/direct", |
| 4039 "ssl/host.with.alternate:443", | 4065 "ssl/host.with.alternate:443", |
| 4066 true, |
| 4040 }, | 4067 }, |
| 4041 }; | 4068 }; |
| 4042 | 4069 |
| 4043 HttpNetworkTransaction::SetUseAlternateProtocols(true); | 4070 HttpNetworkTransaction::SetUseAlternateProtocols(true); |
| 4044 | 4071 |
| 4045 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { | 4072 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { |
| 4046 scoped_refptr<HttpNetworkSession> session( | 4073 scoped_refptr<HttpNetworkSession> session( |
| 4047 SetupSessionForGroupNameTests(tests[i].proxy_server)); | 4074 SetupSessionForGroupNameTests(tests[i].proxy_server)); |
| 4048 | 4075 |
| 4049 HttpNetworkSessionPeer peer(session); | 4076 HttpNetworkSessionPeer peer(session); |
| 4050 scoped_refptr<CaptureGroupNameTCPSocketPool> tcp_conn_pool( | 4077 scoped_refptr<CaptureGroupNameTCPSocketPool> tcp_conn_pool( |
| 4051 new CaptureGroupNameTCPSocketPool(session.get())); | 4078 new CaptureGroupNameTCPSocketPool(session.get())); |
| 4052 peer.SetTCPSocketPool(tcp_conn_pool); | 4079 peer.SetTCPSocketPool(tcp_conn_pool); |
| 4080 scoped_refptr<CaptureGroupNameSSLSocketPool> ssl_conn_pool( |
| 4081 new CaptureGroupNameSSLSocketPool(session.get())); |
| 4082 peer.SetSSLSocketPool(ssl_conn_pool); |
| 4053 | 4083 |
| 4054 EXPECT_EQ(ERR_IO_PENDING, | 4084 EXPECT_EQ(ERR_IO_PENDING, |
| 4055 GroupNameTransactionHelper(tests[i].url, session)); | 4085 GroupNameTransactionHelper(tests[i].url, session)); |
| 4056 EXPECT_EQ(tests[i].expected_group_name, | 4086 if (tests[i].ssl) |
| 4057 tcp_conn_pool->last_group_name_received()); | 4087 EXPECT_EQ(tests[i].expected_group_name, |
| 4088 ssl_conn_pool->last_group_name_received()); |
| 4089 else |
| 4090 EXPECT_EQ(tests[i].expected_group_name, |
| 4091 tcp_conn_pool->last_group_name_received()); |
| 4058 } | 4092 } |
| 4059 | 4093 |
| 4060 HttpNetworkTransaction::SetUseAlternateProtocols(false); | 4094 HttpNetworkTransaction::SetUseAlternateProtocols(false); |
| 4061 } | 4095 } |
| 4062 | 4096 |
| 4063 TEST_F(HttpNetworkTransactionTest, GroupNameForHTTPProxyConnections) { | 4097 TEST_F(HttpNetworkTransactionTest, GroupNameForHTTPProxyConnections) { |
| 4064 const GroupNameTest tests[] = { | 4098 const GroupNameTest tests[] = { |
| 4065 { | 4099 { |
| 4066 "http_proxy", | 4100 "http_proxy", |
| 4067 "http://www.google.com/http_proxy_normal", | 4101 "http://www.google.com/http_proxy_normal", |
| 4068 "www.google.com:80", | 4102 "www.google.com:80", |
| 4103 false, |
| 4069 }, | 4104 }, |
| 4070 | 4105 |
| 4071 // SSL Tests | 4106 // SSL Tests |
| 4072 { | 4107 { |
| 4073 "http_proxy", | 4108 "http_proxy", |
| 4074 "https://www.google.com/http_connect_ssl", | 4109 "https://www.google.com/http_connect_ssl", |
| 4075 "ssl/www.google.com:443", | 4110 "ssl/www.google.com:443", |
| 4111 true, |
| 4076 }, | 4112 }, |
| 4077 | 4113 |
| 4078 { | 4114 { |
| 4079 "http_proxy", | 4115 "http_proxy", |
| 4080 "http://host.with.alternate/direct", | 4116 "http://host.with.alternate/direct", |
| 4081 "ssl/host.with.alternate:443", | 4117 "ssl/host.with.alternate:443", |
| 4118 true, |
| 4082 }, | 4119 }, |
| 4083 }; | 4120 }; |
| 4084 | 4121 |
| 4085 HttpNetworkTransaction::SetUseAlternateProtocols(true); | 4122 HttpNetworkTransaction::SetUseAlternateProtocols(true); |
| 4086 | 4123 |
| 4087 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { | 4124 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { |
| 4088 scoped_refptr<HttpNetworkSession> session( | 4125 scoped_refptr<HttpNetworkSession> session( |
| 4089 SetupSessionForGroupNameTests(tests[i].proxy_server)); | 4126 SetupSessionForGroupNameTests(tests[i].proxy_server)); |
| 4090 | 4127 |
| 4091 HttpNetworkSessionPeer peer(session); | 4128 HttpNetworkSessionPeer peer(session); |
| 4092 | 4129 |
| 4130 HostPortPair proxy_host("http_proxy", 80); |
| 4093 scoped_refptr<CaptureGroupNameHttpProxySocketPool> http_proxy_pool( | 4131 scoped_refptr<CaptureGroupNameHttpProxySocketPool> http_proxy_pool( |
| 4094 new CaptureGroupNameHttpProxySocketPool(session.get())); | 4132 new CaptureGroupNameHttpProxySocketPool(session.get())); |
| 4095 peer.SetSocketPoolForHTTPProxy( | 4133 peer.SetSocketPoolForHTTPProxy(proxy_host, http_proxy_pool); |
| 4096 HostPortPair("http_proxy", 80), http_proxy_pool); | 4134 scoped_refptr<CaptureGroupNameSSLSocketPool> ssl_conn_pool( |
| 4135 new CaptureGroupNameSSLSocketPool(session.get())); |
| 4136 peer.SetSocketPoolForSSLWithProxy(proxy_host, ssl_conn_pool); |
| 4097 | 4137 |
| 4098 EXPECT_EQ(ERR_IO_PENDING, | 4138 EXPECT_EQ(ERR_IO_PENDING, |
| 4099 GroupNameTransactionHelper(tests[i].url, session)); | 4139 GroupNameTransactionHelper(tests[i].url, session)); |
| 4100 EXPECT_EQ(tests[i].expected_group_name, | 4140 if (tests[i].ssl) |
| 4101 http_proxy_pool->last_group_name_received()); | 4141 EXPECT_EQ(tests[i].expected_group_name, |
| 4142 ssl_conn_pool->last_group_name_received()); |
| 4143 else |
| 4144 EXPECT_EQ(tests[i].expected_group_name, |
| 4145 http_proxy_pool->last_group_name_received()); |
| 4102 } | 4146 } |
| 4103 | 4147 |
| 4104 HttpNetworkTransaction::SetUseAlternateProtocols(false); | 4148 HttpNetworkTransaction::SetUseAlternateProtocols(false); |
| 4105 } | 4149 } |
| 4106 | 4150 |
| 4107 TEST_F(HttpNetworkTransactionTest, GroupNameForSOCKSConnections) { | 4151 TEST_F(HttpNetworkTransactionTest, GroupNameForSOCKSConnections) { |
| 4108 const GroupNameTest tests[] = { | 4152 const GroupNameTest tests[] = { |
| 4109 { | 4153 { |
| 4110 "socks4://socks_proxy:1080", | 4154 "socks4://socks_proxy:1080", |
| 4111 "http://www.google.com/socks4_direct", | 4155 "http://www.google.com/socks4_direct", |
| 4112 "socks4/www.google.com:80", | 4156 "socks4/www.google.com:80", |
| 4157 false, |
| 4113 }, | 4158 }, |
| 4114 { | 4159 { |
| 4115 "socks5://socks_proxy:1080", | 4160 "socks5://socks_proxy:1080", |
| 4116 "http://www.google.com/socks5_direct", | 4161 "http://www.google.com/socks5_direct", |
| 4117 "socks5/www.google.com:80", | 4162 "socks5/www.google.com:80", |
| 4163 false, |
| 4118 }, | 4164 }, |
| 4119 | 4165 |
| 4120 // SSL Tests | 4166 // SSL Tests |
| 4121 { | 4167 { |
| 4122 "socks4://socks_proxy:1080", | 4168 "socks4://socks_proxy:1080", |
| 4123 "https://www.google.com/socks4_ssl", | 4169 "https://www.google.com/socks4_ssl", |
| 4124 "socks4/ssl/www.google.com:443", | 4170 "socks4/ssl/www.google.com:443", |
| 4171 true, |
| 4125 }, | 4172 }, |
| 4126 { | 4173 { |
| 4127 "socks5://socks_proxy:1080", | 4174 "socks5://socks_proxy:1080", |
| 4128 "https://www.google.com/socks5_ssl", | 4175 "https://www.google.com/socks5_ssl", |
| 4129 "socks5/ssl/www.google.com:443", | 4176 "socks5/ssl/www.google.com:443", |
| 4177 true, |
| 4130 }, | 4178 }, |
| 4131 | 4179 |
| 4132 { | 4180 { |
| 4133 "socks4://socks_proxy:1080", | 4181 "socks4://socks_proxy:1080", |
| 4134 "http://host.with.alternate/direct", | 4182 "http://host.with.alternate/direct", |
| 4135 "socks4/ssl/host.with.alternate:443", | 4183 "socks4/ssl/host.with.alternate:443", |
| 4184 true, |
| 4136 }, | 4185 }, |
| 4137 }; | 4186 }; |
| 4138 | 4187 |
| 4139 HttpNetworkTransaction::SetUseAlternateProtocols(true); | 4188 HttpNetworkTransaction::SetUseAlternateProtocols(true); |
| 4140 | 4189 |
| 4141 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { | 4190 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { |
| 4142 scoped_refptr<HttpNetworkSession> session( | 4191 scoped_refptr<HttpNetworkSession> session( |
| 4143 SetupSessionForGroupNameTests(tests[i].proxy_server)); | 4192 SetupSessionForGroupNameTests(tests[i].proxy_server)); |
| 4144 HttpNetworkSessionPeer peer(session); | 4193 HttpNetworkSessionPeer peer(session); |
| 4145 | 4194 |
| 4195 HostPortPair proxy_host("socks_proxy", 1080); |
| 4146 scoped_refptr<CaptureGroupNameSOCKSSocketPool> socks_conn_pool( | 4196 scoped_refptr<CaptureGroupNameSOCKSSocketPool> socks_conn_pool( |
| 4147 new CaptureGroupNameSOCKSSocketPool(session.get())); | 4197 new CaptureGroupNameSOCKSSocketPool(session.get())); |
| 4148 peer.SetSocketPoolForSOCKSProxy( | 4198 peer.SetSocketPoolForSOCKSProxy(proxy_host, socks_conn_pool); |
| 4149 HostPortPair("socks_proxy", 1080), socks_conn_pool); | 4199 scoped_refptr<CaptureGroupNameSSLSocketPool> ssl_conn_pool( |
| 4200 new CaptureGroupNameSSLSocketPool(session.get())); |
| 4201 peer.SetSocketPoolForSSLWithProxy(proxy_host, ssl_conn_pool); |
| 4150 | 4202 |
| 4151 scoped_ptr<HttpTransaction> trans(new HttpNetworkTransaction(session)); | 4203 scoped_ptr<HttpTransaction> trans(new HttpNetworkTransaction(session)); |
| 4152 | 4204 |
| 4153 EXPECT_EQ(ERR_IO_PENDING, | 4205 EXPECT_EQ(ERR_IO_PENDING, |
| 4154 GroupNameTransactionHelper(tests[i].url, session)); | 4206 GroupNameTransactionHelper(tests[i].url, session)); |
| 4155 EXPECT_EQ(tests[i].expected_group_name, | 4207 if (tests[i].ssl) |
| 4156 socks_conn_pool->last_group_name_received()); | 4208 EXPECT_EQ(tests[i].expected_group_name, |
| 4209 ssl_conn_pool->last_group_name_received()); |
| 4210 else |
| 4211 EXPECT_EQ(tests[i].expected_group_name, |
| 4212 socks_conn_pool->last_group_name_received()); |
| 4157 } | 4213 } |
| 4158 | 4214 |
| 4159 HttpNetworkTransaction::SetUseAlternateProtocols(false); | 4215 HttpNetworkTransaction::SetUseAlternateProtocols(false); |
| 4160 } | 4216 } |
| 4161 | 4217 |
| 4162 TEST_F(HttpNetworkTransactionTest, ReconsiderProxyAfterFailedConnection) { | 4218 TEST_F(HttpNetworkTransactionTest, ReconsiderProxyAfterFailedConnection) { |
| 4163 SessionDependencies session_deps( | 4219 SessionDependencies session_deps( |
| 4164 CreateFixedProxyService("myproxy:70;foobar:80")); | 4220 CreateFixedProxyService("myproxy:70;foobar:80")); |
| 4165 | 4221 |
| 4166 // This simulates failure resolving all hostnames; that means we will fail | 4222 // This simulates failure resolving all hostnames; that means we will fail |
| (...skipping 1695 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5862 EXPECT_EQ(round + 1, test_config.num_auth_rounds); | 5918 EXPECT_EQ(round + 1, test_config.num_auth_rounds); |
| 5863 continue; | 5919 continue; |
| 5864 } | 5920 } |
| 5865 if (round + 1 < test_config.num_auth_rounds) { | 5921 if (round + 1 < test_config.num_auth_rounds) { |
| 5866 EXPECT_FALSE(response->auth_challenge.get() == NULL); | 5922 EXPECT_FALSE(response->auth_challenge.get() == NULL); |
| 5867 } else { | 5923 } else { |
| 5868 EXPECT_TRUE(response->auth_challenge.get() == NULL); | 5924 EXPECT_TRUE(response->auth_challenge.get() == NULL); |
| 5869 } | 5925 } |
| 5870 } | 5926 } |
| 5871 } | 5927 } |
| 5928 |
| 5929 // Flush the idle socket before the HttpNetworkTransaction goes out of scope. |
| 5930 session->FlushSocketPools(); |
| 5872 } | 5931 } |
| 5873 | 5932 |
| 5874 class TLSDecompressionFailureSocketDataProvider : public SocketDataProvider { | 5933 class TLSDecompressionFailureSocketDataProvider : public SocketDataProvider { |
| 5875 public: | 5934 public: |
| 5876 explicit TLSDecompressionFailureSocketDataProvider(bool fail_all) | 5935 explicit TLSDecompressionFailureSocketDataProvider(bool fail_all) |
| 5877 : fail_all_(fail_all) { | 5936 : fail_all_(fail_all) { |
| 5878 } | 5937 } |
| 5879 | 5938 |
| 5880 virtual MockRead GetNextRead() { | 5939 virtual MockRead GetNextRead() { |
| 5881 if (fail_all_) | 5940 if (fail_all_) |
| (...skipping 30 matching lines...) Expand all Loading... |
| 5912 SSLSocketDataProvider ssl_socket_data_provider1( | 5971 SSLSocketDataProvider ssl_socket_data_provider1( |
| 5913 false, ERR_SSL_DECOMPRESSION_FAILURE_ALERT); | 5972 false, ERR_SSL_DECOMPRESSION_FAILURE_ALERT); |
| 5914 SSLSocketDataProvider ssl_socket_data_provider2(false, OK); | 5973 SSLSocketDataProvider ssl_socket_data_provider2(false, OK); |
| 5915 session_deps.socket_factory.AddSocketDataProvider(&socket_data_provider1); | 5974 session_deps.socket_factory.AddSocketDataProvider(&socket_data_provider1); |
| 5916 session_deps.socket_factory.AddSocketDataProvider(&socket_data_provider2); | 5975 session_deps.socket_factory.AddSocketDataProvider(&socket_data_provider2); |
| 5917 session_deps.socket_factory.AddSSLSocketDataProvider( | 5976 session_deps.socket_factory.AddSSLSocketDataProvider( |
| 5918 &ssl_socket_data_provider1); | 5977 &ssl_socket_data_provider1); |
| 5919 session_deps.socket_factory.AddSSLSocketDataProvider( | 5978 session_deps.socket_factory.AddSSLSocketDataProvider( |
| 5920 &ssl_socket_data_provider2); | 5979 &ssl_socket_data_provider2); |
| 5921 | 5980 |
| 5981 // Work around http://crbug.com/37454 |
| 5982 StaticSocketDataProvider bug37454_connection; |
| 5983 bug37454_connection.set_connect_data(MockConnect(true, ERR_UNEXPECTED)); |
| 5984 session_deps.socket_factory.AddSocketDataProvider(&bug37454_connection); |
| 5985 |
| 5922 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); | 5986 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); |
| 5923 scoped_ptr<HttpTransaction> trans(new HttpNetworkTransaction(session)); | 5987 scoped_ptr<HttpTransaction> trans(new HttpNetworkTransaction(session)); |
| 5924 TestCompletionCallback callback; | 5988 TestCompletionCallback callback; |
| 5925 | 5989 |
| 5926 int rv = trans->Start(&request, &callback, BoundNetLog()); | 5990 int rv = trans->Start(&request, &callback, BoundNetLog()); |
| 5927 EXPECT_EQ(ERR_IO_PENDING, rv); | 5991 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 5928 EXPECT_EQ(OK, callback.WaitForResult()); | 5992 EXPECT_EQ(OK, callback.WaitForResult()); |
| 5929 | 5993 |
| 5930 const HttpResponseInfo* response = trans->GetResponseInfo(); | 5994 const HttpResponseInfo* response = trans->GetResponseInfo(); |
| 5931 ASSERT_TRUE(response != NULL); | 5995 ASSERT_TRUE(response != NULL); |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6081 | 6145 |
| 6082 int rv = trans->Start(&request, &callback, BoundNetLog()); | 6146 int rv = trans->Start(&request, &callback, BoundNetLog()); |
| 6083 EXPECT_EQ(ERR_IO_PENDING, rv); | 6147 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 6084 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult()); | 6148 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult()); |
| 6085 | 6149 |
| 6086 HttpNetworkTransaction::SetNextProtos(""); | 6150 HttpNetworkTransaction::SetNextProtos(""); |
| 6087 HttpNetworkTransaction::SetUseAlternateProtocols(false); | 6151 HttpNetworkTransaction::SetUseAlternateProtocols(false); |
| 6088 } | 6152 } |
| 6089 | 6153 |
| 6090 } // namespace net | 6154 } // namespace net |
| OLD | NEW |