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 |