| 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/test_completion_callback.h" | 12 #include "net/base/test_completion_callback.h" |
| 13 #include "net/http/http_network_session.h" | 13 #include "net/http/http_network_session.h" |
| 14 #include "net/http/http_proxy_client_socket.h" | 14 #include "net/http/http_proxy_client_socket.h" |
| 15 #include "net/http/http_response_headers.h" | 15 #include "net/http/http_response_headers.h" |
| 16 #include "net/socket/client_socket_handle.h" | 16 #include "net/socket/client_socket_handle.h" |
| 17 #include "net/socket/client_socket_pool_histograms.h" | 17 #include "net/socket/client_socket_pool_histograms.h" |
| 18 #include "net/socket/next_proto.h" | 18 #include "net/socket/next_proto.h" |
| 19 #include "net/socket/socket_test_util.h" | 19 #include "net/socket/socket_test_util.h" |
| 20 #include "net/spdy/spdy_protocol.h" | 20 #include "net/spdy/spdy_protocol.h" |
| 21 #include "net/spdy/spdy_test_util_common.h" | 21 #include "net/spdy/spdy_test_util_common.h" |
| 22 #include "testing/gtest/include/gtest/gtest.h" | 22 #include "testing/gtest/include/gtest/gtest.h" |
| 23 | 23 |
| 24 namespace net { | 24 namespace net { |
| 25 | 25 |
| 26 namespace { | 26 namespace { |
| 27 | 27 |
| 28 const int kMaxSockets = 32; | 28 const int kMaxSockets = 32; |
| 29 const int kMaxSocketsPerGroup = 6; | 29 const int kMaxSocketsPerGroup = 6; |
| 30 const char * const kAuthHeaders[] = { | 30 const char* const kAuthHeaders[] = {"proxy-authorization", |
| 31 "proxy-authorization", "Basic Zm9vOmJhcg==" | 31 "Basic Zm9vOmJhcg=="}; |
| 32 }; | |
| 33 const int kAuthHeadersSize = arraysize(kAuthHeaders) / 2; | 32 const int kAuthHeadersSize = arraysize(kAuthHeaders) / 2; |
| 34 | 33 |
| 35 enum HttpProxyType { | 34 enum HttpProxyType { HTTP, HTTPS, SPDY }; |
| 36 HTTP, | |
| 37 HTTPS, | |
| 38 SPDY | |
| 39 }; | |
| 40 | 35 |
| 41 struct HttpProxyClientSocketPoolTestParams { | 36 struct HttpProxyClientSocketPoolTestParams { |
| 42 HttpProxyClientSocketPoolTestParams() | 37 HttpProxyClientSocketPoolTestParams() |
| 43 : proxy_type(HTTP), | 38 : proxy_type(HTTP), protocol(kProtoSPDY3) {} |
| 44 protocol(kProtoSPDY3) {} | |
| 45 | 39 |
| 46 HttpProxyClientSocketPoolTestParams( | 40 HttpProxyClientSocketPoolTestParams(HttpProxyType proxy_type, |
| 47 HttpProxyType proxy_type, | 41 NextProto protocol) |
| 48 NextProto protocol) | 42 : proxy_type(proxy_type), protocol(protocol) {} |
| 49 : proxy_type(proxy_type), | |
| 50 protocol(protocol) {} | |
| 51 | 43 |
| 52 HttpProxyType proxy_type; | 44 HttpProxyType proxy_type; |
| 53 NextProto protocol; | 45 NextProto protocol; |
| 54 }; | 46 }; |
| 55 | 47 |
| 56 typedef ::testing::TestWithParam<HttpProxyType> TestWithHttpParam; | 48 typedef ::testing::TestWithParam<HttpProxyType> TestWithHttpParam; |
| 57 | 49 |
| 58 const char kHttpProxyHost[] = "httpproxy.example.com"; | 50 const char kHttpProxyHost[] = "httpproxy.example.com"; |
| 59 const char kHttpsProxyHost[] = "httpsproxy.example.com"; | 51 const char kHttpsProxyHost[] = "httpsproxy.example.com"; |
| 60 | 52 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 89 http_proxy_histograms_("HttpProxyUnitTest"), | 81 http_proxy_histograms_("HttpProxyUnitTest"), |
| 90 spdy_util_(GetParam().protocol), | 82 spdy_util_(GetParam().protocol), |
| 91 pool_(kMaxSockets, | 83 pool_(kMaxSockets, |
| 92 kMaxSocketsPerGroup, | 84 kMaxSocketsPerGroup, |
| 93 &http_proxy_histograms_, | 85 &http_proxy_histograms_, |
| 94 NULL, | 86 NULL, |
| 95 &transport_socket_pool_, | 87 &transport_socket_pool_, |
| 96 &ssl_socket_pool_, | 88 &ssl_socket_pool_, |
| 97 NULL) {} | 89 NULL) {} |
| 98 | 90 |
| 99 virtual ~HttpProxyClientSocketPoolTest() { | 91 virtual ~HttpProxyClientSocketPoolTest() {} |
| 100 } | |
| 101 | 92 |
| 102 void AddAuthToCache() { | 93 void AddAuthToCache() { |
| 103 const base::string16 kFoo(base::ASCIIToUTF16("foo")); | 94 const base::string16 kFoo(base::ASCIIToUTF16("foo")); |
| 104 const base::string16 kBar(base::ASCIIToUTF16("bar")); | 95 const base::string16 kBar(base::ASCIIToUTF16("bar")); |
| 105 GURL proxy_url(GetParam().proxy_type == HTTP ? | 96 GURL proxy_url(GetParam().proxy_type == HTTP |
| 106 (std::string("http://") + kHttpProxyHost) : | 97 ? (std::string("http://") + kHttpProxyHost) |
| 107 (std::string("https://") + kHttpsProxyHost)); | 98 : (std::string("https://") + kHttpsProxyHost)); |
| 108 session_->http_auth_cache()->Add(proxy_url, | 99 session_->http_auth_cache()->Add(proxy_url, |
| 109 "MyRealm1", | 100 "MyRealm1", |
| 110 HttpAuth::AUTH_SCHEME_BASIC, | 101 HttpAuth::AUTH_SCHEME_BASIC, |
| 111 "Basic realm=MyRealm1", | 102 "Basic realm=MyRealm1", |
| 112 AuthCredentials(kFoo, kBar), | 103 AuthCredentials(kFoo, kBar), |
| 113 "/"); | 104 "/"); |
| 114 } | 105 } |
| 115 | 106 |
| 116 scoped_refptr<TransportSocketParams> CreateHttpProxyParams() const { | 107 scoped_refptr<TransportSocketParams> CreateHttpProxyParams() const { |
| 117 if (GetParam().proxy_type != HTTP) | 108 if (GetParam().proxy_type != HTTP) |
| 118 return NULL; | 109 return NULL; |
| 119 return new TransportSocketParams(HostPortPair(kHttpProxyHost, 80), | 110 return new TransportSocketParams(HostPortPair(kHttpProxyHost, 80), |
| 120 false, | 111 false, |
| 121 false, | 112 false, |
| 122 OnHostResolutionCallback()); | 113 OnHostResolutionCallback()); |
| 123 } | 114 } |
| 124 | 115 |
| 125 scoped_refptr<SSLSocketParams> CreateHttpsProxyParams() const { | 116 scoped_refptr<SSLSocketParams> CreateHttpsProxyParams() const { |
| 126 if (GetParam().proxy_type == HTTP) | 117 if (GetParam().proxy_type == HTTP) |
| 127 return NULL; | 118 return NULL; |
| 128 return new SSLSocketParams( | 119 return new SSLSocketParams( |
| 129 new TransportSocketParams( | 120 new TransportSocketParams(HostPortPair(kHttpsProxyHost, 443), |
| 130 HostPortPair(kHttpsProxyHost, 443), | 121 false, |
| 131 false, | 122 false, |
| 132 false, | 123 OnHostResolutionCallback()), |
| 133 OnHostResolutionCallback()), | |
| 134 NULL, | 124 NULL, |
| 135 NULL, | 125 NULL, |
| 136 HostPortPair(kHttpsProxyHost, 443), | 126 HostPortPair(kHttpsProxyHost, 443), |
| 137 SSLConfig(), | 127 SSLConfig(), |
| 138 PRIVACY_MODE_DISABLED, | 128 PRIVACY_MODE_DISABLED, |
| 139 0, | 129 0, |
| 140 false, | 130 false, |
| 141 false); | 131 false); |
| 142 } | 132 } |
| 143 | 133 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 161 } | 151 } |
| 162 | 152 |
| 163 scoped_refptr<HttpProxySocketParams> CreateNoTunnelParams() { | 153 scoped_refptr<HttpProxySocketParams> CreateNoTunnelParams() { |
| 164 return CreateParams(false); | 154 return CreateParams(false); |
| 165 } | 155 } |
| 166 | 156 |
| 167 DeterministicMockClientSocketFactory* socket_factory() { | 157 DeterministicMockClientSocketFactory* socket_factory() { |
| 168 return session_deps_.deterministic_socket_factory.get(); | 158 return session_deps_.deterministic_socket_factory.get(); |
| 169 } | 159 } |
| 170 | 160 |
| 171 void Initialize(MockRead* reads, size_t reads_count, | 161 void Initialize(MockRead* reads, |
| 172 MockWrite* writes, size_t writes_count, | 162 size_t reads_count, |
| 173 MockRead* spdy_reads, size_t spdy_reads_count, | 163 MockWrite* writes, |
| 174 MockWrite* spdy_writes, size_t spdy_writes_count) { | 164 size_t writes_count, |
| 165 MockRead* spdy_reads, |
| 166 size_t spdy_reads_count, |
| 167 MockWrite* spdy_writes, |
| 168 size_t spdy_writes_count) { |
| 175 if (GetParam().proxy_type == SPDY) { | 169 if (GetParam().proxy_type == SPDY) { |
| 176 data_.reset(new DeterministicSocketData(spdy_reads, spdy_reads_count, | 170 data_.reset(new DeterministicSocketData( |
| 177 spdy_writes, spdy_writes_count)); | 171 spdy_reads, spdy_reads_count, spdy_writes, spdy_writes_count)); |
| 178 } else { | 172 } else { |
| 179 data_.reset(new DeterministicSocketData(reads, reads_count, writes, | 173 data_.reset(new DeterministicSocketData( |
| 180 writes_count)); | 174 reads, reads_count, writes, writes_count)); |
| 181 } | 175 } |
| 182 | 176 |
| 183 data_->set_connect_data(MockConnect(SYNCHRONOUS, OK)); | 177 data_->set_connect_data(MockConnect(SYNCHRONOUS, OK)); |
| 184 data_->StopAfter(2); // Request / Response | 178 data_->StopAfter(2); // Request / Response |
| 185 | 179 |
| 186 socket_factory()->AddSocketDataProvider(data_.get()); | 180 socket_factory()->AddSocketDataProvider(data_.get()); |
| 187 | 181 |
| 188 if (GetParam().proxy_type != HTTP) { | 182 if (GetParam().proxy_type != HTTP) { |
| 189 ssl_data_.reset(new SSLSocketDataProvider(SYNCHRONOUS, OK)); | 183 ssl_data_.reset(new SSLSocketDataProvider(SYNCHRONOUS, OK)); |
| 190 if (GetParam().proxy_type == SPDY) { | 184 if (GetParam().proxy_type == SPDY) { |
| 191 InitializeSpdySsl(); | 185 InitializeSpdySsl(); |
| 192 } | 186 } |
| 193 socket_factory()->AddSSLSocketDataProvider(ssl_data_.get()); | 187 socket_factory()->AddSSLSocketDataProvider(ssl_data_.get()); |
| 194 } | 188 } |
| 195 } | 189 } |
| 196 | 190 |
| 197 void InitializeSpdySsl() { | 191 void InitializeSpdySsl() { ssl_data_->SetNextProto(GetParam().protocol); } |
| 198 ssl_data_->SetNextProto(GetParam().protocol); | |
| 199 } | |
| 200 | 192 |
| 201 HttpNetworkSession* CreateNetworkSession() { | 193 HttpNetworkSession* CreateNetworkSession() { |
| 202 return SpdySessionDependencies::SpdyCreateSessionDeterministic( | 194 return SpdySessionDependencies::SpdyCreateSessionDeterministic( |
| 203 &session_deps_); | 195 &session_deps_); |
| 204 } | 196 } |
| 205 | 197 |
| 206 RequestPriority GetLastTransportRequestPriority() const { | 198 RequestPriority GetLastTransportRequestPriority() const { |
| 207 return transport_socket_pool_.last_request_priority(); | 199 return transport_socket_pool_.last_request_priority(); |
| 208 } | 200 } |
| 209 | 201 |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 248 HttpProxyClientSocketPoolTestParams(HTTP, kProtoSPDY31), | 240 HttpProxyClientSocketPoolTestParams(HTTP, kProtoSPDY31), |
| 249 HttpProxyClientSocketPoolTestParams(HTTPS, kProtoSPDY31), | 241 HttpProxyClientSocketPoolTestParams(HTTPS, kProtoSPDY31), |
| 250 HttpProxyClientSocketPoolTestParams(SPDY, kProtoSPDY31), | 242 HttpProxyClientSocketPoolTestParams(SPDY, kProtoSPDY31), |
| 251 HttpProxyClientSocketPoolTestParams(HTTP, kProtoSPDY4), | 243 HttpProxyClientSocketPoolTestParams(HTTP, kProtoSPDY4), |
| 252 HttpProxyClientSocketPoolTestParams(HTTPS, kProtoSPDY4), | 244 HttpProxyClientSocketPoolTestParams(HTTPS, kProtoSPDY4), |
| 253 HttpProxyClientSocketPoolTestParams(SPDY, kProtoSPDY4))); | 245 HttpProxyClientSocketPoolTestParams(SPDY, kProtoSPDY4))); |
| 254 | 246 |
| 255 TEST_P(HttpProxyClientSocketPoolTest, NoTunnel) { | 247 TEST_P(HttpProxyClientSocketPoolTest, NoTunnel) { |
| 256 Initialize(NULL, 0, NULL, 0, NULL, 0, NULL, 0); | 248 Initialize(NULL, 0, NULL, 0, NULL, 0, NULL, 0); |
| 257 | 249 |
| 258 int rv = handle_.Init("a", CreateNoTunnelParams(), LOW, CompletionCallback(), | 250 int rv = handle_.Init("a", |
| 259 &pool_, BoundNetLog()); | 251 CreateNoTunnelParams(), |
| 252 LOW, |
| 253 CompletionCallback(), |
| 254 &pool_, |
| 255 BoundNetLog()); |
| 260 EXPECT_EQ(OK, rv); | 256 EXPECT_EQ(OK, rv); |
| 261 EXPECT_TRUE(handle_.is_initialized()); | 257 EXPECT_TRUE(handle_.is_initialized()); |
| 262 ASSERT_TRUE(handle_.socket()); | 258 ASSERT_TRUE(handle_.socket()); |
| 263 HttpProxyClientSocket* tunnel_socket = | 259 HttpProxyClientSocket* tunnel_socket = |
| 264 static_cast<HttpProxyClientSocket*>(handle_.socket()); | 260 static_cast<HttpProxyClientSocket*>(handle_.socket()); |
| 265 EXPECT_TRUE(tunnel_socket->IsConnected()); | 261 EXPECT_TRUE(tunnel_socket->IsConnected()); |
| 266 } | 262 } |
| 267 | 263 |
| 268 // Make sure that HttpProxyConnectJob passes on its priority to its | 264 // Make sure that HttpProxyConnectJob passes on its priority to its |
| 269 // (non-SSL) socket request on Init. | 265 // (non-SSL) socket request on Init. |
| 270 TEST_P(HttpProxyClientSocketPoolTest, SetSocketRequestPriorityOnInit) { | 266 TEST_P(HttpProxyClientSocketPoolTest, SetSocketRequestPriorityOnInit) { |
| 271 Initialize(NULL, 0, NULL, 0, NULL, 0, NULL, 0); | 267 Initialize(NULL, 0, NULL, 0, NULL, 0, NULL, 0); |
| 272 EXPECT_EQ(OK, | 268 EXPECT_EQ(OK, |
| 273 handle_.Init("a", CreateNoTunnelParams(), HIGHEST, | 269 handle_.Init("a", |
| 274 CompletionCallback(), &pool_, BoundNetLog())); | 270 CreateNoTunnelParams(), |
| 271 HIGHEST, |
| 272 CompletionCallback(), |
| 273 &pool_, |
| 274 BoundNetLog())); |
| 275 EXPECT_EQ(HIGHEST, GetLastTransportRequestPriority()); | 275 EXPECT_EQ(HIGHEST, GetLastTransportRequestPriority()); |
| 276 } | 276 } |
| 277 | 277 |
| 278 TEST_P(HttpProxyClientSocketPoolTest, NeedAuth) { | 278 TEST_P(HttpProxyClientSocketPoolTest, NeedAuth) { |
| 279 MockWrite writes[] = { | 279 MockWrite writes[] = { |
| 280 MockWrite(ASYNC, 0, "CONNECT www.google.com:443 HTTP/1.1\r\n" | 280 MockWrite(ASYNC, |
| 281 "Host: www.google.com\r\n" | 281 0, |
| 282 "Proxy-Connection: keep-alive\r\n\r\n"), | 282 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
| 283 "Host: www.google.com\r\n" |
| 284 "Proxy-Connection: keep-alive\r\n\r\n"), |
| 283 }; | 285 }; |
| 284 MockRead reads[] = { | 286 MockRead reads[] = { |
| 285 // No credentials. | 287 // No credentials. |
| 286 MockRead(ASYNC, 1, "HTTP/1.1 407 Proxy Authentication Required\r\n"), | 288 MockRead(ASYNC, 1, "HTTP/1.1 407 Proxy Authentication Required\r\n"), |
| 287 MockRead(ASYNC, 2, "Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"), | 289 MockRead(ASYNC, 2, "Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"), |
| 288 MockRead(ASYNC, 3, "Content-Length: 10\r\n\r\n"), | 290 MockRead(ASYNC, 3, "Content-Length: 10\r\n\r\n"), |
| 289 MockRead(ASYNC, 4, "0123456789"), | 291 MockRead(ASYNC, 4, "0123456789"), |
| 290 }; | 292 }; |
| 291 scoped_ptr<SpdyFrame> req( | 293 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyConnect(NULL, 0, 1, LOW)); |
| 292 spdy_util_.ConstructSpdyConnect(NULL, 0, 1, LOW)); | |
| 293 scoped_ptr<SpdyFrame> rst( | 294 scoped_ptr<SpdyFrame> rst( |
| 294 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | 295 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); |
| 295 MockWrite spdy_writes[] = { | 296 MockWrite spdy_writes[] = { |
| 296 CreateMockWrite(*req, 0, ASYNC), | 297 CreateMockWrite(*req, 0, ASYNC), CreateMockWrite(*rst, 2, ASYNC), |
| 297 CreateMockWrite(*rst, 2, ASYNC), | |
| 298 }; | 298 }; |
| 299 const char* const kAuthChallenge[] = { | 299 const char* const kAuthChallenge[] = { |
| 300 spdy_util_.GetStatusKey(), "407 Proxy Authentication Required", | 300 spdy_util_.GetStatusKey(), "407 Proxy Authentication Required", |
| 301 spdy_util_.GetVersionKey(), "HTTP/1.1", | 301 spdy_util_.GetVersionKey(), "HTTP/1.1", |
| 302 "proxy-authenticate", "Basic realm=\"MyRealm1\"", | 302 "proxy-authenticate", "Basic realm=\"MyRealm1\"", |
| 303 }; | 303 }; |
| 304 scoped_ptr<SpdyFrame> resp( | 304 scoped_ptr<SpdyFrame> resp( |
| 305 spdy_util_.ConstructSpdyControlFrame(NULL, | 305 spdy_util_.ConstructSpdyControlFrame(NULL, |
| 306 0, | 306 0, |
| 307 false, | 307 false, |
| 308 1, | 308 1, |
| 309 LOW, | 309 LOW, |
| 310 SYN_REPLY, | 310 SYN_REPLY, |
| 311 CONTROL_FLAG_NONE, | 311 CONTROL_FLAG_NONE, |
| 312 kAuthChallenge, | 312 kAuthChallenge, |
| 313 arraysize(kAuthChallenge), | 313 arraysize(kAuthChallenge), |
| 314 0)); | 314 0)); |
| 315 MockRead spdy_reads[] = { | 315 MockRead spdy_reads[] = {CreateMockRead(*resp, 1, ASYNC), |
| 316 CreateMockRead(*resp, 1, ASYNC), | 316 MockRead(ASYNC, 0, 3)}; |
| 317 MockRead(ASYNC, 0, 3) | |
| 318 }; | |
| 319 | 317 |
| 320 Initialize(reads, arraysize(reads), writes, arraysize(writes), | 318 Initialize(reads, |
| 321 spdy_reads, arraysize(spdy_reads), spdy_writes, | 319 arraysize(reads), |
| 320 writes, |
| 321 arraysize(writes), |
| 322 spdy_reads, |
| 323 arraysize(spdy_reads), |
| 324 spdy_writes, |
| 322 arraysize(spdy_writes)); | 325 arraysize(spdy_writes)); |
| 323 | 326 |
| 324 data_->StopAfter(4); | 327 data_->StopAfter(4); |
| 325 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), | 328 int rv = handle_.Init("a", |
| 326 &pool_, BoundNetLog()); | 329 CreateTunnelParams(), |
| 330 LOW, |
| 331 callback_.callback(), |
| 332 &pool_, |
| 333 BoundNetLog()); |
| 327 EXPECT_EQ(ERR_IO_PENDING, rv); | 334 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 328 EXPECT_FALSE(handle_.is_initialized()); | 335 EXPECT_FALSE(handle_.is_initialized()); |
| 329 EXPECT_FALSE(handle_.socket()); | 336 EXPECT_FALSE(handle_.socket()); |
| 330 | 337 |
| 331 data_->RunFor(GetParam().proxy_type == SPDY ? 2 : 4); | 338 data_->RunFor(GetParam().proxy_type == SPDY ? 2 : 4); |
| 332 rv = callback_.WaitForResult(); | 339 rv = callback_.WaitForResult(); |
| 333 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, rv); | 340 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, rv); |
| 334 EXPECT_TRUE(handle_.is_initialized()); | 341 EXPECT_TRUE(handle_.is_initialized()); |
| 335 ASSERT_TRUE(handle_.socket()); | 342 ASSERT_TRUE(handle_.socket()); |
| 336 ProxyClientSocket* tunnel_socket = | 343 ProxyClientSocket* tunnel_socket = |
| 337 static_cast<ProxyClientSocket*>(handle_.socket()); | 344 static_cast<ProxyClientSocket*>(handle_.socket()); |
| 338 if (GetParam().proxy_type == SPDY) { | 345 if (GetParam().proxy_type == SPDY) { |
| 339 EXPECT_TRUE(tunnel_socket->IsConnected()); | 346 EXPECT_TRUE(tunnel_socket->IsConnected()); |
| 340 EXPECT_TRUE(tunnel_socket->IsUsingSpdy()); | 347 EXPECT_TRUE(tunnel_socket->IsUsingSpdy()); |
| 341 } else { | 348 } else { |
| 342 EXPECT_FALSE(tunnel_socket->IsConnected()); | 349 EXPECT_FALSE(tunnel_socket->IsConnected()); |
| 343 EXPECT_FALSE(tunnel_socket->IsUsingSpdy()); | 350 EXPECT_FALSE(tunnel_socket->IsUsingSpdy()); |
| 344 } | 351 } |
| 345 } | 352 } |
| 346 | 353 |
| 347 TEST_P(HttpProxyClientSocketPoolTest, HaveAuth) { | 354 TEST_P(HttpProxyClientSocketPoolTest, HaveAuth) { |
| 348 // It's pretty much impossible to make the SPDY case behave synchronously | 355 // It's pretty much impossible to make the SPDY case behave synchronously |
| 349 // so we skip this test for SPDY | 356 // so we skip this test for SPDY |
| 350 if (GetParam().proxy_type == SPDY) | 357 if (GetParam().proxy_type == SPDY) |
| 351 return; | 358 return; |
| 352 MockWrite writes[] = { | 359 MockWrite writes[] = { |
| 353 MockWrite(SYNCHRONOUS, 0, | 360 MockWrite(SYNCHRONOUS, |
| 354 "CONNECT www.google.com:443 HTTP/1.1\r\n" | 361 0, |
| 355 "Host: www.google.com\r\n" | 362 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
| 356 "Proxy-Connection: keep-alive\r\n" | 363 "Host: www.google.com\r\n" |
| 357 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 364 "Proxy-Connection: keep-alive\r\n" |
| 365 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), |
| 358 }; | 366 }; |
| 359 MockRead reads[] = { | 367 MockRead reads[] = { |
| 360 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 Connection Established\r\n\r\n"), | 368 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 Connection Established\r\n\r\n"), |
| 361 }; | 369 }; |
| 362 | 370 |
| 363 Initialize(reads, arraysize(reads), writes, arraysize(writes), NULL, 0, | 371 Initialize( |
| 364 NULL, 0); | 372 reads, arraysize(reads), writes, arraysize(writes), NULL, 0, NULL, 0); |
| 365 AddAuthToCache(); | 373 AddAuthToCache(); |
| 366 | 374 |
| 367 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), | 375 int rv = handle_.Init("a", |
| 368 &pool_, BoundNetLog()); | 376 CreateTunnelParams(), |
| 377 LOW, |
| 378 callback_.callback(), |
| 379 &pool_, |
| 380 BoundNetLog()); |
| 369 EXPECT_EQ(OK, rv); | 381 EXPECT_EQ(OK, rv); |
| 370 EXPECT_TRUE(handle_.is_initialized()); | 382 EXPECT_TRUE(handle_.is_initialized()); |
| 371 ASSERT_TRUE(handle_.socket()); | 383 ASSERT_TRUE(handle_.socket()); |
| 372 HttpProxyClientSocket* tunnel_socket = | 384 HttpProxyClientSocket* tunnel_socket = |
| 373 static_cast<HttpProxyClientSocket*>(handle_.socket()); | 385 static_cast<HttpProxyClientSocket*>(handle_.socket()); |
| 374 EXPECT_TRUE(tunnel_socket->IsConnected()); | 386 EXPECT_TRUE(tunnel_socket->IsConnected()); |
| 375 } | 387 } |
| 376 | 388 |
| 377 TEST_P(HttpProxyClientSocketPoolTest, AsyncHaveAuth) { | 389 TEST_P(HttpProxyClientSocketPoolTest, AsyncHaveAuth) { |
| 378 MockWrite writes[] = { | 390 MockWrite writes[] = { |
| 379 MockWrite(ASYNC, 0, "CONNECT www.google.com:443 HTTP/1.1\r\n" | 391 MockWrite(ASYNC, |
| 380 "Host: www.google.com\r\n" | 392 0, |
| 381 "Proxy-Connection: keep-alive\r\n" | 393 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
| 382 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 394 "Host: www.google.com\r\n" |
| 395 "Proxy-Connection: keep-alive\r\n" |
| 396 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), |
| 383 }; | 397 }; |
| 384 MockRead reads[] = { | 398 MockRead reads[] = { |
| 385 MockRead(ASYNC, 1, "HTTP/1.1 200 Connection Established\r\n\r\n"), | 399 MockRead(ASYNC, 1, "HTTP/1.1 200 Connection Established\r\n\r\n"), |
| 386 }; | 400 }; |
| 387 | 401 |
| 388 scoped_ptr<SpdyFrame> req( | 402 scoped_ptr<SpdyFrame> req( |
| 389 spdy_util_.ConstructSpdyConnect(kAuthHeaders, kAuthHeadersSize, 1, LOW)); | 403 spdy_util_.ConstructSpdyConnect(kAuthHeaders, kAuthHeadersSize, 1, LOW)); |
| 390 MockWrite spdy_writes[] = { | 404 MockWrite spdy_writes[] = {CreateMockWrite(*req, 0, ASYNC)}; |
| 391 CreateMockWrite(*req, 0, ASYNC) | |
| 392 }; | |
| 393 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 405 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 394 MockRead spdy_reads[] = { | 406 MockRead spdy_reads[] = {CreateMockRead(*resp, 1, ASYNC), |
| 395 CreateMockRead(*resp, 1, ASYNC), | 407 MockRead(ASYNC, 0, 2)}; |
| 396 MockRead(ASYNC, 0, 2) | |
| 397 }; | |
| 398 | 408 |
| 399 Initialize(reads, arraysize(reads), writes, arraysize(writes), | 409 Initialize(reads, |
| 400 spdy_reads, arraysize(spdy_reads), spdy_writes, | 410 arraysize(reads), |
| 411 writes, |
| 412 arraysize(writes), |
| 413 spdy_reads, |
| 414 arraysize(spdy_reads), |
| 415 spdy_writes, |
| 401 arraysize(spdy_writes)); | 416 arraysize(spdy_writes)); |
| 402 AddAuthToCache(); | 417 AddAuthToCache(); |
| 403 | 418 |
| 404 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), | 419 int rv = handle_.Init("a", |
| 405 &pool_, BoundNetLog()); | 420 CreateTunnelParams(), |
| 421 LOW, |
| 422 callback_.callback(), |
| 423 &pool_, |
| 424 BoundNetLog()); |
| 406 EXPECT_EQ(ERR_IO_PENDING, rv); | 425 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 407 EXPECT_FALSE(handle_.is_initialized()); | 426 EXPECT_FALSE(handle_.is_initialized()); |
| 408 EXPECT_FALSE(handle_.socket()); | 427 EXPECT_FALSE(handle_.socket()); |
| 409 | 428 |
| 410 data_->RunFor(2); | 429 data_->RunFor(2); |
| 411 EXPECT_EQ(OK, callback_.WaitForResult()); | 430 EXPECT_EQ(OK, callback_.WaitForResult()); |
| 412 EXPECT_TRUE(handle_.is_initialized()); | 431 EXPECT_TRUE(handle_.is_initialized()); |
| 413 ASSERT_TRUE(handle_.socket()); | 432 ASSERT_TRUE(handle_.socket()); |
| 414 HttpProxyClientSocket* tunnel_socket = | 433 HttpProxyClientSocket* tunnel_socket = |
| 415 static_cast<HttpProxyClientSocket*>(handle_.socket()); | 434 static_cast<HttpProxyClientSocket*>(handle_.socket()); |
| 416 EXPECT_TRUE(tunnel_socket->IsConnected()); | 435 EXPECT_TRUE(tunnel_socket->IsConnected()); |
| 417 } | 436 } |
| 418 | 437 |
| 419 // Make sure that HttpProxyConnectJob passes on its priority to its | 438 // Make sure that HttpProxyConnectJob passes on its priority to its |
| 420 // SPDY session's socket request on Init (if applicable). | 439 // SPDY session's socket request on Init (if applicable). |
| 421 TEST_P(HttpProxyClientSocketPoolTest, | 440 TEST_P(HttpProxyClientSocketPoolTest, |
| 422 SetSpdySessionSocketRequestPriorityOnInit) { | 441 SetSpdySessionSocketRequestPriorityOnInit) { |
| 423 if (GetParam().proxy_type != SPDY) | 442 if (GetParam().proxy_type != SPDY) |
| 424 return; | 443 return; |
| 425 | 444 |
| 426 scoped_ptr<SpdyFrame> req( | 445 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyConnect( |
| 427 spdy_util_.ConstructSpdyConnect(kAuthHeaders, kAuthHeadersSize, | 446 kAuthHeaders, kAuthHeadersSize, 1, MEDIUM)); |
| 428 1, MEDIUM)); | 447 MockWrite spdy_writes[] = {CreateMockWrite(*req, 0, ASYNC)}; |
| 429 MockWrite spdy_writes[] = { | |
| 430 CreateMockWrite(*req, 0, ASYNC) | |
| 431 }; | |
| 432 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 448 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 433 MockRead spdy_reads[] = { | 449 MockRead spdy_reads[] = {CreateMockRead(*resp, 1, ASYNC), |
| 434 CreateMockRead(*resp, 1, ASYNC), | 450 MockRead(ASYNC, 0, 2)}; |
| 435 MockRead(ASYNC, 0, 2) | |
| 436 }; | |
| 437 | 451 |
| 438 Initialize(NULL, 0, NULL, 0, | 452 Initialize(NULL, |
| 439 spdy_reads, arraysize(spdy_reads), | 453 0, |
| 440 spdy_writes, arraysize(spdy_writes)); | 454 NULL, |
| 455 0, |
| 456 spdy_reads, |
| 457 arraysize(spdy_reads), |
| 458 spdy_writes, |
| 459 arraysize(spdy_writes)); |
| 441 AddAuthToCache(); | 460 AddAuthToCache(); |
| 442 | 461 |
| 443 EXPECT_EQ(ERR_IO_PENDING, | 462 EXPECT_EQ(ERR_IO_PENDING, |
| 444 handle_.Init("a", CreateTunnelParams(), MEDIUM, | 463 handle_.Init("a", |
| 445 callback_.callback(), &pool_, BoundNetLog())); | 464 CreateTunnelParams(), |
| 465 MEDIUM, |
| 466 callback_.callback(), |
| 467 &pool_, |
| 468 BoundNetLog())); |
| 446 EXPECT_EQ(MEDIUM, GetLastTransportRequestPriority()); | 469 EXPECT_EQ(MEDIUM, GetLastTransportRequestPriority()); |
| 447 | 470 |
| 448 data_->RunFor(2); | 471 data_->RunFor(2); |
| 449 EXPECT_EQ(OK, callback_.WaitForResult()); | 472 EXPECT_EQ(OK, callback_.WaitForResult()); |
| 450 } | 473 } |
| 451 | 474 |
| 452 TEST_P(HttpProxyClientSocketPoolTest, TCPError) { | 475 TEST_P(HttpProxyClientSocketPoolTest, TCPError) { |
| 453 if (GetParam().proxy_type == SPDY) return; | 476 if (GetParam().proxy_type == SPDY) |
| 477 return; |
| 454 data_.reset(new DeterministicSocketData(NULL, 0, NULL, 0)); | 478 data_.reset(new DeterministicSocketData(NULL, 0, NULL, 0)); |
| 455 data_->set_connect_data(MockConnect(ASYNC, ERR_CONNECTION_CLOSED)); | 479 data_->set_connect_data(MockConnect(ASYNC, ERR_CONNECTION_CLOSED)); |
| 456 | 480 |
| 457 socket_factory()->AddSocketDataProvider(data_.get()); | 481 socket_factory()->AddSocketDataProvider(data_.get()); |
| 458 | 482 |
| 459 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), | 483 int rv = handle_.Init("a", |
| 460 &pool_, BoundNetLog()); | 484 CreateTunnelParams(), |
| 485 LOW, |
| 486 callback_.callback(), |
| 487 &pool_, |
| 488 BoundNetLog()); |
| 461 EXPECT_EQ(ERR_IO_PENDING, rv); | 489 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 462 EXPECT_FALSE(handle_.is_initialized()); | 490 EXPECT_FALSE(handle_.is_initialized()); |
| 463 EXPECT_FALSE(handle_.socket()); | 491 EXPECT_FALSE(handle_.socket()); |
| 464 | 492 |
| 465 EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, callback_.WaitForResult()); | 493 EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, callback_.WaitForResult()); |
| 466 | 494 |
| 467 EXPECT_FALSE(handle_.is_initialized()); | 495 EXPECT_FALSE(handle_.is_initialized()); |
| 468 EXPECT_FALSE(handle_.socket()); | 496 EXPECT_FALSE(handle_.socket()); |
| 469 } | 497 } |
| 470 | 498 |
| 471 TEST_P(HttpProxyClientSocketPoolTest, SSLError) { | 499 TEST_P(HttpProxyClientSocketPoolTest, SSLError) { |
| 472 if (GetParam().proxy_type == HTTP) return; | 500 if (GetParam().proxy_type == HTTP) |
| 501 return; |
| 473 data_.reset(new DeterministicSocketData(NULL, 0, NULL, 0)); | 502 data_.reset(new DeterministicSocketData(NULL, 0, NULL, 0)); |
| 474 data_->set_connect_data(MockConnect(ASYNC, OK)); | 503 data_->set_connect_data(MockConnect(ASYNC, OK)); |
| 475 socket_factory()->AddSocketDataProvider(data_.get()); | 504 socket_factory()->AddSocketDataProvider(data_.get()); |
| 476 | 505 |
| 477 ssl_data_.reset(new SSLSocketDataProvider(ASYNC, | 506 ssl_data_.reset(new SSLSocketDataProvider(ASYNC, ERR_CERT_AUTHORITY_INVALID)); |
| 478 ERR_CERT_AUTHORITY_INVALID)); | |
| 479 if (GetParam().proxy_type == SPDY) { | 507 if (GetParam().proxy_type == SPDY) { |
| 480 InitializeSpdySsl(); | 508 InitializeSpdySsl(); |
| 481 } | 509 } |
| 482 socket_factory()->AddSSLSocketDataProvider(ssl_data_.get()); | 510 socket_factory()->AddSSLSocketDataProvider(ssl_data_.get()); |
| 483 | 511 |
| 484 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), | 512 int rv = handle_.Init("a", |
| 485 &pool_, BoundNetLog()); | 513 CreateTunnelParams(), |
| 514 LOW, |
| 515 callback_.callback(), |
| 516 &pool_, |
| 517 BoundNetLog()); |
| 486 EXPECT_EQ(ERR_IO_PENDING, rv); | 518 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 487 EXPECT_FALSE(handle_.is_initialized()); | 519 EXPECT_FALSE(handle_.is_initialized()); |
| 488 EXPECT_FALSE(handle_.socket()); | 520 EXPECT_FALSE(handle_.socket()); |
| 489 | 521 |
| 490 EXPECT_EQ(ERR_PROXY_CERTIFICATE_INVALID, callback_.WaitForResult()); | 522 EXPECT_EQ(ERR_PROXY_CERTIFICATE_INVALID, callback_.WaitForResult()); |
| 491 | 523 |
| 492 EXPECT_FALSE(handle_.is_initialized()); | 524 EXPECT_FALSE(handle_.is_initialized()); |
| 493 EXPECT_FALSE(handle_.socket()); | 525 EXPECT_FALSE(handle_.socket()); |
| 494 } | 526 } |
| 495 | 527 |
| 496 TEST_P(HttpProxyClientSocketPoolTest, SslClientAuth) { | 528 TEST_P(HttpProxyClientSocketPoolTest, SslClientAuth) { |
| 497 if (GetParam().proxy_type == HTTP) return; | 529 if (GetParam().proxy_type == HTTP) |
| 530 return; |
| 498 data_.reset(new DeterministicSocketData(NULL, 0, NULL, 0)); | 531 data_.reset(new DeterministicSocketData(NULL, 0, NULL, 0)); |
| 499 data_->set_connect_data(MockConnect(ASYNC, OK)); | 532 data_->set_connect_data(MockConnect(ASYNC, OK)); |
| 500 socket_factory()->AddSocketDataProvider(data_.get()); | 533 socket_factory()->AddSocketDataProvider(data_.get()); |
| 501 | 534 |
| 502 ssl_data_.reset(new SSLSocketDataProvider(ASYNC, | 535 ssl_data_.reset( |
| 503 ERR_SSL_CLIENT_AUTH_CERT_NEEDED)); | 536 new SSLSocketDataProvider(ASYNC, ERR_SSL_CLIENT_AUTH_CERT_NEEDED)); |
| 504 if (GetParam().proxy_type == SPDY) { | 537 if (GetParam().proxy_type == SPDY) { |
| 505 InitializeSpdySsl(); | 538 InitializeSpdySsl(); |
| 506 } | 539 } |
| 507 socket_factory()->AddSSLSocketDataProvider(ssl_data_.get()); | 540 socket_factory()->AddSSLSocketDataProvider(ssl_data_.get()); |
| 508 | 541 |
| 509 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), | 542 int rv = handle_.Init("a", |
| 510 &pool_, BoundNetLog()); | 543 CreateTunnelParams(), |
| 544 LOW, |
| 545 callback_.callback(), |
| 546 &pool_, |
| 547 BoundNetLog()); |
| 511 EXPECT_EQ(ERR_IO_PENDING, rv); | 548 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 512 EXPECT_FALSE(handle_.is_initialized()); | 549 EXPECT_FALSE(handle_.is_initialized()); |
| 513 EXPECT_FALSE(handle_.socket()); | 550 EXPECT_FALSE(handle_.socket()); |
| 514 | 551 |
| 515 EXPECT_EQ(ERR_SSL_CLIENT_AUTH_CERT_NEEDED, callback_.WaitForResult()); | 552 EXPECT_EQ(ERR_SSL_CLIENT_AUTH_CERT_NEEDED, callback_.WaitForResult()); |
| 516 | 553 |
| 517 EXPECT_FALSE(handle_.is_initialized()); | 554 EXPECT_FALSE(handle_.is_initialized()); |
| 518 EXPECT_FALSE(handle_.socket()); | 555 EXPECT_FALSE(handle_.socket()); |
| 519 } | 556 } |
| 520 | 557 |
| 521 TEST_P(HttpProxyClientSocketPoolTest, TunnelUnexpectedClose) { | 558 TEST_P(HttpProxyClientSocketPoolTest, TunnelUnexpectedClose) { |
| 522 MockWrite writes[] = { | 559 MockWrite writes[] = { |
| 523 MockWrite(ASYNC, 0, | 560 MockWrite(ASYNC, |
| 524 "CONNECT www.google.com:443 HTTP/1.1\r\n" | 561 0, |
| 525 "Host: www.google.com\r\n" | 562 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
| 526 "Proxy-Connection: keep-alive\r\n" | 563 "Host: www.google.com\r\n" |
| 527 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 564 "Proxy-Connection: keep-alive\r\n" |
| 565 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), |
| 528 }; | 566 }; |
| 529 MockRead reads[] = { | 567 MockRead reads[] = { |
| 530 MockRead(ASYNC, 1, "HTTP/1.1 200 Conn"), | 568 MockRead(ASYNC, 1, "HTTP/1.1 200 Conn"), |
| 531 MockRead(ASYNC, ERR_CONNECTION_CLOSED, 2), | 569 MockRead(ASYNC, ERR_CONNECTION_CLOSED, 2), |
| 532 }; | 570 }; |
| 533 scoped_ptr<SpdyFrame> req( | 571 scoped_ptr<SpdyFrame> req( |
| 534 spdy_util_.ConstructSpdyConnect(kAuthHeaders, kAuthHeadersSize, 1, LOW)); | 572 spdy_util_.ConstructSpdyConnect(kAuthHeaders, kAuthHeadersSize, 1, LOW)); |
| 535 MockWrite spdy_writes[] = { | 573 MockWrite spdy_writes[] = {CreateMockWrite(*req, 0, ASYNC)}; |
| 536 CreateMockWrite(*req, 0, ASYNC) | |
| 537 }; | |
| 538 MockRead spdy_reads[] = { | 574 MockRead spdy_reads[] = { |
| 539 MockRead(ASYNC, ERR_CONNECTION_CLOSED, 1), | 575 MockRead(ASYNC, ERR_CONNECTION_CLOSED, 1), |
| 540 }; | 576 }; |
| 541 | 577 |
| 542 Initialize(reads, arraysize(reads), writes, arraysize(writes), | 578 Initialize(reads, |
| 543 spdy_reads, arraysize(spdy_reads), spdy_writes, | 579 arraysize(reads), |
| 580 writes, |
| 581 arraysize(writes), |
| 582 spdy_reads, |
| 583 arraysize(spdy_reads), |
| 584 spdy_writes, |
| 544 arraysize(spdy_writes)); | 585 arraysize(spdy_writes)); |
| 545 AddAuthToCache(); | 586 AddAuthToCache(); |
| 546 | 587 |
| 547 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), | 588 int rv = handle_.Init("a", |
| 548 &pool_, BoundNetLog()); | 589 CreateTunnelParams(), |
| 590 LOW, |
| 591 callback_.callback(), |
| 592 &pool_, |
| 593 BoundNetLog()); |
| 549 EXPECT_EQ(ERR_IO_PENDING, rv); | 594 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 550 EXPECT_FALSE(handle_.is_initialized()); | 595 EXPECT_FALSE(handle_.is_initialized()); |
| 551 EXPECT_FALSE(handle_.socket()); | 596 EXPECT_FALSE(handle_.socket()); |
| 552 | 597 |
| 553 data_->RunFor(3); | 598 data_->RunFor(3); |
| 554 if (GetParam().proxy_type == SPDY) { | 599 if (GetParam().proxy_type == SPDY) { |
| 555 // SPDY cannot process a headers block unless it's complete and so it | 600 // SPDY cannot process a headers block unless it's complete and so it |
| 556 // returns ERR_CONNECTION_CLOSED in this case. | 601 // returns ERR_CONNECTION_CLOSED in this case. |
| 557 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback_.WaitForResult()); | 602 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback_.WaitForResult()); |
| 558 } else { | 603 } else { |
| 559 EXPECT_EQ(ERR_RESPONSE_HEADERS_TRUNCATED, callback_.WaitForResult()); | 604 EXPECT_EQ(ERR_RESPONSE_HEADERS_TRUNCATED, callback_.WaitForResult()); |
| 560 } | 605 } |
| 561 EXPECT_FALSE(handle_.is_initialized()); | 606 EXPECT_FALSE(handle_.is_initialized()); |
| 562 EXPECT_FALSE(handle_.socket()); | 607 EXPECT_FALSE(handle_.socket()); |
| 563 } | 608 } |
| 564 | 609 |
| 565 TEST_P(HttpProxyClientSocketPoolTest, Tunnel1xxResponse) { | 610 TEST_P(HttpProxyClientSocketPoolTest, Tunnel1xxResponse) { |
| 566 // Tests that 1xx responses are rejected for a CONNECT request. | 611 // Tests that 1xx responses are rejected for a CONNECT request. |
| 567 if (GetParam().proxy_type == SPDY) { | 612 if (GetParam().proxy_type == SPDY) { |
| 568 // SPDY doesn't have 1xx responses. | 613 // SPDY doesn't have 1xx responses. |
| 569 return; | 614 return; |
| 570 } | 615 } |
| 571 | 616 |
| 572 MockWrite writes[] = { | 617 MockWrite writes[] = { |
| 573 MockWrite(ASYNC, 0, | 618 MockWrite(ASYNC, |
| 574 "CONNECT www.google.com:443 HTTP/1.1\r\n" | 619 0, |
| 575 "Host: www.google.com\r\n" | 620 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
| 576 "Proxy-Connection: keep-alive\r\n\r\n"), | 621 "Host: www.google.com\r\n" |
| 622 "Proxy-Connection: keep-alive\r\n\r\n"), |
| 577 }; | 623 }; |
| 578 MockRead reads[] = { | 624 MockRead reads[] = { |
| 579 MockRead(ASYNC, 1, "HTTP/1.1 100 Continue\r\n\r\n"), | 625 MockRead(ASYNC, 1, "HTTP/1.1 100 Continue\r\n\r\n"), |
| 580 MockRead(ASYNC, 2, "HTTP/1.1 200 Connection Established\r\n\r\n"), | 626 MockRead(ASYNC, 2, "HTTP/1.1 200 Connection Established\r\n\r\n"), |
| 581 }; | 627 }; |
| 582 | 628 |
| 583 Initialize(reads, arraysize(reads), writes, arraysize(writes), | 629 Initialize( |
| 584 NULL, 0, NULL, 0); | 630 reads, arraysize(reads), writes, arraysize(writes), NULL, 0, NULL, 0); |
| 585 | 631 |
| 586 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), | 632 int rv = handle_.Init("a", |
| 587 &pool_, BoundNetLog()); | 633 CreateTunnelParams(), |
| 634 LOW, |
| 635 callback_.callback(), |
| 636 &pool_, |
| 637 BoundNetLog()); |
| 588 EXPECT_EQ(ERR_IO_PENDING, rv); | 638 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 589 EXPECT_FALSE(handle_.is_initialized()); | 639 EXPECT_FALSE(handle_.is_initialized()); |
| 590 EXPECT_FALSE(handle_.socket()); | 640 EXPECT_FALSE(handle_.socket()); |
| 591 | 641 |
| 592 data_->RunFor(2); | 642 data_->RunFor(2); |
| 593 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, callback_.WaitForResult()); | 643 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, callback_.WaitForResult()); |
| 594 } | 644 } |
| 595 | 645 |
| 596 TEST_P(HttpProxyClientSocketPoolTest, TunnelSetupError) { | 646 TEST_P(HttpProxyClientSocketPoolTest, TunnelSetupError) { |
| 597 MockWrite writes[] = { | 647 MockWrite writes[] = { |
| 598 MockWrite(ASYNC, 0, | 648 MockWrite(ASYNC, |
| 599 "CONNECT www.google.com:443 HTTP/1.1\r\n" | 649 0, |
| 600 "Host: www.google.com\r\n" | 650 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
| 601 "Proxy-Connection: keep-alive\r\n" | 651 "Host: www.google.com\r\n" |
| 602 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 652 "Proxy-Connection: keep-alive\r\n" |
| 653 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), |
| 603 }; | 654 }; |
| 604 MockRead reads[] = { | 655 MockRead reads[] = { |
| 605 MockRead(ASYNC, 1, "HTTP/1.1 304 Not Modified\r\n\r\n"), | 656 MockRead(ASYNC, 1, "HTTP/1.1 304 Not Modified\r\n\r\n"), |
| 606 }; | 657 }; |
| 607 scoped_ptr<SpdyFrame> req( | 658 scoped_ptr<SpdyFrame> req( |
| 608 spdy_util_.ConstructSpdyConnect(kAuthHeaders, kAuthHeadersSize, 1, LOW)); | 659 spdy_util_.ConstructSpdyConnect(kAuthHeaders, kAuthHeadersSize, 1, LOW)); |
| 609 scoped_ptr<SpdyFrame> rst( | 660 scoped_ptr<SpdyFrame> rst( |
| 610 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | 661 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); |
| 611 MockWrite spdy_writes[] = { | 662 MockWrite spdy_writes[] = { |
| 612 CreateMockWrite(*req, 0, ASYNC), | 663 CreateMockWrite(*req, 0, ASYNC), CreateMockWrite(*rst, 2, ASYNC), |
| 613 CreateMockWrite(*rst, 2, ASYNC), | |
| 614 }; | 664 }; |
| 615 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdySynReplyError(1)); | 665 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdySynReplyError(1)); |
| 616 MockRead spdy_reads[] = { | 666 MockRead spdy_reads[] = { |
| 617 CreateMockRead(*resp, 1, ASYNC), | 667 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 3), |
| 618 MockRead(ASYNC, 0, 3), | |
| 619 }; | 668 }; |
| 620 | 669 |
| 621 Initialize(reads, arraysize(reads), writes, arraysize(writes), | 670 Initialize(reads, |
| 622 spdy_reads, arraysize(spdy_reads), spdy_writes, | 671 arraysize(reads), |
| 672 writes, |
| 673 arraysize(writes), |
| 674 spdy_reads, |
| 675 arraysize(spdy_reads), |
| 676 spdy_writes, |
| 623 arraysize(spdy_writes)); | 677 arraysize(spdy_writes)); |
| 624 AddAuthToCache(); | 678 AddAuthToCache(); |
| 625 | 679 |
| 626 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), | 680 int rv = handle_.Init("a", |
| 627 &pool_, BoundNetLog()); | 681 CreateTunnelParams(), |
| 682 LOW, |
| 683 callback_.callback(), |
| 684 &pool_, |
| 685 BoundNetLog()); |
| 628 EXPECT_EQ(ERR_IO_PENDING, rv); | 686 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 629 EXPECT_FALSE(handle_.is_initialized()); | 687 EXPECT_FALSE(handle_.is_initialized()); |
| 630 EXPECT_FALSE(handle_.socket()); | 688 EXPECT_FALSE(handle_.socket()); |
| 631 | 689 |
| 632 data_->RunFor(2); | 690 data_->RunFor(2); |
| 633 | 691 |
| 634 rv = callback_.WaitForResult(); | 692 rv = callback_.WaitForResult(); |
| 635 // All Proxy CONNECT responses are not trustworthy | 693 // All Proxy CONNECT responses are not trustworthy |
| 636 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, rv); | 694 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, rv); |
| 637 EXPECT_FALSE(handle_.is_initialized()); | 695 EXPECT_FALSE(handle_.is_initialized()); |
| 638 EXPECT_FALSE(handle_.socket()); | 696 EXPECT_FALSE(handle_.socket()); |
| 639 } | 697 } |
| 640 | 698 |
| 641 TEST_P(HttpProxyClientSocketPoolTest, TunnelSetupRedirect) { | 699 TEST_P(HttpProxyClientSocketPoolTest, TunnelSetupRedirect) { |
| 642 const std::string redirectTarget = "https://foo.google.com/"; | 700 const std::string redirectTarget = "https://foo.google.com/"; |
| 643 | 701 |
| 644 const std::string responseText = "HTTP/1.1 302 Found\r\n" | 702 const std::string responseText = |
| 645 "Location: " + redirectTarget + "\r\n" | 703 "HTTP/1.1 302 Found\r\n" |
| 646 "Set-Cookie: foo=bar\r\n" | 704 "Location: " + |
| 647 "\r\n"; | 705 redirectTarget + |
| 706 "\r\n" |
| 707 "Set-Cookie: foo=bar\r\n" |
| 708 "\r\n"; |
| 648 MockWrite writes[] = { | 709 MockWrite writes[] = { |
| 649 MockWrite(ASYNC, 0, | 710 MockWrite(ASYNC, |
| 650 "CONNECT www.google.com:443 HTTP/1.1\r\n" | 711 0, |
| 651 "Host: www.google.com\r\n" | 712 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
| 652 "Proxy-Connection: keep-alive\r\n" | 713 "Host: www.google.com\r\n" |
| 653 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 714 "Proxy-Connection: keep-alive\r\n" |
| 715 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), |
| 654 }; | 716 }; |
| 655 MockRead reads[] = { | 717 MockRead reads[] = { |
| 656 MockRead(ASYNC, 1, responseText.c_str()), | 718 MockRead(ASYNC, 1, responseText.c_str()), |
| 657 }; | 719 }; |
| 658 scoped_ptr<SpdyFrame> req( | 720 scoped_ptr<SpdyFrame> req( |
| 659 spdy_util_.ConstructSpdyConnect(kAuthHeaders, kAuthHeadersSize, 1, LOW)); | 721 spdy_util_.ConstructSpdyConnect(kAuthHeaders, kAuthHeadersSize, 1, LOW)); |
| 660 scoped_ptr<SpdyFrame> rst( | 722 scoped_ptr<SpdyFrame> rst( |
| 661 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | 723 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); |
| 662 | 724 |
| 663 MockWrite spdy_writes[] = { | 725 MockWrite spdy_writes[] = { |
| 664 CreateMockWrite(*req, 0, ASYNC), | 726 CreateMockWrite(*req, 0, ASYNC), CreateMockWrite(*rst, 3, ASYNC), |
| 665 CreateMockWrite(*rst, 3, ASYNC), | |
| 666 }; | 727 }; |
| 667 | 728 |
| 668 const char* const responseHeaders[] = { | 729 const char* const responseHeaders[] = { |
| 669 "location", redirectTarget.c_str(), | 730 "location", redirectTarget.c_str(), "set-cookie", "foo=bar", |
| 670 "set-cookie", "foo=bar", | |
| 671 }; | 731 }; |
| 672 const int responseHeadersSize = arraysize(responseHeaders) / 2; | 732 const int responseHeadersSize = arraysize(responseHeaders) / 2; |
| 673 scoped_ptr<SpdyFrame> resp( | 733 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdySynReplyError( |
| 674 spdy_util_.ConstructSpdySynReplyError( | 734 "302 Found", responseHeaders, responseHeadersSize, 1)); |
| 675 "302 Found", | |
| 676 responseHeaders, responseHeadersSize, | |
| 677 1)); | |
| 678 MockRead spdy_reads[] = { | 735 MockRead spdy_reads[] = { |
| 679 CreateMockRead(*resp, 1, ASYNC), | 736 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, 0, 2), |
| 680 MockRead(ASYNC, 0, 2), | |
| 681 }; | 737 }; |
| 682 | 738 |
| 683 Initialize(reads, arraysize(reads), writes, arraysize(writes), | 739 Initialize(reads, |
| 684 spdy_reads, arraysize(spdy_reads), spdy_writes, | 740 arraysize(reads), |
| 741 writes, |
| 742 arraysize(writes), |
| 743 spdy_reads, |
| 744 arraysize(spdy_reads), |
| 745 spdy_writes, |
| 685 arraysize(spdy_writes)); | 746 arraysize(spdy_writes)); |
| 686 AddAuthToCache(); | 747 AddAuthToCache(); |
| 687 | 748 |
| 688 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), | 749 int rv = handle_.Init("a", |
| 689 &pool_, BoundNetLog()); | 750 CreateTunnelParams(), |
| 751 LOW, |
| 752 callback_.callback(), |
| 753 &pool_, |
| 754 BoundNetLog()); |
| 690 EXPECT_EQ(ERR_IO_PENDING, rv); | 755 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 691 EXPECT_FALSE(handle_.is_initialized()); | 756 EXPECT_FALSE(handle_.is_initialized()); |
| 692 EXPECT_FALSE(handle_.socket()); | 757 EXPECT_FALSE(handle_.socket()); |
| 693 | 758 |
| 694 data_->RunFor(2); | 759 data_->RunFor(2); |
| 695 | 760 |
| 696 rv = callback_.WaitForResult(); | 761 rv = callback_.WaitForResult(); |
| 697 | 762 |
| 698 if (GetParam().proxy_type == HTTP) { | 763 if (GetParam().proxy_type == HTTP) { |
| 699 // We don't trust 302 responses to CONNECT from HTTP proxies. | 764 // We don't trust 302 responses to CONNECT from HTTP proxies. |
| (...skipping 22 matching lines...) Expand all Loading... |
| 722 EXPECT_TRUE(headers->IsRedirect(&location)); | 787 EXPECT_TRUE(headers->IsRedirect(&location)); |
| 723 EXPECT_EQ(location, redirectTarget); | 788 EXPECT_EQ(location, redirectTarget); |
| 724 } | 789 } |
| 725 } | 790 } |
| 726 | 791 |
| 727 // It would be nice to also test the timeouts in HttpProxyClientSocketPool. | 792 // It would be nice to also test the timeouts in HttpProxyClientSocketPool. |
| 728 | 793 |
| 729 } // namespace | 794 } // namespace |
| 730 | 795 |
| 731 } // namespace net | 796 } // namespace net |
| OLD | NEW |