Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(512)

Side by Side Diff: net/socket/ssl_client_socket_pool_unittest.cc

Issue 2870030: Implement SSLClientSocketPool. (Closed)
Patch Set: Rebase and fix mac compile error Created 10 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "net/http/http_proxy_client_socket_pool.h"
6
7 #include "base/callback.h"
8 #include "base/compiler_specific.h"
9 #include "base/time.h"
10 #include "net/base/auth.h"
11 #include "net/base/mock_host_resolver.h"
12 #include "net/base/net_errors.h"
13 #include "net/base/test_completion_callback.h"
14 #include "net/base/ssl_config_service_defaults.h"
15 #include "net/http/http_auth_controller.h"
16 #include "net/http/http_network_session.h"
17 #include "net/http/http_request_headers.h"
18 #include "net/http/http_response_headers.h"
19 #include "net/socket/client_socket_factory.h"
20 #include "net/socket/client_socket_handle.h"
21 #include "net/socket/client_socket_pool_histograms.h"
22 #include "net/socket/socket_test_util.h"
23 #include "testing/gtest/include/gtest/gtest.h"
24
25 namespace net {
26
27 namespace {
28
29 const int kMaxSockets = 32;
30 const int kMaxSocketsPerGroup = 6;
31
32 class SSLClientSocketPoolTest : public ClientSocketPoolTest {
33 protected:
34 SSLClientSocketPoolTest()
35 : direct_tcp_socket_params_(new TCPSocketParams(
36 HostPortPair("host", 443), MEDIUM, GURL(), false)),
37 tcp_socket_pool_(new MockTCPClientSocketPool(
38 kMaxSockets,
39 kMaxSocketsPerGroup,
40 make_scoped_refptr(new ClientSocketPoolHistograms("MockTCP")),
41 &socket_factory_)),
42 proxy_tcp_socket_params_(new TCPSocketParams(
43 HostPortPair("proxy", 443), MEDIUM, GURL(), false)),
44 http_proxy_socket_pool_(new HttpProxyClientSocketPool(
45 kMaxSockets,
46 kMaxSocketsPerGroup,
47 make_scoped_refptr(new ClientSocketPoolHistograms("MockHttpProxy")),
48 new MockHostResolver,
49 tcp_socket_pool_,
50 NULL)),
51 socks_socket_params_(new SOCKSSocketParams(
52 proxy_tcp_socket_params_, true, HostPortPair("sockshost", 443),
53 MEDIUM, GURL())),
54 socks_socket_pool_(new MockSOCKSClientSocketPool(
55 kMaxSockets,
56 kMaxSocketsPerGroup,
57 make_scoped_refptr(new ClientSocketPoolHistograms("MockSOCKS")),
58 tcp_socket_pool_)) {
59 scoped_refptr<SSLConfigService> ssl_config_service(
60 new SSLConfigServiceDefaults);
61 ssl_config_service->GetSSLConfig(&ssl_config_);
62 }
63
64 void CreatePool(bool tcp_pool, bool http_proxy_pool, bool socks_pool) {
65 pool_ = new SSLClientSocketPool(
66 kMaxSockets,
67 kMaxSocketsPerGroup,
68 make_scoped_refptr(new ClientSocketPoolHistograms("SSLUnitTest")),
69 NULL,
70 &socket_factory_,
71 tcp_pool ? tcp_socket_pool_ : NULL,
72 http_proxy_pool ? http_proxy_socket_pool_ : NULL,
73 socks_pool ? socks_socket_pool_ : NULL,
74 NULL);
75 }
76
77 scoped_refptr<SSLSocketParams> SSLParams(
78 ProxyServer::Scheme proxy, struct MockHttpAuthControllerData* auth_data,
79 size_t auth_data_len, bool want_spdy) {
80
81 scoped_refptr<HttpProxySocketParams> http_proxy_params;
82 if (proxy == ProxyServer::SCHEME_HTTP) {
83 scoped_refptr<MockHttpAuthController> auth_controller =
84 new MockHttpAuthController();
85 auth_controller->SetMockAuthControllerData(auth_data, auth_data_len);
86 http_proxy_params = new HttpProxySocketParams(proxy_tcp_socket_params_,
87 GURL("http://host"),
88 HostPortPair("host", 80),
89 auth_controller, true);
90 }
91
92 return make_scoped_refptr(new SSLSocketParams(
93 proxy == ProxyServer::SCHEME_DIRECT ? direct_tcp_socket_params_ : NULL,
94 http_proxy_params,
95 proxy == ProxyServer::SCHEME_SOCKS5 ? socks_socket_params_ : NULL,
96 proxy,
97 "host",
98 ssl_config_,
99 0,
100 want_spdy));
101 }
102
103 MockClientSocketFactory socket_factory_;
104
105 scoped_refptr<TCPSocketParams> direct_tcp_socket_params_;
106 scoped_refptr<MockTCPClientSocketPool> tcp_socket_pool_;
107
108 scoped_refptr<TCPSocketParams> proxy_tcp_socket_params_;
109 scoped_refptr<HttpProxySocketParams> http_proxy_socket_params_;
110 scoped_refptr<HttpProxyClientSocketPool> http_proxy_socket_pool_;
111
112 scoped_refptr<SOCKSSocketParams> socks_socket_params_;
113 scoped_refptr<MockSOCKSClientSocketPool> socks_socket_pool_;
114
115 SSLConfig ssl_config_;
116 scoped_refptr<SSLClientSocketPool> pool_;
117 };
118
119 TEST_F(SSLClientSocketPoolTest, TCPFail) {
120 StaticSocketDataProvider data;
121 data.set_connect_data(MockConnect(false, ERR_CONNECTION_FAILED));
122 socket_factory_.AddSocketDataProvider(&data);
123
124 CreatePool(true /* tcp pool */, false, false);
125 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
126 NULL, 0, false);
127
128 ClientSocketHandle handle;
129 int rv = handle.Init("a", params, MEDIUM, NULL, pool_, BoundNetLog());
130 EXPECT_EQ(ERR_CONNECTION_FAILED, rv);
131 EXPECT_FALSE(handle.is_initialized());
132 EXPECT_FALSE(handle.socket());
133 EXPECT_FALSE(handle.is_ssl_error());
134 }
135
136 TEST_F(SSLClientSocketPoolTest, TCPFailAsync) {
137 StaticSocketDataProvider data;
138 data.set_connect_data(MockConnect(true, ERR_CONNECTION_FAILED));
139 socket_factory_.AddSocketDataProvider(&data);
140
141 CreatePool(true /* tcp pool */, false, false);
142 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
143 NULL, 0, false);
144
145 ClientSocketHandle handle;
146 TestCompletionCallback callback;
147 int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
148 EXPECT_EQ(ERR_IO_PENDING, rv);
149 EXPECT_FALSE(handle.is_initialized());
150 EXPECT_FALSE(handle.socket());
151
152 EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult());
153 EXPECT_FALSE(handle.is_initialized());
154 EXPECT_FALSE(handle.socket());
155 EXPECT_FALSE(handle.is_ssl_error());
156 }
157
158 TEST_F(SSLClientSocketPoolTest, BasicDirect) {
159 StaticSocketDataProvider data;
160 data.set_connect_data(MockConnect(false, OK));
161 socket_factory_.AddSocketDataProvider(&data);
162 SSLSocketDataProvider ssl(false, OK);
163 socket_factory_.AddSSLSocketDataProvider(&ssl);
164
165 CreatePool(true /* tcp pool */, false, false);
166 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
167 NULL, 0, false);
168
169 ClientSocketHandle handle;
170 TestCompletionCallback callback;
171 int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
172 EXPECT_EQ(OK, rv);
173 EXPECT_TRUE(handle.is_initialized());
174 EXPECT_TRUE(handle.socket());
175 }
176
177 TEST_F(SSLClientSocketPoolTest, BasicDirectAsync) {
178 StaticSocketDataProvider data;
179 socket_factory_.AddSocketDataProvider(&data);
180 SSLSocketDataProvider ssl(true, OK);
181 socket_factory_.AddSSLSocketDataProvider(&ssl);
182
183 CreatePool(true /* tcp pool */, false, false);
184 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
185 NULL, 0, false);
186
187 ClientSocketHandle handle;
188 TestCompletionCallback callback;
189 int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
190 EXPECT_EQ(ERR_IO_PENDING, rv);
191 EXPECT_FALSE(handle.is_initialized());
192 EXPECT_FALSE(handle.socket());
193
194 EXPECT_EQ(OK, callback.WaitForResult());
195 EXPECT_TRUE(handle.is_initialized());
196 EXPECT_TRUE(handle.socket());
197 }
198
199 TEST_F(SSLClientSocketPoolTest, DirectCertError) {
200 StaticSocketDataProvider data;
201 socket_factory_.AddSocketDataProvider(&data);
202 SSLSocketDataProvider ssl(true, ERR_CERT_COMMON_NAME_INVALID);
203 socket_factory_.AddSSLSocketDataProvider(&ssl);
204
205 CreatePool(true /* tcp pool */, false, false);
206 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
207 NULL, 0, false);
208
209 ClientSocketHandle handle;
210 TestCompletionCallback callback;
211 int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
212 EXPECT_EQ(ERR_IO_PENDING, rv);
213 EXPECT_FALSE(handle.is_initialized());
214 EXPECT_FALSE(handle.socket());
215
216 EXPECT_EQ(ERR_CERT_COMMON_NAME_INVALID, callback.WaitForResult());
217 EXPECT_TRUE(handle.is_initialized());
218 EXPECT_TRUE(handle.socket());
219 }
220
221 TEST_F(SSLClientSocketPoolTest, DirectSSLError) {
222 StaticSocketDataProvider data;
223 socket_factory_.AddSocketDataProvider(&data);
224 SSLSocketDataProvider ssl(true, ERR_SSL_PROTOCOL_ERROR);
225 socket_factory_.AddSSLSocketDataProvider(&ssl);
226
227 CreatePool(true /* tcp pool */, false, false);
228 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
229 NULL, 0, false);
230
231 ClientSocketHandle handle;
232 TestCompletionCallback callback;
233 int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
234 EXPECT_EQ(ERR_IO_PENDING, rv);
235 EXPECT_FALSE(handle.is_initialized());
236 EXPECT_FALSE(handle.socket());
237
238 EXPECT_EQ(ERR_SSL_PROTOCOL_ERROR, callback.WaitForResult());
239 EXPECT_FALSE(handle.is_initialized());
240 EXPECT_FALSE(handle.socket());
241 EXPECT_TRUE(handle.is_ssl_error());
242 }
243
244 TEST_F(SSLClientSocketPoolTest, DirectWithNPN) {
245 StaticSocketDataProvider data;
246 socket_factory_.AddSocketDataProvider(&data);
247 SSLSocketDataProvider ssl(true, OK);
248 ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated;
249 ssl.next_proto = "http/1.1";
250 socket_factory_.AddSSLSocketDataProvider(&ssl);
251
252 CreatePool(true /* tcp pool */, false, false);
253 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
254 NULL, 0, false);
255
256 ClientSocketHandle handle;
257 TestCompletionCallback callback;
258 int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
259 EXPECT_EQ(ERR_IO_PENDING, rv);
260 EXPECT_FALSE(handle.is_initialized());
261 EXPECT_FALSE(handle.socket());
262
263 EXPECT_EQ(OK, callback.WaitForResult());
264 EXPECT_TRUE(handle.is_initialized());
265 EXPECT_TRUE(handle.socket());
266 SSLClientSocket* ssl_socket = static_cast<SSLClientSocket*>(handle.socket());
267 EXPECT_TRUE(ssl_socket->wasNpnNegotiated());
268 }
269
270 TEST_F(SSLClientSocketPoolTest, DirectNoSPDY) {
271 StaticSocketDataProvider data;
272 socket_factory_.AddSocketDataProvider(&data);
273 SSLSocketDataProvider ssl(true, OK);
274 ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated;
275 ssl.next_proto = "http/1.1";
276 socket_factory_.AddSSLSocketDataProvider(&ssl);
277
278 CreatePool(true /* tcp pool */, false, false);
279 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
280 NULL, 0, true);
281
282 ClientSocketHandle handle;
283 TestCompletionCallback callback;
284 int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
285 EXPECT_EQ(ERR_IO_PENDING, rv);
286 EXPECT_FALSE(handle.is_initialized());
287 EXPECT_FALSE(handle.socket());
288
289 EXPECT_EQ(ERR_NPN_NEGOTIATION_FAILED, callback.WaitForResult());
290 EXPECT_FALSE(handle.is_initialized());
291 EXPECT_FALSE(handle.socket());
292 EXPECT_TRUE(handle.is_ssl_error());
293 }
294
295 TEST_F(SSLClientSocketPoolTest, DirectGotSPDY) {
296 StaticSocketDataProvider data;
297 socket_factory_.AddSocketDataProvider(&data);
298 SSLSocketDataProvider ssl(true, OK);
299 ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated;
300 ssl.next_proto = "spdy/1";
301 socket_factory_.AddSSLSocketDataProvider(&ssl);
302
303 CreatePool(true /* tcp pool */, false, false);
304 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
305 NULL, 0, true);
306
307 ClientSocketHandle handle;
308 TestCompletionCallback callback;
309 int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
310 EXPECT_EQ(ERR_IO_PENDING, rv);
311 EXPECT_FALSE(handle.is_initialized());
312 EXPECT_FALSE(handle.socket());
313
314 EXPECT_EQ(OK, callback.WaitForResult());
315 EXPECT_TRUE(handle.is_initialized());
316 EXPECT_TRUE(handle.socket());
317
318 SSLClientSocket* ssl_socket = static_cast<SSLClientSocket*>(handle.socket());
319 EXPECT_TRUE(ssl_socket->wasNpnNegotiated());
320 std::string proto;
321 ssl_socket->GetNextProto(&proto);
322 EXPECT_EQ(SSLClientSocket::NextProtoFromString(proto),
323 SSLClientSocket::kProtoSPDY1);
324 }
325
326 TEST_F(SSLClientSocketPoolTest, DirectGotBonusSPDY) {
327 StaticSocketDataProvider data;
328 socket_factory_.AddSocketDataProvider(&data);
329 SSLSocketDataProvider ssl(true, OK);
330 ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated;
331 ssl.next_proto = "spdy/1";
332 socket_factory_.AddSSLSocketDataProvider(&ssl);
333
334 CreatePool(true /* tcp pool */, false, false);
335 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
336 NULL, 0, false);
337
338 ClientSocketHandle handle;
339 TestCompletionCallback callback;
340 int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
341 EXPECT_EQ(ERR_IO_PENDING, rv);
342 EXPECT_FALSE(handle.is_initialized());
343 EXPECT_FALSE(handle.socket());
344
345 EXPECT_EQ(OK, callback.WaitForResult());
346 EXPECT_TRUE(handle.is_initialized());
347 EXPECT_TRUE(handle.socket());
348
349 SSLClientSocket* ssl_socket = static_cast<SSLClientSocket*>(handle.socket());
350 EXPECT_TRUE(ssl_socket->wasNpnNegotiated());
351 std::string proto;
352 ssl_socket->GetNextProto(&proto);
353 EXPECT_EQ(SSLClientSocket::NextProtoFromString(proto),
354 SSLClientSocket::kProtoSPDY1);
355 }
356
357 TEST_F(SSLClientSocketPoolTest, SOCKSFail) {
358 StaticSocketDataProvider data;
359 data.set_connect_data(MockConnect(false, ERR_CONNECTION_FAILED));
360 socket_factory_.AddSocketDataProvider(&data);
361
362 CreatePool(false, true /* http proxy pool */, true /* socks pool */);
363 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_SOCKS5,
364 NULL, 0, false);
365
366 ClientSocketHandle handle;
367 TestCompletionCallback callback;
368 int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
369 EXPECT_EQ(ERR_CONNECTION_FAILED, rv);
370 EXPECT_FALSE(handle.is_initialized());
371 EXPECT_FALSE(handle.socket());
372 EXPECT_FALSE(handle.is_ssl_error());
373 }
374
375 TEST_F(SSLClientSocketPoolTest, SOCKSFailAsync) {
376 StaticSocketDataProvider data;
377 data.set_connect_data(MockConnect(true, ERR_CONNECTION_FAILED));
378 socket_factory_.AddSocketDataProvider(&data);
379
380 CreatePool(false, true /* http proxy pool */, true /* socks pool */);
381 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_SOCKS5,
382 NULL, 0, false);
383
384 ClientSocketHandle handle;
385 TestCompletionCallback callback;
386 int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
387 EXPECT_EQ(ERR_IO_PENDING, rv);
388 EXPECT_FALSE(handle.is_initialized());
389 EXPECT_FALSE(handle.socket());
390
391 EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult());
392 EXPECT_FALSE(handle.is_initialized());
393 EXPECT_FALSE(handle.socket());
394 EXPECT_FALSE(handle.is_ssl_error());
395 }
396
397 TEST_F(SSLClientSocketPoolTest, SOCKSBasic) {
398 StaticSocketDataProvider data;
399 data.set_connect_data(MockConnect(false, OK));
400 socket_factory_.AddSocketDataProvider(&data);
401 SSLSocketDataProvider ssl(false, OK);
402 socket_factory_.AddSSLSocketDataProvider(&ssl);
403
404 CreatePool(false, true /* http proxy pool */, true /* socks pool */);
405 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_SOCKS5,
406 NULL, 0, false);
407
408 ClientSocketHandle handle;
409 TestCompletionCallback callback;
410 int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
411 EXPECT_EQ(OK, rv);
412 EXPECT_TRUE(handle.is_initialized());
413 EXPECT_TRUE(handle.socket());
414 }
415
416 TEST_F(SSLClientSocketPoolTest, SOCKSBasicAsync) {
417 StaticSocketDataProvider data;
418 socket_factory_.AddSocketDataProvider(&data);
419 SSLSocketDataProvider ssl(true, OK);
420 socket_factory_.AddSSLSocketDataProvider(&ssl);
421
422 CreatePool(false, true /* http proxy pool */, true /* socks pool */);
423 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_SOCKS5,
424 NULL, 0, false);
425
426 ClientSocketHandle handle;
427 TestCompletionCallback callback;
428 int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
429 EXPECT_EQ(ERR_IO_PENDING, rv);
430 EXPECT_FALSE(handle.is_initialized());
431 EXPECT_FALSE(handle.socket());
432
433 EXPECT_EQ(OK, callback.WaitForResult());
434 EXPECT_TRUE(handle.is_initialized());
435 EXPECT_TRUE(handle.socket());
436 }
437
438 TEST_F(SSLClientSocketPoolTest, HttpProxyFail) {
439 StaticSocketDataProvider data;
440 data.set_connect_data(MockConnect(false, ERR_CONNECTION_FAILED));
441 socket_factory_.AddSocketDataProvider(&data);
442
443 CreatePool(false, true /* http proxy pool */, true /* socks pool */);
444 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP,
445 NULL, 0, false);
446
447 ClientSocketHandle handle;
448 TestCompletionCallback callback;
449 int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
450 EXPECT_EQ(ERR_CONNECTION_FAILED, rv);
451 EXPECT_FALSE(handle.is_initialized());
452 EXPECT_FALSE(handle.socket());
453 EXPECT_FALSE(handle.is_ssl_error());
454 }
455
456 TEST_F(SSLClientSocketPoolTest, HttpProxyFailAsync) {
457 StaticSocketDataProvider data;
458 data.set_connect_data(MockConnect(true, ERR_CONNECTION_FAILED));
459 socket_factory_.AddSocketDataProvider(&data);
460
461 CreatePool(false, true /* http proxy pool */, true /* socks pool */);
462 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP,
463 NULL, 0, false);
464
465 ClientSocketHandle handle;
466 TestCompletionCallback callback;
467 int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
468 EXPECT_EQ(ERR_IO_PENDING, rv);
469 EXPECT_FALSE(handle.is_initialized());
470 EXPECT_FALSE(handle.socket());
471
472 EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult());
473 EXPECT_FALSE(handle.is_initialized());
474 EXPECT_FALSE(handle.socket());
475 EXPECT_FALSE(handle.is_ssl_error());
476 }
477
478 TEST_F(SSLClientSocketPoolTest, HttpProxyBasic) {
479 MockWrite writes[] = {
480 MockWrite(false,
481 "CONNECT host:80 HTTP/1.1\r\n"
482 "Host: host\r\n"
483 "Proxy-Connection: keep-alive\r\n"
484 "Proxy-Authorization: Basic Zm9vOmJheg==\r\n\r\n"),
485 };
486 MockRead reads[] = {
487 MockRead(false, "HTTP/1.1 200 Connection Established\r\n\r\n"),
488 };
489 StaticSocketDataProvider data(reads, arraysize(reads), writes,
490 arraysize(writes));
491 data.set_connect_data(MockConnect(false, OK));
492 socket_factory_.AddSocketDataProvider(&data);
493 MockHttpAuthControllerData auth_data[] = {
494 MockHttpAuthControllerData("Proxy-Authorization: Basic Zm9vOmJheg=="),
495 };
496 SSLSocketDataProvider ssl(false, OK);
497 socket_factory_.AddSSLSocketDataProvider(&ssl);
498
499 CreatePool(false, true /* http proxy pool */, true /* socks pool */);
500 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP,
501 auth_data,
502 arraysize(auth_data),
503 false);
504
505 ClientSocketHandle handle;
506 TestCompletionCallback callback;
507 int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
508 EXPECT_EQ(OK, rv);
509 EXPECT_TRUE(handle.is_initialized());
510 EXPECT_TRUE(handle.socket());
511 }
512
513 TEST_F(SSLClientSocketPoolTest, HttpProxyBasicAsync) {
514 MockWrite writes[] = {
515 MockWrite("CONNECT host:80 HTTP/1.1\r\n"
516 "Host: host\r\n"
517 "Proxy-Connection: keep-alive\r\n"
518 "Proxy-Authorization: Basic Zm9vOmJheg==\r\n\r\n"),
519 };
520 MockRead reads[] = {
521 MockRead("HTTP/1.1 200 Connection Established\r\n\r\n"),
522 };
523 StaticSocketDataProvider data(reads, arraysize(reads), writes,
524 arraysize(writes));
525 socket_factory_.AddSocketDataProvider(&data);
526 MockHttpAuthControllerData auth_data[] = {
527 MockHttpAuthControllerData("Proxy-Authorization: Basic Zm9vOmJheg=="),
528 };
529 SSLSocketDataProvider ssl(true, OK);
530 socket_factory_.AddSSLSocketDataProvider(&ssl);
531
532 CreatePool(false, true /* http proxy pool */, true /* socks pool */);
533 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP,
534 auth_data,
535 arraysize(auth_data),
536 false);
537
538 ClientSocketHandle handle;
539 TestCompletionCallback callback;
540 int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
541 EXPECT_EQ(ERR_IO_PENDING, rv);
542 EXPECT_FALSE(handle.is_initialized());
543 EXPECT_FALSE(handle.socket());
544
545 EXPECT_EQ(OK, callback.WaitForResult());
546 EXPECT_TRUE(handle.is_initialized());
547 EXPECT_TRUE(handle.socket());
548 }
549
550 TEST_F(SSLClientSocketPoolTest, NeedProxyAuth) {
551 MockWrite writes[] = {
552 MockWrite("CONNECT host:80 HTTP/1.1\r\n"
553 "Host: host\r\n"
554 "Proxy-Connection: keep-alive\r\n\r\n"),
555 };
556 MockRead reads[] = {
557 MockRead("HTTP/1.1 407 Proxy Authentication Required\r\n"),
558 MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"),
559 MockRead("Content-Length: 10\r\n\r\n"),
560 MockRead("0123456789"),
561 };
562 StaticSocketDataProvider data(reads, arraysize(reads), writes,
563 arraysize(writes));
564 socket_factory_.AddSocketDataProvider(&data);
565 MockHttpAuthControllerData auth_data[] = {
566 MockHttpAuthControllerData(""),
567 };
568 SSLSocketDataProvider ssl(true, OK);
569 socket_factory_.AddSSLSocketDataProvider(&ssl);
570
571 CreatePool(false, true /* http proxy pool */, true /* socks pool */);
572 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP,
573 auth_data,
574 arraysize(auth_data),
575 false);
576
577 ClientSocketHandle handle;
578 TestCompletionCallback callback;
579 int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
580 EXPECT_EQ(ERR_IO_PENDING, rv);
581 EXPECT_FALSE(handle.is_initialized());
582 EXPECT_FALSE(handle.socket());
583
584 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, callback.WaitForResult());
585 EXPECT_FALSE(handle.is_initialized());
586 EXPECT_FALSE(handle.socket());
587 EXPECT_FALSE(handle.is_ssl_error());
588 const HttpResponseInfo& tunnel_info = handle.tunnel_auth_response_info();
589 EXPECT_EQ(tunnel_info.headers->response_code(), 407);
590 }
591
592 TEST_F(SSLClientSocketPoolTest, DoProxyAuth) {
593 MockWrite writes[] = {
594 MockWrite("CONNECT host:80 HTTP/1.1\r\n"
595 "Host: host\r\n"
596 "Proxy-Connection: keep-alive\r\n\r\n"),
597 MockWrite("CONNECT host:80 HTTP/1.1\r\n"
598 "Host: host\r\n"
599 "Proxy-Connection: keep-alive\r\n"
600 "Proxy-Authorization: Basic Zm9vOmJheg==\r\n\r\n"),
601 };
602 MockRead reads[] = {
603 MockRead("HTTP/1.1 407 Proxy Authentication Required\r\n"),
604 MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"),
605 MockRead("Content-Length: 10\r\n\r\n"),
606 MockRead("0123456789"),
607 MockRead("HTTP/1.1 200 Connection Established\r\n\r\n"),
608 };
609 StaticSocketDataProvider data(reads, arraysize(reads), writes,
610 arraysize(writes));
611 socket_factory_.AddSocketDataProvider(&data);
612 MockHttpAuthControllerData auth_data[] = {
613 MockHttpAuthControllerData(""),
614 MockHttpAuthControllerData("Proxy-Authorization: Basic Zm9vOmJheg=="),
615 };
616 SSLSocketDataProvider ssl(true, OK);
617 socket_factory_.AddSSLSocketDataProvider(&ssl);
618
619 CreatePool(false, true /* http proxy pool */, true /* socks pool */);
620 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP,
621 auth_data,
622 arraysize(auth_data),
623 false);
624
625 ClientSocketHandle handle;
626 TestCompletionCallback callback;
627 int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
628 EXPECT_EQ(ERR_IO_PENDING, rv);
629 EXPECT_FALSE(handle.is_initialized());
630 EXPECT_FALSE(handle.socket());
631
632 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, callback.WaitForResult());
633 EXPECT_FALSE(handle.is_initialized());
634 EXPECT_FALSE(handle.socket());
635 EXPECT_FALSE(handle.is_ssl_error());
636 const HttpResponseInfo& tunnel_info = handle.tunnel_auth_response_info();
637 EXPECT_EQ(tunnel_info.headers->response_code(), 407);
638
639 params->http_proxy_params()->auth_controller()->ResetAuth(std::wstring(),
640 std::wstring());
641 rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
642 EXPECT_EQ(ERR_IO_PENDING, rv);
643 EXPECT_FALSE(handle.is_initialized());
644 EXPECT_FALSE(handle.socket());
645
646 EXPECT_EQ(OK, callback.WaitForResult());
647 EXPECT_TRUE(handle.is_initialized());
648 EXPECT_TRUE(handle.socket());
649 }
650
651 TEST_F(SSLClientSocketPoolTest, DoProxyAuthNoKeepAlive) {
652 MockWrite writes1[] = {
653 MockWrite("CONNECT host:80 HTTP/1.1\r\n"
654 "Host: host\r\n"
655 "Proxy-Connection: keep-alive\r\n\r\n"),
656 };
657 MockWrite writes2[] = {
658 MockWrite("CONNECT host:80 HTTP/1.1\r\n"
659 "Host: host\r\n"
660 "Proxy-Connection: keep-alive\r\n"
661 "Proxy-Authorization: Basic Zm9vOmJheg==\r\n\r\n"),
662 };
663 MockRead reads1[] = {
664 MockRead("HTTP/1.1 407 Proxy Authentication Required\r\n"),
665 MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n\r\n"),
666 MockRead("Content0123456789"),
667 };
668 MockRead reads2[] = {
669 MockRead("HTTP/1.1 200 Connection Established\r\n\r\n"),
670 };
671 StaticSocketDataProvider data1(reads1, arraysize(reads1), writes1,
672 arraysize(writes1));
673 socket_factory_.AddSocketDataProvider(&data1);
674 StaticSocketDataProvider data2(reads2, arraysize(reads2), writes2,
675 arraysize(writes2));
676 socket_factory_.AddSocketDataProvider(&data2);
677 MockHttpAuthControllerData auth_data[] = {
678 MockHttpAuthControllerData(""),
679 MockHttpAuthControllerData("Proxy-Authorization: Basic Zm9vOmJheg=="),
680 };
681 SSLSocketDataProvider ssl(true, OK);
682 socket_factory_.AddSSLSocketDataProvider(&ssl);
683
684 CreatePool(false, true /* http proxy pool */, true /* socks pool */);
685 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP,
686 auth_data,
687 arraysize(auth_data),
688 false);
689
690 ClientSocketHandle handle;
691 TestCompletionCallback callback;
692 int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
693 EXPECT_EQ(ERR_IO_PENDING, rv);
694 EXPECT_FALSE(handle.is_initialized());
695 EXPECT_FALSE(handle.socket());
696
697 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, callback.WaitForResult());
698 EXPECT_FALSE(handle.is_initialized());
699 EXPECT_FALSE(handle.socket());
700 EXPECT_FALSE(handle.is_ssl_error());
701 const HttpResponseInfo& tunnel_info = handle.tunnel_auth_response_info();
702 EXPECT_EQ(tunnel_info.headers->response_code(), 407);
703
704 params->http_proxy_params()->auth_controller()->ResetAuth(std::wstring(),
705 std::wstring());
706 rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
707 EXPECT_EQ(ERR_IO_PENDING, rv);
708 EXPECT_FALSE(handle.is_initialized());
709 EXPECT_FALSE(handle.socket());
710
711 EXPECT_EQ(OK, callback.WaitForResult());
712 EXPECT_TRUE(handle.is_initialized());
713 EXPECT_TRUE(handle.socket());
714 }
715
716 // It would be nice to also test the timeouts in SSLClientSocketPool.
717
718 } // namespace
719
720 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698