| 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_stream_factory_impl.h" | 5 #include "net/http/http_stream_factory_impl.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <string> | 10 #include <string> |
| (...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 381 CapturePreconnectsSocketPool(HostResolver* host_resolver, | 381 CapturePreconnectsSocketPool(HostResolver* host_resolver, |
| 382 CertVerifier* cert_verifier, | 382 CertVerifier* cert_verifier, |
| 383 TransportSecurityState* transport_security_state, | 383 TransportSecurityState* transport_security_state, |
| 384 CTVerifier* cert_transparency_verifier, | 384 CTVerifier* cert_transparency_verifier, |
| 385 CTPolicyEnforcer* ct_policy_enforcer); | 385 CTPolicyEnforcer* ct_policy_enforcer); |
| 386 | 386 |
| 387 int last_num_streams() const { | 387 int last_num_streams() const { |
| 388 return last_num_streams_; | 388 return last_num_streams_; |
| 389 } | 389 } |
| 390 | 390 |
| 391 int total_num_streams() const { return total_num_streams_; } |
| 392 |
| 391 int RequestSocket(const std::string& group_name, | 393 int RequestSocket(const std::string& group_name, |
| 392 const void* socket_params, | 394 const void* socket_params, |
| 393 RequestPriority priority, | 395 RequestPriority priority, |
| 394 ClientSocketPool::RespectLimits respect_limits, | 396 ClientSocketPool::RespectLimits respect_limits, |
| 395 ClientSocketHandle* handle, | 397 ClientSocketHandle* handle, |
| 396 const CompletionCallback& callback, | 398 const CompletionCallback& callback, |
| 397 const NetLogWithSource& net_log) override { | 399 const NetLogWithSource& net_log) override { |
| 398 ADD_FAILURE(); | 400 ADD_FAILURE(); |
| 399 return ERR_UNEXPECTED; | 401 return ERR_UNEXPECTED; |
| 400 } | 402 } |
| 401 | 403 |
| 402 void RequestSockets(const std::string& group_name, | 404 void RequestSockets(const std::string& group_name, |
| 403 const void* socket_params, | 405 const void* socket_params, |
| 404 int num_sockets, | 406 int num_sockets, |
| 405 const NetLogWithSource& net_log) override { | 407 const NetLogWithSource& net_log) override { |
| 406 last_num_streams_ = num_sockets; | 408 last_num_streams_ = num_sockets; |
| 409 total_num_streams_ += num_sockets; |
| 407 } | 410 } |
| 408 | 411 |
| 409 void CancelRequest(const std::string& group_name, | 412 void CancelRequest(const std::string& group_name, |
| 410 ClientSocketHandle* handle) override { | 413 ClientSocketHandle* handle) override { |
| 411 ADD_FAILURE(); | 414 ADD_FAILURE(); |
| 412 } | 415 } |
| 413 void ReleaseSocket(const std::string& group_name, | 416 void ReleaseSocket(const std::string& group_name, |
| 414 std::unique_ptr<StreamSocket> socket, | 417 std::unique_ptr<StreamSocket> socket, |
| 415 int id) override { | 418 int id) override { |
| 416 ADD_FAILURE(); | 419 ADD_FAILURE(); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 428 const ClientSocketHandle* handle) const override { | 431 const ClientSocketHandle* handle) const override { |
| 429 ADD_FAILURE(); | 432 ADD_FAILURE(); |
| 430 return LOAD_STATE_IDLE; | 433 return LOAD_STATE_IDLE; |
| 431 } | 434 } |
| 432 base::TimeDelta ConnectionTimeout() const override { | 435 base::TimeDelta ConnectionTimeout() const override { |
| 433 return base::TimeDelta(); | 436 return base::TimeDelta(); |
| 434 } | 437 } |
| 435 | 438 |
| 436 private: | 439 private: |
| 437 int last_num_streams_; | 440 int last_num_streams_; |
| 441 int total_num_streams_; |
| 438 }; | 442 }; |
| 439 | 443 |
| 440 typedef CapturePreconnectsSocketPool<TransportClientSocketPool> | 444 typedef CapturePreconnectsSocketPool<TransportClientSocketPool> |
| 441 CapturePreconnectsTransportSocketPool; | 445 CapturePreconnectsTransportSocketPool; |
| 442 typedef CapturePreconnectsSocketPool<HttpProxyClientSocketPool> | 446 typedef CapturePreconnectsSocketPool<HttpProxyClientSocketPool> |
| 443 CapturePreconnectsHttpProxySocketPool; | 447 CapturePreconnectsHttpProxySocketPool; |
| 444 typedef CapturePreconnectsSocketPool<SOCKSClientSocketPool> | 448 typedef CapturePreconnectsSocketPool<SOCKSClientSocketPool> |
| 445 CapturePreconnectsSOCKSSocketPool; | 449 CapturePreconnectsSOCKSSocketPool; |
| 446 typedef CapturePreconnectsSocketPool<SSLClientSocketPool> | 450 typedef CapturePreconnectsSocketPool<SSLClientSocketPool> |
| 447 CapturePreconnectsSSLSocketPool; | 451 CapturePreconnectsSSLSocketPool; |
| 448 | 452 |
| 449 template <typename ParentPool> | 453 template <typename ParentPool> |
| 450 CapturePreconnectsSocketPool<ParentPool>::CapturePreconnectsSocketPool( | 454 CapturePreconnectsSocketPool<ParentPool>::CapturePreconnectsSocketPool( |
| 451 HostResolver* host_resolver, | 455 HostResolver* host_resolver, |
| 452 CertVerifier*, | 456 CertVerifier*, |
| 453 TransportSecurityState*, | 457 TransportSecurityState*, |
| 454 CTVerifier*, | 458 CTVerifier*, |
| 455 CTPolicyEnforcer*) | 459 CTPolicyEnforcer*) |
| 456 : ParentPool(0, 0, host_resolver, nullptr, nullptr, nullptr), | 460 : ParentPool(0, 0, host_resolver, nullptr, nullptr, nullptr), |
| 457 last_num_streams_(-1) {} | 461 last_num_streams_(-1), |
| 462 total_num_streams_(0) {} |
| 458 | 463 |
| 459 template <> | 464 template <> |
| 460 CapturePreconnectsHttpProxySocketPool::CapturePreconnectsSocketPool( | 465 CapturePreconnectsHttpProxySocketPool::CapturePreconnectsSocketPool( |
| 461 HostResolver*, | 466 HostResolver*, |
| 462 CertVerifier*, | 467 CertVerifier*, |
| 463 TransportSecurityState*, | 468 TransportSecurityState*, |
| 464 CTVerifier*, | 469 CTVerifier*, |
| 465 CTPolicyEnforcer*) | 470 CTPolicyEnforcer*) |
| 466 : HttpProxyClientSocketPool(0, 0, nullptr, nullptr, nullptr), | 471 : HttpProxyClientSocketPool(0, 0, nullptr, nullptr, nullptr), |
| 467 last_num_streams_(-1) {} | 472 last_num_streams_(-1), |
| 473 total_num_streams_(0) {} |
| 468 | 474 |
| 469 template <> | 475 template <> |
| 470 CapturePreconnectsSSLSocketPool::CapturePreconnectsSocketPool( | 476 CapturePreconnectsSSLSocketPool::CapturePreconnectsSocketPool( |
| 471 HostResolver* /* host_resolver */, | 477 HostResolver* /* host_resolver */, |
| 472 CertVerifier* cert_verifier, | 478 CertVerifier* cert_verifier, |
| 473 TransportSecurityState* transport_security_state, | 479 TransportSecurityState* transport_security_state, |
| 474 CTVerifier* cert_transparency_verifier, | 480 CTVerifier* cert_transparency_verifier, |
| 475 CTPolicyEnforcer* ct_policy_enforcer) | 481 CTPolicyEnforcer* ct_policy_enforcer) |
| 476 : SSLClientSocketPool(0, | 482 : SSLClientSocketPool(0, |
| 477 0, | 483 0, |
| 478 cert_verifier, | 484 cert_verifier, |
| 479 nullptr, // channel_id_store | 485 nullptr, // channel_id_store |
| 480 transport_security_state, | 486 transport_security_state, |
| 481 cert_transparency_verifier, | 487 cert_transparency_verifier, |
| 482 ct_policy_enforcer, | 488 ct_policy_enforcer, |
| 483 std::string(), // ssl_session_cache_shard | 489 std::string(), // ssl_session_cache_shard |
| 484 nullptr, // deterministic_socket_factory | 490 nullptr, // deterministic_socket_factory |
| 485 nullptr, // transport_socket_pool | 491 nullptr, // transport_socket_pool |
| 486 nullptr, | 492 nullptr, |
| 487 nullptr, | 493 nullptr, |
| 488 nullptr, // ssl_config_service | 494 nullptr, // ssl_config_service |
| 489 nullptr), // net_log | 495 nullptr), // net_log |
| 490 last_num_streams_(-1) {} | 496 last_num_streams_(-1), |
| 497 total_num_streams_(0) {} |
| 491 | 498 |
| 492 class HttpStreamFactoryTest : public ::testing::Test, | 499 class HttpStreamFactoryTest : public ::testing::Test, |
| 493 public ::testing::WithParamInterface<NextProto> { | 500 public ::testing::WithParamInterface<NextProto> { |
| 494 }; | 501 }; |
| 495 | 502 |
| 496 TEST_F(HttpStreamFactoryTest, PreconnectDirect) { | 503 TEST_F(HttpStreamFactoryTest, PreconnectDirect) { |
| 497 for (size_t i = 0; i < arraysize(kTests); ++i) { | 504 for (size_t i = 0; i < arraysize(kTests); ++i) { |
| 498 SpdySessionDependencies session_deps(ProxyService::CreateDirect()); | 505 SpdySessionDependencies session_deps(ProxyService::CreateDirect()); |
| 499 std::unique_ptr<HttpNetworkSession> session( | 506 std::unique_ptr<HttpNetworkSession> session( |
| 500 SpdySessionDependencies::SpdyCreateSession(&session_deps)); | 507 SpdySessionDependencies::SpdyCreateSession(&session_deps)); |
| (...skipping 709 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1210 HttpRequestInfo request; | 1217 HttpRequestInfo request; |
| 1211 request.method = "GET"; | 1218 request.method = "GET"; |
| 1212 request.url = url; | 1219 request.url = url; |
| 1213 request.load_flags = 0; | 1220 request.load_flags = 0; |
| 1214 | 1221 |
| 1215 session->http_stream_factory()->PreconnectStreams(num_streams, request); | 1222 session->http_stream_factory()->PreconnectStreams(num_streams, request); |
| 1216 EXPECT_EQ(-1, transport_conn_pool->last_num_streams()); | 1223 EXPECT_EQ(-1, transport_conn_pool->last_num_streams()); |
| 1217 } | 1224 } |
| 1218 } | 1225 } |
| 1219 | 1226 |
| 1227 TEST_F(HttpStreamFactoryTest, QuicRacePreconnectsToProxyServer) { |
| 1228 for (bool race_preconnects_to_http2_proxies : {false, true}) { |
| 1229 for (int num_streams = 1; num_streams < 3; ++num_streams) { |
| 1230 TestProxyDelegate test_proxy_delegate; |
| 1231 base::HistogramTester histogram_tester; |
| 1232 GURL url = GURL("http://www.google.com"); |
| 1233 std::unique_ptr<ProxyService> proxy_service = |
| 1234 ProxyService::CreateFixedFromPacResult("HTTPS myproxy.org:443"); |
| 1235 |
| 1236 // Set up QUIC as alternative_service. |
| 1237 HttpServerPropertiesImpl http_server_properties; |
| 1238 const AlternativeService alternative_service(kProtoQUIC, "myproxy.org", |
| 1239 443); |
| 1240 AlternativeServiceInfoVector alternative_service_info_vector; |
| 1241 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); |
| 1242 alternative_service_info_vector.push_back( |
| 1243 AlternativeServiceInfo(alternative_service, expiration)); |
| 1244 HostPortPair host_port_pair(alternative_service.host_port_pair()); |
| 1245 url::SchemeHostPort server("https", host_port_pair.host(), |
| 1246 host_port_pair.port()); |
| 1247 http_server_properties.SetAlternativeServices( |
| 1248 server, alternative_service_info_vector); |
| 1249 |
| 1250 SpdySessionDependencies session_deps; |
| 1251 HttpNetworkSession::Params params = |
| 1252 SpdySessionDependencies::CreateSessionParams(&session_deps); |
| 1253 params.enable_quic = true; |
| 1254 params.proxy_service = proxy_service.get(); |
| 1255 params.race_preconnects_to_http2_proxies = |
| 1256 race_preconnects_to_http2_proxies; |
| 1257 // |quic_disable_preconnect_if_0rtt| has no effect on preconnect for |
| 1258 // proxies. |
| 1259 params.quic_disable_preconnect_if_0rtt = false; |
| 1260 params.http_server_properties = &http_server_properties; |
| 1261 |
| 1262 test_proxy_delegate.set_alternative_proxy_server( |
| 1263 ProxyServer::FromPacString("QUIC myproxy.org:443")); |
| 1264 params.proxy_delegate = &test_proxy_delegate; |
| 1265 |
| 1266 std::unique_ptr<HttpNetworkSession> session( |
| 1267 new HttpNetworkSession(params)); |
| 1268 |
| 1269 HttpNetworkSessionPeer peer(session.get()); |
| 1270 HostPortPair proxy_host("myproxy.org", 443); |
| 1271 |
| 1272 CapturePreconnectsTransportSocketPool* transport_conn_pool = |
| 1273 new CapturePreconnectsTransportSocketPool( |
| 1274 session_deps.host_resolver.get(), |
| 1275 session_deps.cert_verifier.get(), |
| 1276 session_deps.transport_security_state.get(), |
| 1277 session_deps.cert_transparency_verifier.get(), |
| 1278 session_deps.ct_policy_enforcer.get()); |
| 1279 |
| 1280 CapturePreconnectsHttpProxySocketPool* http_proxy_pool = |
| 1281 new CapturePreconnectsHttpProxySocketPool( |
| 1282 session_deps.host_resolver.get(), |
| 1283 session_deps.cert_verifier.get(), |
| 1284 session_deps.transport_security_state.get(), |
| 1285 session_deps.cert_transparency_verifier.get(), |
| 1286 session_deps.ct_policy_enforcer.get()); |
| 1287 CapturePreconnectsSSLSocketPool* ssl_conn_pool = |
| 1288 new CapturePreconnectsSSLSocketPool( |
| 1289 session_deps.host_resolver.get(), |
| 1290 session_deps.cert_verifier.get(), |
| 1291 session_deps.transport_security_state.get(), |
| 1292 session_deps.cert_transparency_verifier.get(), |
| 1293 session_deps.ct_policy_enforcer.get()); |
| 1294 |
| 1295 std::unique_ptr<MockClientSocketPoolManager> mock_pool_manager( |
| 1296 new MockClientSocketPoolManager); |
| 1297 mock_pool_manager->SetTransportSocketPool(transport_conn_pool); |
| 1298 mock_pool_manager->SetSocketPoolForHTTPProxy( |
| 1299 proxy_host, base::WrapUnique(http_proxy_pool)); |
| 1300 mock_pool_manager->SetSocketPoolForSSLWithProxy( |
| 1301 proxy_host, base::WrapUnique(ssl_conn_pool)); |
| 1302 peer.SetClientSocketPoolManager(std::move(mock_pool_manager)); |
| 1303 |
| 1304 HttpRequestInfo request_info; |
| 1305 request_info.method = "GET"; |
| 1306 request_info.url = url; |
| 1307 request_info.load_flags = 0; |
| 1308 |
| 1309 session->http_stream_factory()->PreconnectStreams(num_streams, |
| 1310 request_info); |
| 1311 base::RunLoop().RunUntilIdle(); |
| 1312 EXPECT_EQ(-1, transport_conn_pool->last_num_streams()); |
| 1313 EXPECT_EQ(0, transport_conn_pool->total_num_streams()); |
| 1314 EXPECT_EQ(-1, ssl_conn_pool->last_num_streams()); |
| 1315 EXPECT_EQ(0, ssl_conn_pool->total_num_streams()); |
| 1316 EXPECT_EQ(race_preconnects_to_http2_proxies ? 1 : num_streams, |
| 1317 http_proxy_pool->last_num_streams()); |
| 1318 EXPECT_EQ(race_preconnects_to_http2_proxies ? 1 : num_streams, |
| 1319 http_proxy_pool->total_num_streams()); |
| 1320 histogram_tester.ExpectTotalCount( |
| 1321 "Net.QuicAlternativeProxy.PreconnectJobsRaced", |
| 1322 race_preconnects_to_http2_proxies ? 1 : 0); |
| 1323 } |
| 1324 } |
| 1325 } |
| 1326 |
| 1220 // Verify that only one preconnect job succeeds to a proxy server that supports | 1327 // Verify that only one preconnect job succeeds to a proxy server that supports |
| 1221 // request priorities. | 1328 // request priorities. |
| 1222 TEST_F(HttpStreamFactoryTest, OnlyOnePreconnectToProxyServer) { | 1329 TEST_F(HttpStreamFactoryTest, OnlyOnePreconnectToProxyServer) { |
| 1223 for (bool set_http_server_properties : {false, true}) { | 1330 for (bool set_http_server_properties : {false, true}) { |
| 1224 for (int num_streams = 1; num_streams < 3; ++num_streams) { | 1331 for (int num_streams = 1; num_streams < 3; ++num_streams) { |
| 1225 base::HistogramTester histogram_tester; | 1332 base::HistogramTester histogram_tester; |
| 1226 GURL url = GURL("http://www.google.com"); | 1333 GURL url = GURL("http://www.google.com"); |
| 1227 std::unique_ptr<ProxyService> proxy_service = | 1334 std::unique_ptr<ProxyService> proxy_service = |
| 1228 ProxyService::CreateFixedFromPacResult("HTTPS myproxy.org:443"); | 1335 ProxyService::CreateFixedFromPacResult("HTTPS myproxy.org:443"); |
| 1229 | 1336 |
| (...skipping 1274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2504 session->GetTransportSocketPool( | 2611 session->GetTransportSocketPool( |
| 2505 HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); | 2612 HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); |
| 2506 EXPECT_EQ(1, GetSocketPoolGroupCount( | 2613 EXPECT_EQ(1, GetSocketPoolGroupCount( |
| 2507 session->GetSSLSocketPool(HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); | 2614 session->GetSSLSocketPool(HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); |
| 2508 EXPECT_TRUE(waiter.used_proxy_info().is_direct()); | 2615 EXPECT_TRUE(waiter.used_proxy_info().is_direct()); |
| 2509 } | 2616 } |
| 2510 | 2617 |
| 2511 } // namespace | 2618 } // namespace |
| 2512 | 2619 |
| 2513 } // namespace net | 2620 } // namespace net |
| OLD | NEW |