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/proxy_delegate.h" | |
12 #include "net/base/test_completion_callback.h" | 13 #include "net/base/test_completion_callback.h" |
13 #include "net/http/http_network_session.h" | 14 #include "net/http/http_network_session.h" |
14 #include "net/http/http_proxy_client_socket.h" | 15 #include "net/http/http_proxy_client_socket.h" |
15 #include "net/http/http_response_headers.h" | 16 #include "net/http/http_response_headers.h" |
16 #include "net/socket/client_socket_handle.h" | 17 #include "net/socket/client_socket_handle.h" |
17 #include "net/socket/client_socket_pool_histograms.h" | 18 #include "net/socket/client_socket_pool_histograms.h" |
18 #include "net/socket/next_proto.h" | 19 #include "net/socket/next_proto.h" |
19 #include "net/socket/socket_test_util.h" | 20 #include "net/socket/socket_test_util.h" |
20 #include "net/spdy/spdy_protocol.h" | 21 #include "net/spdy/spdy_protocol.h" |
21 #include "net/spdy/spdy_test_util_common.h" | 22 #include "net/spdy/spdy_test_util_common.h" |
(...skipping 29 matching lines...) Expand all Loading... | |
51 | 52 |
52 HttpProxyType proxy_type; | 53 HttpProxyType proxy_type; |
53 NextProto protocol; | 54 NextProto protocol; |
54 }; | 55 }; |
55 | 56 |
56 typedef ::testing::TestWithParam<HttpProxyType> TestWithHttpParam; | 57 typedef ::testing::TestWithParam<HttpProxyType> TestWithHttpParam; |
57 | 58 |
58 const char kHttpProxyHost[] = "httpproxy.example.com"; | 59 const char kHttpProxyHost[] = "httpproxy.example.com"; |
59 const char kHttpsProxyHost[] = "httpsproxy.example.com"; | 60 const char kHttpsProxyHost[] = "httpsproxy.example.com"; |
60 | 61 |
62 class TestProxyDelegate : public ProxyDelegate { | |
63 public: | |
64 TestProxyDelegate() | |
65 : on_before_tunnel_request_called_(false), | |
66 on_tunnel_headers_received_called_(false) { | |
67 } | |
68 | |
69 virtual ~TestProxyDelegate() OVERRIDE { | |
70 } | |
71 | |
72 bool on_before_tunnel_request_called() const { | |
73 return on_before_tunnel_request_called_; | |
74 } | |
75 | |
76 bool on_tunnel_headers_received_called() const { | |
77 return on_tunnel_headers_received_called_; | |
78 } | |
79 | |
80 void VerifyOnTunnelHeadersReceived(const std::string& origin, | |
81 const std::string& proxy_server, | |
82 const std::string& status_line) const { | |
83 EXPECT_TRUE(on_tunnel_headers_received_called_); | |
84 EXPECT_TRUE(HostPortPair::FromString(origin).Equals( | |
85 on_tunnel_headers_received_origin_)); | |
86 EXPECT_TRUE(HostPortPair::FromString(proxy_server).Equals( | |
87 on_tunnel_headers_received_proxy_server_)); | |
88 EXPECT_EQ(status_line, on_tunnel_headers_received_status_line_); | |
89 } | |
90 | |
91 // ProxyDelegate: | |
92 virtual void OnResolveProxy(const GURL& url, | |
93 int load_flags, | |
94 const ProxyService& proxy_service, | |
95 ProxyInfo* result) OVERRIDE { | |
96 } | |
97 | |
98 virtual void OnFallback(const ProxyServer& bad_proxy, | |
99 int net_error) OVERRIDE { | |
100 } | |
101 | |
102 virtual void OnBeforeSendHeaders(URLRequest* request, | |
103 const ProxyInfo& proxy_info, | |
104 HttpRequestHeaders* headers) OVERRIDE { | |
105 } | |
106 | |
107 virtual void OnBeforeTunnelRequest( | |
108 const net::HostPortPair& proxy_server, | |
109 net::HttpRequestHeaders* extra_headers) OVERRIDE { | |
110 on_before_tunnel_request_called_ = true; | |
111 if (extra_headers) { | |
112 extra_headers->SetHeader("Foo", proxy_server.ToString()); | |
113 } | |
114 } | |
115 | |
116 virtual void OnTunnelHeadersReceived( | |
117 const net::HostPortPair& origin, | |
118 const net::HostPortPair& proxy_server, | |
119 const net::HttpResponseHeaders& response_headers) OVERRIDE { | |
120 on_tunnel_headers_received_called_ = true; | |
121 on_tunnel_headers_received_origin_ = origin; | |
122 on_tunnel_headers_received_proxy_server_ = proxy_server; | |
123 on_tunnel_headers_received_status_line_ = response_headers.GetStatusLine(); | |
124 } | |
125 | |
126 private: | |
127 bool on_before_tunnel_request_called_; | |
128 bool on_tunnel_headers_received_called_; | |
129 HostPortPair on_tunnel_headers_received_origin_; | |
130 HostPortPair on_tunnel_headers_received_proxy_server_; | |
131 std::string on_tunnel_headers_received_status_line_; | |
132 }; | |
133 | |
134 | |
61 class HttpProxyClientSocketPoolTest | 135 class HttpProxyClientSocketPoolTest |
62 : public ::testing::TestWithParam<HttpProxyClientSocketPoolTestParams> { | 136 : public ::testing::TestWithParam<HttpProxyClientSocketPoolTestParams> { |
63 protected: | 137 protected: |
64 HttpProxyClientSocketPoolTest() | 138 HttpProxyClientSocketPoolTest() |
65 : session_deps_(GetParam().protocol), | 139 : session_deps_(GetParam().protocol), |
66 tcp_histograms_("MockTCP"), | 140 tcp_histograms_("MockTCP"), |
67 transport_socket_pool_( | 141 transport_socket_pool_( |
68 kMaxSockets, | 142 kMaxSockets, |
69 kMaxSocketsPerGroup, | 143 kMaxSocketsPerGroup, |
70 &tcp_histograms_, | 144 &tcp_histograms_, |
(...skipping 17 matching lines...) Expand all Loading... | |
88 BoundNetLog().net_log()), | 162 BoundNetLog().net_log()), |
89 session_(CreateNetworkSession()), | 163 session_(CreateNetworkSession()), |
90 http_proxy_histograms_("HttpProxyUnitTest"), | 164 http_proxy_histograms_("HttpProxyUnitTest"), |
91 spdy_util_(GetParam().protocol), | 165 spdy_util_(GetParam().protocol), |
92 pool_(kMaxSockets, | 166 pool_(kMaxSockets, |
93 kMaxSocketsPerGroup, | 167 kMaxSocketsPerGroup, |
94 &http_proxy_histograms_, | 168 &http_proxy_histograms_, |
95 NULL, | 169 NULL, |
96 &transport_socket_pool_, | 170 &transport_socket_pool_, |
97 &ssl_socket_pool_, | 171 &ssl_socket_pool_, |
172 NULL, | |
98 NULL) {} | 173 NULL) {} |
99 | 174 |
100 virtual ~HttpProxyClientSocketPoolTest() { | 175 virtual ~HttpProxyClientSocketPoolTest() { |
101 } | 176 } |
102 | 177 |
103 void AddAuthToCache() { | 178 void AddAuthToCache() { |
104 const base::string16 kFoo(base::ASCIIToUTF16("foo")); | 179 const base::string16 kFoo(base::ASCIIToUTF16("foo")); |
105 const base::string16 kBar(base::ASCIIToUTF16("bar")); | 180 const base::string16 kBar(base::ASCIIToUTF16("bar")); |
106 GURL proxy_url(GetParam().proxy_type == HTTP ? | 181 GURL proxy_url(GetParam().proxy_type == HTTP ? |
107 (std::string("http://") + kHttpProxyHost) : | 182 (std::string("http://") + kHttpProxyHost) : |
(...skipping 29 matching lines...) Expand all Loading... | |
137 HostPortPair(kHttpsProxyHost, 443), | 212 HostPortPair(kHttpsProxyHost, 443), |
138 SSLConfig(), | 213 SSLConfig(), |
139 PRIVACY_MODE_DISABLED, | 214 PRIVACY_MODE_DISABLED, |
140 0, | 215 0, |
141 false, | 216 false, |
142 false); | 217 false); |
143 } | 218 } |
144 | 219 |
145 // Returns the a correctly constructed HttpProxyParms | 220 // Returns the a correctly constructed HttpProxyParms |
146 // for the HTTP or HTTPS proxy. | 221 // for the HTTP or HTTPS proxy. |
147 scoped_refptr<HttpProxySocketParams> CreateParams(bool tunnel) { | 222 scoped_refptr<HttpProxySocketParams> CreateParams( |
223 bool tunnel, | |
224 ProxyDelegate* proxy_delegate) { | |
148 return scoped_refptr<HttpProxySocketParams>(new HttpProxySocketParams( | 225 return scoped_refptr<HttpProxySocketParams>(new HttpProxySocketParams( |
149 CreateHttpProxyParams(), | 226 CreateHttpProxyParams(), |
150 CreateHttpsProxyParams(), | 227 CreateHttpsProxyParams(), |
151 GURL(tunnel ? "https://www.google.com/" : "http://www.google.com"), | 228 GURL(tunnel ? "https://www.google.com/" : "http://www.google.com"), |
152 std::string(), | 229 std::string(), |
153 HostPortPair("www.google.com", tunnel ? 443 : 80), | 230 HostPortPair("www.google.com", tunnel ? 443 : 80), |
154 session_->http_auth_cache(), | 231 session_->http_auth_cache(), |
155 session_->http_auth_handler_factory(), | 232 session_->http_auth_handler_factory(), |
156 session_->spdy_session_pool(), | 233 session_->spdy_session_pool(), |
157 tunnel)); | 234 tunnel, |
235 proxy_delegate)); | |
158 } | 236 } |
159 | 237 |
160 scoped_refptr<HttpProxySocketParams> CreateTunnelParams() { | 238 scoped_refptr<HttpProxySocketParams> CreateTunnelParams( |
161 return CreateParams(true); | 239 ProxyDelegate* proxy_delegate) { |
240 return CreateParams(true, proxy_delegate); | |
162 } | 241 } |
163 | 242 |
164 scoped_refptr<HttpProxySocketParams> CreateNoTunnelParams() { | 243 scoped_refptr<HttpProxySocketParams> CreateNoTunnelParams( |
165 return CreateParams(false); | 244 ProxyDelegate* proxy_delegate) { |
245 return CreateParams(false, proxy_delegate); | |
166 } | 246 } |
167 | 247 |
168 DeterministicMockClientSocketFactory* socket_factory() { | 248 DeterministicMockClientSocketFactory* socket_factory() { |
169 return session_deps_.deterministic_socket_factory.get(); | 249 return session_deps_.deterministic_socket_factory.get(); |
170 } | 250 } |
171 | 251 |
172 void Initialize(MockRead* reads, size_t reads_count, | 252 void Initialize(MockRead* reads, size_t reads_count, |
173 MockWrite* writes, size_t writes_count, | 253 MockWrite* writes, size_t writes_count, |
174 MockRead* spdy_reads, size_t spdy_reads_count, | 254 MockRead* spdy_reads, size_t spdy_reads_count, |
175 MockWrite* spdy_writes, size_t spdy_writes_count) { | 255 MockWrite* spdy_writes, size_t spdy_writes_count) { |
(...skipping 25 matching lines...) Expand all Loading... | |
201 | 281 |
202 HttpNetworkSession* CreateNetworkSession() { | 282 HttpNetworkSession* CreateNetworkSession() { |
203 return SpdySessionDependencies::SpdyCreateSessionDeterministic( | 283 return SpdySessionDependencies::SpdyCreateSessionDeterministic( |
204 &session_deps_); | 284 &session_deps_); |
205 } | 285 } |
206 | 286 |
207 RequestPriority GetLastTransportRequestPriority() const { | 287 RequestPriority GetLastTransportRequestPriority() const { |
208 return transport_socket_pool_.last_request_priority(); | 288 return transport_socket_pool_.last_request_priority(); |
209 } | 289 } |
210 | 290 |
291 | |
mef
2014/09/10 15:05:25
nit: spurious nl.
bengr
2014/09/10 19:18:59
Done.
| |
211 private: | 292 private: |
212 SpdySessionDependencies session_deps_; | 293 SpdySessionDependencies session_deps_; |
213 | 294 |
214 ClientSocketPoolHistograms tcp_histograms_; | 295 ClientSocketPoolHistograms tcp_histograms_; |
215 MockTransportClientSocketPool transport_socket_pool_; | 296 MockTransportClientSocketPool transport_socket_pool_; |
216 ClientSocketPoolHistograms ssl_histograms_; | 297 ClientSocketPoolHistograms ssl_histograms_; |
217 MockHostResolver host_resolver_; | 298 MockHostResolver host_resolver_; |
218 scoped_ptr<CertVerifier> cert_verifier_; | 299 scoped_ptr<CertVerifier> cert_verifier_; |
219 SSLClientSocketPool ssl_socket_pool_; | 300 SSLClientSocketPool ssl_socket_pool_; |
220 | 301 |
(...skipping 28 matching lines...) Expand all Loading... | |
249 HttpProxyClientSocketPoolTestParams(HTTP, kProtoSPDY31), | 330 HttpProxyClientSocketPoolTestParams(HTTP, kProtoSPDY31), |
250 HttpProxyClientSocketPoolTestParams(HTTPS, kProtoSPDY31), | 331 HttpProxyClientSocketPoolTestParams(HTTPS, kProtoSPDY31), |
251 HttpProxyClientSocketPoolTestParams(SPDY, kProtoSPDY31), | 332 HttpProxyClientSocketPoolTestParams(SPDY, kProtoSPDY31), |
252 HttpProxyClientSocketPoolTestParams(HTTP, kProtoSPDY4), | 333 HttpProxyClientSocketPoolTestParams(HTTP, kProtoSPDY4), |
253 HttpProxyClientSocketPoolTestParams(HTTPS, kProtoSPDY4), | 334 HttpProxyClientSocketPoolTestParams(HTTPS, kProtoSPDY4), |
254 HttpProxyClientSocketPoolTestParams(SPDY, kProtoSPDY4))); | 335 HttpProxyClientSocketPoolTestParams(SPDY, kProtoSPDY4))); |
255 | 336 |
256 TEST_P(HttpProxyClientSocketPoolTest, NoTunnel) { | 337 TEST_P(HttpProxyClientSocketPoolTest, NoTunnel) { |
257 Initialize(NULL, 0, NULL, 0, NULL, 0, NULL, 0); | 338 Initialize(NULL, 0, NULL, 0, NULL, 0, NULL, 0); |
258 | 339 |
259 int rv = handle_.Init("a", CreateNoTunnelParams(), LOW, CompletionCallback(), | 340 scoped_ptr<TestProxyDelegate> proxy_delegate(new TestProxyDelegate()); |
260 &pool_, BoundNetLog()); | 341 int rv = handle_.Init("a", CreateNoTunnelParams(proxy_delegate.get()), LOW, |
342 CompletionCallback(), &pool_, BoundNetLog()); | |
261 EXPECT_EQ(OK, rv); | 343 EXPECT_EQ(OK, rv); |
262 EXPECT_TRUE(handle_.is_initialized()); | 344 EXPECT_TRUE(handle_.is_initialized()); |
263 ASSERT_TRUE(handle_.socket()); | 345 ASSERT_TRUE(handle_.socket()); |
264 HttpProxyClientSocket* tunnel_socket = | 346 HttpProxyClientSocket* tunnel_socket = |
265 static_cast<HttpProxyClientSocket*>(handle_.socket()); | 347 static_cast<HttpProxyClientSocket*>(handle_.socket()); |
266 EXPECT_TRUE(tunnel_socket->IsConnected()); | 348 EXPECT_TRUE(tunnel_socket->IsConnected()); |
349 EXPECT_FALSE(proxy_delegate->on_before_tunnel_request_called()); | |
350 EXPECT_FALSE(proxy_delegate->on_tunnel_headers_received_called()); | |
267 } | 351 } |
268 | 352 |
269 // Make sure that HttpProxyConnectJob passes on its priority to its | 353 // Make sure that HttpProxyConnectJob passes on its priority to its |
270 // (non-SSL) socket request on Init. | 354 // (non-SSL) socket request on Init. |
271 TEST_P(HttpProxyClientSocketPoolTest, SetSocketRequestPriorityOnInit) { | 355 TEST_P(HttpProxyClientSocketPoolTest, SetSocketRequestPriorityOnInit) { |
272 Initialize(NULL, 0, NULL, 0, NULL, 0, NULL, 0); | 356 Initialize(NULL, 0, NULL, 0, NULL, 0, NULL, 0); |
273 EXPECT_EQ(OK, | 357 EXPECT_EQ(OK, |
274 handle_.Init("a", CreateNoTunnelParams(), HIGHEST, | 358 handle_.Init("a", CreateNoTunnelParams(NULL), HIGHEST, |
275 CompletionCallback(), &pool_, BoundNetLog())); | 359 CompletionCallback(), &pool_, BoundNetLog())); |
276 EXPECT_EQ(HIGHEST, GetLastTransportRequestPriority()); | 360 EXPECT_EQ(HIGHEST, GetLastTransportRequestPriority()); |
277 } | 361 } |
278 | 362 |
279 TEST_P(HttpProxyClientSocketPoolTest, NeedAuth) { | 363 TEST_P(HttpProxyClientSocketPoolTest, NeedAuth) { |
280 MockWrite writes[] = { | 364 MockWrite writes[] = { |
281 MockWrite(ASYNC, 0, "CONNECT www.google.com:443 HTTP/1.1\r\n" | 365 MockWrite(ASYNC, 0, "CONNECT www.google.com:443 HTTP/1.1\r\n" |
282 "Host: www.google.com\r\n" | 366 "Host: www.google.com\r\n" |
283 "Proxy-Connection: keep-alive\r\n\r\n"), | 367 "Proxy-Connection: keep-alive\r\n\r\n"), |
284 }; | 368 }; |
(...skipping 21 matching lines...) Expand all Loading... | |
306 MockRead spdy_reads[] = { | 390 MockRead spdy_reads[] = { |
307 CreateMockRead(*resp, 1, ASYNC), | 391 CreateMockRead(*resp, 1, ASYNC), |
308 MockRead(ASYNC, 0, 3) | 392 MockRead(ASYNC, 0, 3) |
309 }; | 393 }; |
310 | 394 |
311 Initialize(reads, arraysize(reads), writes, arraysize(writes), | 395 Initialize(reads, arraysize(reads), writes, arraysize(writes), |
312 spdy_reads, arraysize(spdy_reads), spdy_writes, | 396 spdy_reads, arraysize(spdy_reads), spdy_writes, |
313 arraysize(spdy_writes)); | 397 arraysize(spdy_writes)); |
314 | 398 |
315 data_->StopAfter(4); | 399 data_->StopAfter(4); |
316 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), | 400 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, |
317 &pool_, BoundNetLog()); | 401 callback_.callback(), &pool_, BoundNetLog()); |
318 EXPECT_EQ(ERR_IO_PENDING, rv); | 402 EXPECT_EQ(ERR_IO_PENDING, rv); |
319 EXPECT_FALSE(handle_.is_initialized()); | 403 EXPECT_FALSE(handle_.is_initialized()); |
320 EXPECT_FALSE(handle_.socket()); | 404 EXPECT_FALSE(handle_.socket()); |
321 | 405 |
322 data_->RunFor(GetParam().proxy_type == SPDY ? 2 : 4); | 406 data_->RunFor(GetParam().proxy_type == SPDY ? 2 : 4); |
323 rv = callback_.WaitForResult(); | 407 rv = callback_.WaitForResult(); |
324 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, rv); | 408 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, rv); |
325 EXPECT_TRUE(handle_.is_initialized()); | 409 EXPECT_TRUE(handle_.is_initialized()); |
326 ASSERT_TRUE(handle_.socket()); | 410 ASSERT_TRUE(handle_.socket()); |
327 ProxyClientSocket* tunnel_socket = | 411 ProxyClientSocket* tunnel_socket = |
(...skipping 10 matching lines...) Expand all Loading... | |
338 TEST_P(HttpProxyClientSocketPoolTest, HaveAuth) { | 422 TEST_P(HttpProxyClientSocketPoolTest, HaveAuth) { |
339 // It's pretty much impossible to make the SPDY case behave synchronously | 423 // It's pretty much impossible to make the SPDY case behave synchronously |
340 // so we skip this test for SPDY | 424 // so we skip this test for SPDY |
341 if (GetParam().proxy_type == SPDY) | 425 if (GetParam().proxy_type == SPDY) |
342 return; | 426 return; |
343 MockWrite writes[] = { | 427 MockWrite writes[] = { |
344 MockWrite(SYNCHRONOUS, 0, | 428 MockWrite(SYNCHRONOUS, 0, |
345 "CONNECT www.google.com:443 HTTP/1.1\r\n" | 429 "CONNECT www.google.com:443 HTTP/1.1\r\n" |
346 "Host: www.google.com\r\n" | 430 "Host: www.google.com\r\n" |
347 "Proxy-Connection: keep-alive\r\n" | 431 "Proxy-Connection: keep-alive\r\n" |
348 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 432 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n" |
433 "Foo: httpproxy.example.com:80\r\n\r\n"), | |
349 }; | 434 }; |
350 MockRead reads[] = { | 435 MockRead reads[] = { |
351 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 Connection Established\r\n\r\n"), | 436 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 Connection Established\r\n\r\n"), |
352 }; | 437 }; |
353 | 438 |
354 Initialize(reads, arraysize(reads), writes, arraysize(writes), NULL, 0, | 439 Initialize(reads, arraysize(reads), writes, arraysize(writes), NULL, 0, |
355 NULL, 0); | 440 NULL, 0); |
356 AddAuthToCache(); | 441 AddAuthToCache(); |
357 | 442 |
358 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), | 443 scoped_ptr<TestProxyDelegate> proxy_delegate(new TestProxyDelegate()); |
359 &pool_, BoundNetLog()); | 444 int rv = handle_.Init("a", CreateTunnelParams(proxy_delegate.get()), LOW, |
445 callback_.callback(), &pool_, BoundNetLog()); | |
360 EXPECT_EQ(OK, rv); | 446 EXPECT_EQ(OK, rv); |
361 EXPECT_TRUE(handle_.is_initialized()); | 447 EXPECT_TRUE(handle_.is_initialized()); |
362 ASSERT_TRUE(handle_.socket()); | 448 ASSERT_TRUE(handle_.socket()); |
363 HttpProxyClientSocket* tunnel_socket = | 449 HttpProxyClientSocket* tunnel_socket = |
364 static_cast<HttpProxyClientSocket*>(handle_.socket()); | 450 static_cast<HttpProxyClientSocket*>(handle_.socket()); |
365 EXPECT_TRUE(tunnel_socket->IsConnected()); | 451 EXPECT_TRUE(tunnel_socket->IsConnected()); |
452 proxy_delegate->VerifyOnTunnelHeadersReceived( | |
453 "www.google.com:443", | |
454 "httpproxy.example.com:80", | |
455 "HTTP/1.1 200 Connection Established"); | |
366 } | 456 } |
367 | 457 |
368 TEST_P(HttpProxyClientSocketPoolTest, AsyncHaveAuth) { | 458 TEST_P(HttpProxyClientSocketPoolTest, AsyncHaveAuth) { |
369 MockWrite writes[] = { | 459 MockWrite writes[] = { |
370 MockWrite(ASYNC, 0, "CONNECT www.google.com:443 HTTP/1.1\r\n" | 460 MockWrite(ASYNC, 0, "CONNECT www.google.com:443 HTTP/1.1\r\n" |
371 "Host: www.google.com\r\n" | 461 "Host: www.google.com\r\n" |
372 "Proxy-Connection: keep-alive\r\n" | 462 "Proxy-Connection: keep-alive\r\n" |
373 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 463 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), |
374 }; | 464 }; |
375 MockRead reads[] = { | 465 MockRead reads[] = { |
376 MockRead(ASYNC, 1, "HTTP/1.1 200 Connection Established\r\n\r\n"), | 466 MockRead(ASYNC, 1, "HTTP/1.1 200 Connection Established\r\n\r\n"), |
377 }; | 467 }; |
378 | 468 |
379 scoped_ptr<SpdyFrame> req( | 469 scoped_ptr<SpdyFrame> req( |
380 spdy_util_.ConstructSpdyConnect(kAuthHeaders, kAuthHeadersSize, 1, LOW)); | 470 spdy_util_.ConstructSpdyConnect(kAuthHeaders, kAuthHeadersSize, 1, LOW)); |
381 MockWrite spdy_writes[] = { | 471 MockWrite spdy_writes[] = { |
382 CreateMockWrite(*req, 0, ASYNC) | 472 CreateMockWrite(*req, 0, ASYNC) |
383 }; | 473 }; |
384 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 474 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
385 MockRead spdy_reads[] = { | 475 MockRead spdy_reads[] = { |
386 CreateMockRead(*resp, 1, ASYNC), | 476 CreateMockRead(*resp, 1, ASYNC), |
387 MockRead(ASYNC, 0, 2) | 477 MockRead(ASYNC, 0, 2) |
388 }; | 478 }; |
389 | 479 |
390 Initialize(reads, arraysize(reads), writes, arraysize(writes), | 480 Initialize(reads, arraysize(reads), writes, arraysize(writes), |
391 spdy_reads, arraysize(spdy_reads), spdy_writes, | 481 spdy_reads, arraysize(spdy_reads), spdy_writes, |
392 arraysize(spdy_writes)); | 482 arraysize(spdy_writes)); |
393 AddAuthToCache(); | 483 AddAuthToCache(); |
394 | 484 |
395 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), | 485 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, |
396 &pool_, BoundNetLog()); | 486 callback_.callback(), &pool_, BoundNetLog()); |
397 EXPECT_EQ(ERR_IO_PENDING, rv); | 487 EXPECT_EQ(ERR_IO_PENDING, rv); |
398 EXPECT_FALSE(handle_.is_initialized()); | 488 EXPECT_FALSE(handle_.is_initialized()); |
399 EXPECT_FALSE(handle_.socket()); | 489 EXPECT_FALSE(handle_.socket()); |
400 | 490 |
401 data_->RunFor(2); | 491 data_->RunFor(2); |
402 EXPECT_EQ(OK, callback_.WaitForResult()); | 492 EXPECT_EQ(OK, callback_.WaitForResult()); |
403 EXPECT_TRUE(handle_.is_initialized()); | 493 EXPECT_TRUE(handle_.is_initialized()); |
404 ASSERT_TRUE(handle_.socket()); | 494 ASSERT_TRUE(handle_.socket()); |
405 HttpProxyClientSocket* tunnel_socket = | 495 HttpProxyClientSocket* tunnel_socket = |
406 static_cast<HttpProxyClientSocket*>(handle_.socket()); | 496 static_cast<HttpProxyClientSocket*>(handle_.socket()); |
(...skipping 18 matching lines...) Expand all Loading... | |
425 CreateMockRead(*resp, 1, ASYNC), | 515 CreateMockRead(*resp, 1, ASYNC), |
426 MockRead(ASYNC, 0, 2) | 516 MockRead(ASYNC, 0, 2) |
427 }; | 517 }; |
428 | 518 |
429 Initialize(NULL, 0, NULL, 0, | 519 Initialize(NULL, 0, NULL, 0, |
430 spdy_reads, arraysize(spdy_reads), | 520 spdy_reads, arraysize(spdy_reads), |
431 spdy_writes, arraysize(spdy_writes)); | 521 spdy_writes, arraysize(spdy_writes)); |
432 AddAuthToCache(); | 522 AddAuthToCache(); |
433 | 523 |
434 EXPECT_EQ(ERR_IO_PENDING, | 524 EXPECT_EQ(ERR_IO_PENDING, |
435 handle_.Init("a", CreateTunnelParams(), MEDIUM, | 525 handle_.Init("a", CreateTunnelParams(NULL), MEDIUM, |
436 callback_.callback(), &pool_, BoundNetLog())); | 526 callback_.callback(), &pool_, BoundNetLog())); |
437 EXPECT_EQ(MEDIUM, GetLastTransportRequestPriority()); | 527 EXPECT_EQ(MEDIUM, GetLastTransportRequestPriority()); |
438 | 528 |
439 data_->RunFor(2); | 529 data_->RunFor(2); |
440 EXPECT_EQ(OK, callback_.WaitForResult()); | 530 EXPECT_EQ(OK, callback_.WaitForResult()); |
441 } | 531 } |
442 | 532 |
443 TEST_P(HttpProxyClientSocketPoolTest, TCPError) { | 533 TEST_P(HttpProxyClientSocketPoolTest, TCPError) { |
444 if (GetParam().proxy_type == SPDY) return; | 534 if (GetParam().proxy_type == SPDY) return; |
445 data_.reset(new DeterministicSocketData(NULL, 0, NULL, 0)); | 535 data_.reset(new DeterministicSocketData(NULL, 0, NULL, 0)); |
446 data_->set_connect_data(MockConnect(ASYNC, ERR_CONNECTION_CLOSED)); | 536 data_->set_connect_data(MockConnect(ASYNC, ERR_CONNECTION_CLOSED)); |
447 | 537 |
448 socket_factory()->AddSocketDataProvider(data_.get()); | 538 socket_factory()->AddSocketDataProvider(data_.get()); |
449 | 539 |
450 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), | 540 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, |
451 &pool_, BoundNetLog()); | 541 callback_.callback(), &pool_, BoundNetLog()); |
452 EXPECT_EQ(ERR_IO_PENDING, rv); | 542 EXPECT_EQ(ERR_IO_PENDING, rv); |
453 EXPECT_FALSE(handle_.is_initialized()); | 543 EXPECT_FALSE(handle_.is_initialized()); |
454 EXPECT_FALSE(handle_.socket()); | 544 EXPECT_FALSE(handle_.socket()); |
455 | 545 |
456 EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, callback_.WaitForResult()); | 546 EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, callback_.WaitForResult()); |
457 | 547 |
458 EXPECT_FALSE(handle_.is_initialized()); | 548 EXPECT_FALSE(handle_.is_initialized()); |
459 EXPECT_FALSE(handle_.socket()); | 549 EXPECT_FALSE(handle_.socket()); |
460 } | 550 } |
461 | 551 |
462 TEST_P(HttpProxyClientSocketPoolTest, SSLError) { | 552 TEST_P(HttpProxyClientSocketPoolTest, SSLError) { |
463 if (GetParam().proxy_type == HTTP) return; | 553 if (GetParam().proxy_type == HTTP) return; |
464 data_.reset(new DeterministicSocketData(NULL, 0, NULL, 0)); | 554 data_.reset(new DeterministicSocketData(NULL, 0, NULL, 0)); |
465 data_->set_connect_data(MockConnect(ASYNC, OK)); | 555 data_->set_connect_data(MockConnect(ASYNC, OK)); |
466 socket_factory()->AddSocketDataProvider(data_.get()); | 556 socket_factory()->AddSocketDataProvider(data_.get()); |
467 | 557 |
468 ssl_data_.reset(new SSLSocketDataProvider(ASYNC, | 558 ssl_data_.reset(new SSLSocketDataProvider(ASYNC, |
469 ERR_CERT_AUTHORITY_INVALID)); | 559 ERR_CERT_AUTHORITY_INVALID)); |
470 if (GetParam().proxy_type == SPDY) { | 560 if (GetParam().proxy_type == SPDY) { |
471 InitializeSpdySsl(); | 561 InitializeSpdySsl(); |
472 } | 562 } |
473 socket_factory()->AddSSLSocketDataProvider(ssl_data_.get()); | 563 socket_factory()->AddSSLSocketDataProvider(ssl_data_.get()); |
474 | 564 |
475 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), | 565 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, |
476 &pool_, BoundNetLog()); | 566 callback_.callback(), &pool_, BoundNetLog()); |
477 EXPECT_EQ(ERR_IO_PENDING, rv); | 567 EXPECT_EQ(ERR_IO_PENDING, rv); |
478 EXPECT_FALSE(handle_.is_initialized()); | 568 EXPECT_FALSE(handle_.is_initialized()); |
479 EXPECT_FALSE(handle_.socket()); | 569 EXPECT_FALSE(handle_.socket()); |
480 | 570 |
481 EXPECT_EQ(ERR_PROXY_CERTIFICATE_INVALID, callback_.WaitForResult()); | 571 EXPECT_EQ(ERR_PROXY_CERTIFICATE_INVALID, callback_.WaitForResult()); |
482 | 572 |
483 EXPECT_FALSE(handle_.is_initialized()); | 573 EXPECT_FALSE(handle_.is_initialized()); |
484 EXPECT_FALSE(handle_.socket()); | 574 EXPECT_FALSE(handle_.socket()); |
485 } | 575 } |
486 | 576 |
487 TEST_P(HttpProxyClientSocketPoolTest, SslClientAuth) { | 577 TEST_P(HttpProxyClientSocketPoolTest, SslClientAuth) { |
488 if (GetParam().proxy_type == HTTP) return; | 578 if (GetParam().proxy_type == HTTP) return; |
489 data_.reset(new DeterministicSocketData(NULL, 0, NULL, 0)); | 579 data_.reset(new DeterministicSocketData(NULL, 0, NULL, 0)); |
490 data_->set_connect_data(MockConnect(ASYNC, OK)); | 580 data_->set_connect_data(MockConnect(ASYNC, OK)); |
491 socket_factory()->AddSocketDataProvider(data_.get()); | 581 socket_factory()->AddSocketDataProvider(data_.get()); |
492 | 582 |
493 ssl_data_.reset(new SSLSocketDataProvider(ASYNC, | 583 ssl_data_.reset(new SSLSocketDataProvider(ASYNC, |
494 ERR_SSL_CLIENT_AUTH_CERT_NEEDED)); | 584 ERR_SSL_CLIENT_AUTH_CERT_NEEDED)); |
495 if (GetParam().proxy_type == SPDY) { | 585 if (GetParam().proxy_type == SPDY) { |
496 InitializeSpdySsl(); | 586 InitializeSpdySsl(); |
497 } | 587 } |
498 socket_factory()->AddSSLSocketDataProvider(ssl_data_.get()); | 588 socket_factory()->AddSSLSocketDataProvider(ssl_data_.get()); |
499 | 589 |
500 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), | 590 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, |
501 &pool_, BoundNetLog()); | 591 callback_.callback(), &pool_, BoundNetLog()); |
502 EXPECT_EQ(ERR_IO_PENDING, rv); | 592 EXPECT_EQ(ERR_IO_PENDING, rv); |
503 EXPECT_FALSE(handle_.is_initialized()); | 593 EXPECT_FALSE(handle_.is_initialized()); |
504 EXPECT_FALSE(handle_.socket()); | 594 EXPECT_FALSE(handle_.socket()); |
505 | 595 |
506 EXPECT_EQ(ERR_SSL_CLIENT_AUTH_CERT_NEEDED, callback_.WaitForResult()); | 596 EXPECT_EQ(ERR_SSL_CLIENT_AUTH_CERT_NEEDED, callback_.WaitForResult()); |
507 | 597 |
508 EXPECT_FALSE(handle_.is_initialized()); | 598 EXPECT_FALSE(handle_.is_initialized()); |
509 EXPECT_FALSE(handle_.socket()); | 599 EXPECT_FALSE(handle_.socket()); |
510 } | 600 } |
511 | 601 |
(...skipping 16 matching lines...) Expand all Loading... | |
528 }; | 618 }; |
529 MockRead spdy_reads[] = { | 619 MockRead spdy_reads[] = { |
530 MockRead(ASYNC, ERR_CONNECTION_CLOSED, 1), | 620 MockRead(ASYNC, ERR_CONNECTION_CLOSED, 1), |
531 }; | 621 }; |
532 | 622 |
533 Initialize(reads, arraysize(reads), writes, arraysize(writes), | 623 Initialize(reads, arraysize(reads), writes, arraysize(writes), |
534 spdy_reads, arraysize(spdy_reads), spdy_writes, | 624 spdy_reads, arraysize(spdy_reads), spdy_writes, |
535 arraysize(spdy_writes)); | 625 arraysize(spdy_writes)); |
536 AddAuthToCache(); | 626 AddAuthToCache(); |
537 | 627 |
538 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), | 628 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, |
539 &pool_, BoundNetLog()); | 629 callback_.callback(), &pool_, BoundNetLog()); |
540 EXPECT_EQ(ERR_IO_PENDING, rv); | 630 EXPECT_EQ(ERR_IO_PENDING, rv); |
541 EXPECT_FALSE(handle_.is_initialized()); | 631 EXPECT_FALSE(handle_.is_initialized()); |
542 EXPECT_FALSE(handle_.socket()); | 632 EXPECT_FALSE(handle_.socket()); |
543 | 633 |
544 data_->RunFor(3); | 634 data_->RunFor(3); |
545 if (GetParam().proxy_type == SPDY) { | 635 if (GetParam().proxy_type == SPDY) { |
546 // SPDY cannot process a headers block unless it's complete and so it | 636 // SPDY cannot process a headers block unless it's complete and so it |
547 // returns ERR_CONNECTION_CLOSED in this case. | 637 // returns ERR_CONNECTION_CLOSED in this case. |
548 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback_.WaitForResult()); | 638 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback_.WaitForResult()); |
549 } else { | 639 } else { |
(...skipping 17 matching lines...) Expand all Loading... | |
567 "Proxy-Connection: keep-alive\r\n\r\n"), | 657 "Proxy-Connection: keep-alive\r\n\r\n"), |
568 }; | 658 }; |
569 MockRead reads[] = { | 659 MockRead reads[] = { |
570 MockRead(ASYNC, 1, "HTTP/1.1 100 Continue\r\n\r\n"), | 660 MockRead(ASYNC, 1, "HTTP/1.1 100 Continue\r\n\r\n"), |
571 MockRead(ASYNC, 2, "HTTP/1.1 200 Connection Established\r\n\r\n"), | 661 MockRead(ASYNC, 2, "HTTP/1.1 200 Connection Established\r\n\r\n"), |
572 }; | 662 }; |
573 | 663 |
574 Initialize(reads, arraysize(reads), writes, arraysize(writes), | 664 Initialize(reads, arraysize(reads), writes, arraysize(writes), |
575 NULL, 0, NULL, 0); | 665 NULL, 0, NULL, 0); |
576 | 666 |
577 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), | 667 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, |
578 &pool_, BoundNetLog()); | 668 callback_.callback(), &pool_, BoundNetLog()); |
579 EXPECT_EQ(ERR_IO_PENDING, rv); | 669 EXPECT_EQ(ERR_IO_PENDING, rv); |
580 EXPECT_FALSE(handle_.is_initialized()); | 670 EXPECT_FALSE(handle_.is_initialized()); |
581 EXPECT_FALSE(handle_.socket()); | 671 EXPECT_FALSE(handle_.socket()); |
582 | 672 |
583 data_->RunFor(2); | 673 data_->RunFor(2); |
584 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, callback_.WaitForResult()); | 674 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, callback_.WaitForResult()); |
585 } | 675 } |
586 | 676 |
587 TEST_P(HttpProxyClientSocketPoolTest, TunnelSetupError) { | 677 TEST_P(HttpProxyClientSocketPoolTest, TunnelSetupError) { |
588 MockWrite writes[] = { | 678 MockWrite writes[] = { |
(...skipping 18 matching lines...) Expand all Loading... | |
607 MockRead spdy_reads[] = { | 697 MockRead spdy_reads[] = { |
608 CreateMockRead(*resp, 1, ASYNC), | 698 CreateMockRead(*resp, 1, ASYNC), |
609 MockRead(ASYNC, 0, 3), | 699 MockRead(ASYNC, 0, 3), |
610 }; | 700 }; |
611 | 701 |
612 Initialize(reads, arraysize(reads), writes, arraysize(writes), | 702 Initialize(reads, arraysize(reads), writes, arraysize(writes), |
613 spdy_reads, arraysize(spdy_reads), spdy_writes, | 703 spdy_reads, arraysize(spdy_reads), spdy_writes, |
614 arraysize(spdy_writes)); | 704 arraysize(spdy_writes)); |
615 AddAuthToCache(); | 705 AddAuthToCache(); |
616 | 706 |
617 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), | 707 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, |
618 &pool_, BoundNetLog()); | 708 callback_.callback(), &pool_, BoundNetLog()); |
619 EXPECT_EQ(ERR_IO_PENDING, rv); | 709 EXPECT_EQ(ERR_IO_PENDING, rv); |
620 EXPECT_FALSE(handle_.is_initialized()); | 710 EXPECT_FALSE(handle_.is_initialized()); |
621 EXPECT_FALSE(handle_.socket()); | 711 EXPECT_FALSE(handle_.socket()); |
622 | 712 |
623 data_->RunFor(2); | 713 data_->RunFor(2); |
624 | 714 |
625 rv = callback_.WaitForResult(); | 715 rv = callback_.WaitForResult(); |
626 // All Proxy CONNECT responses are not trustworthy | 716 // All Proxy CONNECT responses are not trustworthy |
627 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, rv); | 717 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, rv); |
628 EXPECT_FALSE(handle_.is_initialized()); | 718 EXPECT_FALSE(handle_.is_initialized()); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
669 MockRead spdy_reads[] = { | 759 MockRead spdy_reads[] = { |
670 CreateMockRead(*resp, 1, ASYNC), | 760 CreateMockRead(*resp, 1, ASYNC), |
671 MockRead(ASYNC, 0, 2), | 761 MockRead(ASYNC, 0, 2), |
672 }; | 762 }; |
673 | 763 |
674 Initialize(reads, arraysize(reads), writes, arraysize(writes), | 764 Initialize(reads, arraysize(reads), writes, arraysize(writes), |
675 spdy_reads, arraysize(spdy_reads), spdy_writes, | 765 spdy_reads, arraysize(spdy_reads), spdy_writes, |
676 arraysize(spdy_writes)); | 766 arraysize(spdy_writes)); |
677 AddAuthToCache(); | 767 AddAuthToCache(); |
678 | 768 |
679 int rv = handle_.Init("a", CreateTunnelParams(), LOW, callback_.callback(), | 769 int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, |
680 &pool_, BoundNetLog()); | 770 callback_.callback(), &pool_, BoundNetLog()); |
681 EXPECT_EQ(ERR_IO_PENDING, rv); | 771 EXPECT_EQ(ERR_IO_PENDING, rv); |
682 EXPECT_FALSE(handle_.is_initialized()); | 772 EXPECT_FALSE(handle_.is_initialized()); |
683 EXPECT_FALSE(handle_.socket()); | 773 EXPECT_FALSE(handle_.socket()); |
684 | 774 |
685 data_->RunFor(2); | 775 data_->RunFor(2); |
686 | 776 |
687 rv = callback_.WaitForResult(); | 777 rv = callback_.WaitForResult(); |
688 | 778 |
689 if (GetParam().proxy_type == HTTP) { | 779 if (GetParam().proxy_type == HTTP) { |
690 // We don't trust 302 responses to CONNECT from HTTP proxies. | 780 // We don't trust 302 responses to CONNECT from HTTP proxies. |
(...skipping 22 matching lines...) Expand all Loading... | |
713 EXPECT_TRUE(headers->IsRedirect(&location)); | 803 EXPECT_TRUE(headers->IsRedirect(&location)); |
714 EXPECT_EQ(location, redirectTarget); | 804 EXPECT_EQ(location, redirectTarget); |
715 } | 805 } |
716 } | 806 } |
717 | 807 |
718 // It would be nice to also test the timeouts in HttpProxyClientSocketPool. | 808 // It would be nice to also test the timeouts in HttpProxyClientSocketPool. |
719 | 809 |
720 } // namespace | 810 } // namespace |
721 | 811 |
722 } // namespace net | 812 } // namespace net |
OLD | NEW |