| 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_network_session.h" | 5 #include "net/http/http_network_session.h" |
| 6 | 6 |
| 7 #include <inttypes.h> | 7 #include <inttypes.h> |
| 8 | 8 |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 42 #include "net/spdy/chromium/spdy_session_pool.h" | 42 #include "net/spdy/chromium/spdy_session_pool.h" |
| 43 | 43 |
| 44 namespace net { | 44 namespace net { |
| 45 | 45 |
| 46 namespace { | 46 namespace { |
| 47 | 47 |
| 48 base::StaticAtomicSequenceNumber g_next_shard_id; | 48 base::StaticAtomicSequenceNumber g_next_shard_id; |
| 49 | 49 |
| 50 ClientSocketPoolManager* CreateSocketPoolManager( | 50 ClientSocketPoolManager* CreateSocketPoolManager( |
| 51 HttpNetworkSession::SocketPoolType pool_type, | 51 HttpNetworkSession::SocketPoolType pool_type, |
| 52 const HttpNetworkSession::Params& params, | 52 const HttpNetworkSession::Context& context, |
| 53 const std::string& ssl_session_cache_shard) { | 53 const std::string& ssl_session_cache_shard) { |
| 54 // TODO(yutak): Differentiate WebSocket pool manager and allow more | 54 // TODO(yutak): Differentiate WebSocket pool manager and allow more |
| 55 // simultaneous connections for WebSockets. | 55 // simultaneous connections for WebSockets. |
| 56 return new ClientSocketPoolManagerImpl( | 56 return new ClientSocketPoolManagerImpl( |
| 57 params.net_log, | 57 context.net_log, |
| 58 params.client_socket_factory ? params.client_socket_factory | 58 context.client_socket_factory ? context.client_socket_factory |
| 59 : ClientSocketFactory::GetDefaultFactory(), | 59 : ClientSocketFactory::GetDefaultFactory(), |
| 60 params.socket_performance_watcher_factory, params.host_resolver, | 60 context.socket_performance_watcher_factory, context.host_resolver, |
| 61 params.cert_verifier, params.channel_id_service, | 61 context.cert_verifier, context.channel_id_service, |
| 62 params.transport_security_state, params.cert_transparency_verifier, | 62 context.transport_security_state, context.cert_transparency_verifier, |
| 63 params.ct_policy_enforcer, ssl_session_cache_shard, | 63 context.ct_policy_enforcer, ssl_session_cache_shard, |
| 64 params.ssl_config_service, pool_type); | 64 context.ssl_config_service, pool_type); |
| 65 } | 65 } |
| 66 | 66 |
| 67 } // unnamed namespace | 67 } // unnamed namespace |
| 68 | 68 |
| 69 // The maximum receive window sizes for HTTP/2 sessions and streams. | 69 // The maximum receive window sizes for HTTP/2 sessions and streams. |
| 70 const int32_t kSpdySessionMaxRecvWindowSize = 15 * 1024 * 1024; // 15 MB | 70 const int32_t kSpdySessionMaxRecvWindowSize = 15 * 1024 * 1024; // 15 MB |
| 71 const int32_t kSpdyStreamMaxRecvWindowSize = 6 * 1024 * 1024; // 6 MB | 71 const int32_t kSpdyStreamMaxRecvWindowSize = 6 * 1024 * 1024; // 6 MB |
| 72 | 72 |
| 73 namespace { | 73 namespace { |
| 74 | 74 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 90 it = http2_settings.find(SETTINGS_INITIAL_WINDOW_SIZE); | 90 it = http2_settings.find(SETTINGS_INITIAL_WINDOW_SIZE); |
| 91 if (it == http2_settings.end()) | 91 if (it == http2_settings.end()) |
| 92 http2_settings[SETTINGS_INITIAL_WINDOW_SIZE] = kSpdyStreamMaxRecvWindowSize; | 92 http2_settings[SETTINGS_INITIAL_WINDOW_SIZE] = kSpdyStreamMaxRecvWindowSize; |
| 93 | 93 |
| 94 return http2_settings; | 94 return http2_settings; |
| 95 } | 95 } |
| 96 | 96 |
| 97 } // unnamed namespace | 97 } // unnamed namespace |
| 98 | 98 |
| 99 HttpNetworkSession::Params::Params() | 99 HttpNetworkSession::Params::Params() |
| 100 : client_socket_factory(nullptr), | 100 : enable_server_push_cancellation(false), |
| 101 host_resolver(nullptr), | |
| 102 cert_verifier(nullptr), | |
| 103 enable_server_push_cancellation(false), | |
| 104 channel_id_service(nullptr), | |
| 105 transport_security_state(nullptr), | |
| 106 cert_transparency_verifier(nullptr), | |
| 107 ct_policy_enforcer(nullptr), | |
| 108 proxy_service(nullptr), | |
| 109 ssl_config_service(nullptr), | |
| 110 http_auth_handler_factory(nullptr), | |
| 111 net_log(nullptr), | |
| 112 socket_performance_watcher_factory(nullptr), | |
| 113 ignore_certificate_errors(false), | 101 ignore_certificate_errors(false), |
| 114 testing_fixed_http_port(0), | 102 testing_fixed_http_port(0), |
| 115 testing_fixed_https_port(0), | 103 testing_fixed_https_port(0), |
| 116 enable_tcp_fast_open_for_ssl(false), | 104 enable_tcp_fast_open_for_ssl(false), |
| 117 enable_user_alternate_protocol_ports(false), | 105 enable_user_alternate_protocol_ports(false), |
| 118 enable_spdy_ping_based_connection_checking(true), | 106 enable_spdy_ping_based_connection_checking(true), |
| 119 enable_http2(true), | 107 enable_http2(true), |
| 120 spdy_session_max_recv_window_size(kSpdySessionMaxRecvWindowSize), | 108 spdy_session_max_recv_window_size(kSpdySessionMaxRecvWindowSize), |
| 121 time_func(&base::TimeTicks::Now), | 109 time_func(&base::TimeTicks::Now), |
| 122 enable_http2_alternative_service(false), | 110 enable_http2_alternative_service(false), |
| 123 enable_quic(false), | 111 enable_quic(false), |
| 124 quic_max_packet_length(kDefaultMaxPacketSize), | 112 quic_max_packet_length(kDefaultMaxPacketSize), |
| 125 quic_clock(nullptr), | |
| 126 quic_random(nullptr), | |
| 127 quic_crypto_client_stream_factory( | |
| 128 QuicCryptoClientStreamFactory::GetDefaultFactory()), | |
| 129 quic_max_server_configs_stored_in_properties(0u), | 113 quic_max_server_configs_stored_in_properties(0u), |
| 130 mark_quic_broken_when_network_blackholes(false), | 114 mark_quic_broken_when_network_blackholes(false), |
| 131 retry_without_alt_svc_on_quic_errors(false), | 115 retry_without_alt_svc_on_quic_errors(false), |
| 132 quic_close_sessions_on_ip_change(false), | 116 quic_close_sessions_on_ip_change(false), |
| 133 quic_idle_connection_timeout_seconds(kIdleConnectionTimeoutSeconds), | 117 quic_idle_connection_timeout_seconds(kIdleConnectionTimeoutSeconds), |
| 134 quic_reduced_ping_timeout_seconds(kPingTimeoutSecs), | 118 quic_reduced_ping_timeout_seconds(kPingTimeoutSecs), |
| 135 quic_packet_reader_yield_after_duration_milliseconds( | 119 quic_packet_reader_yield_after_duration_milliseconds( |
| 136 kQuicYieldAfterDurationMilliseconds), | 120 kQuicYieldAfterDurationMilliseconds), |
| 137 quic_migrate_sessions_on_network_change(false), | 121 quic_migrate_sessions_on_network_change(false), |
| 138 quic_migrate_sessions_early(false), | 122 quic_migrate_sessions_early(false), |
| 139 quic_allow_server_migration(false), | 123 quic_allow_server_migration(false), |
| 140 quic_disable_bidirectional_streams(false), | 124 quic_disable_bidirectional_streams(false), |
| 141 quic_force_hol_blocking(false), | 125 quic_force_hol_blocking(false), |
| 142 quic_race_cert_verification(false), | 126 quic_race_cert_verification(false), |
| 143 quic_do_not_fragment(false), | 127 quic_do_not_fragment(false), |
| 144 quic_estimate_initial_rtt(false), | 128 quic_estimate_initial_rtt(false), |
| 145 proxy_delegate(nullptr), | |
| 146 enable_token_binding(false), | 129 enable_token_binding(false), |
| 147 http_09_on_non_default_ports_enabled(false) { | 130 http_09_on_non_default_ports_enabled(false) { |
| 148 quic_supported_versions.push_back(QUIC_VERSION_37); | 131 quic_supported_versions.push_back(QUIC_VERSION_37); |
| 149 } | 132 } |
| 150 | 133 |
| 151 HttpNetworkSession::Params::Params(const Params& other) = default; | 134 HttpNetworkSession::Params::Params(const Params& other) = default; |
| 152 | 135 |
| 153 HttpNetworkSession::Params::~Params() {} | 136 HttpNetworkSession::Params::~Params() {} |
| 154 | 137 |
| 138 HttpNetworkSession::Context::Context() |
| 139 : client_socket_factory(nullptr), |
| 140 host_resolver(nullptr), |
| 141 cert_verifier(nullptr), |
| 142 channel_id_service(nullptr), |
| 143 transport_security_state(nullptr), |
| 144 cert_transparency_verifier(nullptr), |
| 145 ct_policy_enforcer(nullptr), |
| 146 proxy_service(nullptr), |
| 147 ssl_config_service(nullptr), |
| 148 http_auth_handler_factory(nullptr), |
| 149 net_log(nullptr), |
| 150 socket_performance_watcher_factory(nullptr), |
| 151 quic_clock(nullptr), |
| 152 quic_random(nullptr), |
| 153 quic_crypto_client_stream_factory( |
| 154 QuicCryptoClientStreamFactory::GetDefaultFactory()), |
| 155 proxy_delegate(nullptr) {} |
| 156 |
| 157 HttpNetworkSession::Context::Context(const Context& other) = default; |
| 158 |
| 159 HttpNetworkSession::Context::~Context() {} |
| 160 |
| 155 // TODO(mbelshe): Move the socket factories into HttpStreamFactory. | 161 // TODO(mbelshe): Move the socket factories into HttpStreamFactory. |
| 156 HttpNetworkSession::HttpNetworkSession(const Params& params) | 162 HttpNetworkSession::HttpNetworkSession(const Params& params, |
| 157 : net_log_(params.net_log), | 163 const Context& context) |
| 158 http_server_properties_(params.http_server_properties), | 164 : net_log_(context.net_log), |
| 159 cert_verifier_(params.cert_verifier), | 165 http_server_properties_(context.http_server_properties), |
| 160 http_auth_handler_factory_(params.http_auth_handler_factory), | 166 cert_verifier_(context.cert_verifier), |
| 161 proxy_service_(params.proxy_service), | 167 http_auth_handler_factory_(context.http_auth_handler_factory), |
| 162 ssl_config_service_(params.ssl_config_service), | 168 proxy_service_(context.proxy_service), |
| 169 ssl_config_service_(context.ssl_config_service), |
| 163 push_delegate_(nullptr), | 170 push_delegate_(nullptr), |
| 164 quic_stream_factory_( | 171 quic_stream_factory_( |
| 165 params.net_log, | 172 context.net_log, |
| 166 params.host_resolver, | 173 context.host_resolver, |
| 167 params.ssl_config_service, | 174 context.ssl_config_service, |
| 168 params.client_socket_factory | 175 context.client_socket_factory |
| 169 ? params.client_socket_factory | 176 ? context.client_socket_factory |
| 170 : ClientSocketFactory::GetDefaultFactory(), | 177 : ClientSocketFactory::GetDefaultFactory(), |
| 171 params.http_server_properties, | 178 context.http_server_properties, |
| 172 params.cert_verifier, | 179 context.cert_verifier, |
| 173 params.ct_policy_enforcer, | 180 context.ct_policy_enforcer, |
| 174 params.channel_id_service, | 181 context.channel_id_service, |
| 175 params.transport_security_state, | 182 context.transport_security_state, |
| 176 params.cert_transparency_verifier, | 183 context.cert_transparency_verifier, |
| 177 params.socket_performance_watcher_factory, | 184 context.socket_performance_watcher_factory, |
| 178 params.quic_crypto_client_stream_factory, | 185 context.quic_crypto_client_stream_factory, |
| 179 params.quic_random ? params.quic_random : QuicRandom::GetInstance(), | 186 context.quic_random ? context.quic_random : QuicRandom::GetInstance(), |
| 180 params.quic_clock ? params.quic_clock | 187 context.quic_clock ? context.quic_clock |
| 181 : QuicChromiumClock::GetInstance(), | 188 : QuicChromiumClock::GetInstance(), |
| 182 params.quic_max_packet_length, | 189 params.quic_max_packet_length, |
| 183 params.quic_user_agent_id, | 190 params.quic_user_agent_id, |
| 184 params.quic_supported_versions, | 191 params.quic_supported_versions, |
| 185 params.quic_max_server_configs_stored_in_properties > 0, | 192 params.quic_max_server_configs_stored_in_properties > 0, |
| 186 params.quic_close_sessions_on_ip_change, | 193 params.quic_close_sessions_on_ip_change, |
| 187 params.mark_quic_broken_when_network_blackholes, | 194 params.mark_quic_broken_when_network_blackholes, |
| 188 params.quic_idle_connection_timeout_seconds, | 195 params.quic_idle_connection_timeout_seconds, |
| 189 params.quic_reduced_ping_timeout_seconds, | 196 params.quic_reduced_ping_timeout_seconds, |
| 190 params.quic_packet_reader_yield_after_duration_milliseconds, | 197 params.quic_packet_reader_yield_after_duration_milliseconds, |
| 191 params.quic_migrate_sessions_on_network_change, | 198 params.quic_migrate_sessions_on_network_change, |
| 192 params.quic_migrate_sessions_early, | 199 params.quic_migrate_sessions_early, |
| 193 params.quic_allow_server_migration, | 200 params.quic_allow_server_migration, |
| 194 params.quic_force_hol_blocking, | 201 params.quic_force_hol_blocking, |
| 195 params.quic_race_cert_verification, | 202 params.quic_race_cert_verification, |
| 196 params.quic_do_not_fragment, | 203 params.quic_do_not_fragment, |
| 197 params.quic_estimate_initial_rtt, | 204 params.quic_estimate_initial_rtt, |
| 198 params.quic_connection_options, | 205 params.quic_connection_options, |
| 199 params.enable_token_binding), | 206 params.enable_token_binding), |
| 200 spdy_session_pool_(params.host_resolver, | 207 spdy_session_pool_(context.host_resolver, |
| 201 params.ssl_config_service, | 208 context.ssl_config_service, |
| 202 params.http_server_properties, | 209 context.http_server_properties, |
| 203 params.transport_security_state, | 210 context.transport_security_state, |
| 204 params.enable_spdy_ping_based_connection_checking, | 211 params.enable_spdy_ping_based_connection_checking, |
| 205 params.spdy_session_max_recv_window_size, | 212 params.spdy_session_max_recv_window_size, |
| 206 AddDefaultHttp2Settings(params.http2_settings), | 213 AddDefaultHttp2Settings(params.http2_settings), |
| 207 params.time_func, | 214 params.time_func, |
| 208 params.proxy_delegate), | 215 context.proxy_delegate), |
| 209 http_stream_factory_(new HttpStreamFactoryImpl(this, false)), | 216 http_stream_factory_(new HttpStreamFactoryImpl(this, false)), |
| 210 http_stream_factory_for_websocket_(new HttpStreamFactoryImpl(this, true)), | 217 http_stream_factory_for_websocket_(new HttpStreamFactoryImpl(this, true)), |
| 211 network_stream_throttler_(new NetworkThrottleManagerImpl()), | 218 network_stream_throttler_(new NetworkThrottleManagerImpl()), |
| 212 params_(params) { | 219 params_(params), |
| 220 context_(context) { |
| 213 DCHECK(proxy_service_); | 221 DCHECK(proxy_service_); |
| 214 DCHECK(ssl_config_service_.get()); | 222 DCHECK(ssl_config_service_.get()); |
| 215 CHECK(http_server_properties_); | 223 CHECK(http_server_properties_); |
| 216 | 224 |
| 217 const std::string ssl_session_cache_shard = | 225 const std::string ssl_session_cache_shard = |
| 218 "http_network_session/" + base::IntToString(g_next_shard_id.GetNext()); | 226 "http_network_session/" + base::IntToString(g_next_shard_id.GetNext()); |
| 219 normal_socket_pool_manager_.reset(CreateSocketPoolManager( | 227 normal_socket_pool_manager_.reset(CreateSocketPoolManager( |
| 220 NORMAL_SOCKET_POOL, params, ssl_session_cache_shard)); | 228 NORMAL_SOCKET_POOL, context, ssl_session_cache_shard)); |
| 221 websocket_socket_pool_manager_.reset(CreateSocketPoolManager( | 229 websocket_socket_pool_manager_.reset(CreateSocketPoolManager( |
| 222 WEBSOCKET_SOCKET_POOL, params, ssl_session_cache_shard)); | 230 WEBSOCKET_SOCKET_POOL, context, ssl_session_cache_shard)); |
| 223 | 231 |
| 224 if (params_.enable_http2) { | 232 if (params_.enable_http2) { |
| 225 next_protos_.push_back(kProtoHTTP2); | 233 next_protos_.push_back(kProtoHTTP2); |
| 226 } | 234 } |
| 227 | 235 |
| 228 next_protos_.push_back(kProtoHTTP11); | 236 next_protos_.push_back(kProtoHTTP11); |
| 229 | 237 |
| 230 http_server_properties_->SetMaxServerConfigsStoredInProperties( | 238 http_server_properties_->SetMaxServerConfigsStoredInProperties( |
| 231 params.quic_max_server_configs_stored_in_properties); | 239 params.quic_max_server_configs_stored_in_properties); |
| 232 | 240 |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 394 } | 402 } |
| 395 | 403 |
| 396 void HttpNetworkSession::GetSSLConfig(const HttpRequestInfo& request, | 404 void HttpNetworkSession::GetSSLConfig(const HttpRequestInfo& request, |
| 397 SSLConfig* server_config, | 405 SSLConfig* server_config, |
| 398 SSLConfig* proxy_config) const { | 406 SSLConfig* proxy_config) const { |
| 399 ssl_config_service_->GetSSLConfig(server_config); | 407 ssl_config_service_->GetSSLConfig(server_config); |
| 400 GetAlpnProtos(&server_config->alpn_protos); | 408 GetAlpnProtos(&server_config->alpn_protos); |
| 401 *proxy_config = *server_config; | 409 *proxy_config = *server_config; |
| 402 if (request.privacy_mode == PRIVACY_MODE_ENABLED) { | 410 if (request.privacy_mode == PRIVACY_MODE_ENABLED) { |
| 403 server_config->channel_id_enabled = false; | 411 server_config->channel_id_enabled = false; |
| 404 } else if (params_.enable_token_binding && params_.channel_id_service) { | 412 } else if (params_.enable_token_binding && context_.channel_id_service) { |
| 405 server_config->token_binding_params.push_back(TB_PARAM_ECDSAP256); | 413 server_config->token_binding_params.push_back(TB_PARAM_ECDSAP256); |
| 406 } | 414 } |
| 407 } | 415 } |
| 408 | 416 |
| 409 void HttpNetworkSession::DumpMemoryStats( | 417 void HttpNetworkSession::DumpMemoryStats( |
| 410 base::trace_event::ProcessMemoryDump* pmd, | 418 base::trace_event::ProcessMemoryDump* pmd, |
| 411 const std::string& parent_absolute_name) const { | 419 const std::string& parent_absolute_name) const { |
| 412 std::string name = base::StringPrintf("net/http_network_session_0x%" PRIxPTR, | 420 std::string name = base::StringPrintf("net/http_network_session_0x%" PRIxPTR, |
| 413 reinterpret_cast<uintptr_t>(this)); | 421 reinterpret_cast<uintptr_t>(this)); |
| 414 base::trace_event::MemoryAllocatorDump* http_network_session_dump = | 422 base::trace_event::MemoryAllocatorDump* http_network_session_dump = |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 468 CloseIdleConnections(); | 476 CloseIdleConnections(); |
| 469 break; | 477 break; |
| 470 } | 478 } |
| 471 } | 479 } |
| 472 | 480 |
| 473 void HttpNetworkSession::OnPurgeMemory() { | 481 void HttpNetworkSession::OnPurgeMemory() { |
| 474 CloseIdleConnections(); | 482 CloseIdleConnections(); |
| 475 } | 483 } |
| 476 | 484 |
| 477 } // namespace net | 485 } // namespace net |
| OLD | NEW |