Chromium Code Reviews| 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 |