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 |