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 <string> |
7 #include <tuple> | 8 #include <tuple> |
8 #include <utility> | |
9 | 9 |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "base/memory/ptr_util.h" | 11 #include "base/memory/ptr_util.h" |
12 #include "base/metrics/histogram_macros.h" | 12 #include "base/metrics/histogram_macros.h" |
13 #include "base/stl_util.h" | 13 #include "base/stl_util.h" |
14 #include "base/strings/string_util.h" | 14 #include "base/strings/string_util.h" |
15 #include "base/strings/stringprintf.h" | 15 #include "base/strings/stringprintf.h" |
16 #include "base/trace_event/memory_allocator_dump.h" | 16 #include "base/trace_event/memory_allocator_dump.h" |
17 #include "base/trace_event/memory_usage_estimator.h" | 17 #include "base/trace_event/memory_usage_estimator.h" |
18 #include "base/trace_event/process_memory_dump.h" | 18 #include "base/trace_event/process_memory_dump.h" |
19 #include "net/http/http_network_session.h" | 19 #include "net/http/http_network_session.h" |
20 #include "net/http/http_server_properties.h" | 20 #include "net/http/http_server_properties.h" |
21 #include "net/http/http_stream_factory_impl_job.h" | 21 #include "net/http/http_stream_factory_impl_job.h" |
22 #include "net/http/http_stream_factory_impl_job_controller.h" | 22 #include "net/http/http_stream_factory_impl_job_controller.h" |
23 #include "net/http/http_stream_factory_impl_request.h" | 23 #include "net/http/http_stream_factory_impl_request.h" |
24 #include "net/http/transport_security_state.h" | 24 #include "net/http/transport_security_state.h" |
25 #include "net/proxy/proxy_info.h" | 25 #include "net/proxy/proxy_info.h" |
26 #include "net/quic/core/quic_server_id.h" | 26 #include "net/quic/core/quic_server_id.h" |
27 #include "net/spdy/chromium/bidirectional_stream_spdy_impl.h" | 27 #include "net/spdy/chromium/bidirectional_stream_spdy_impl.h" |
28 #include "net/spdy/chromium/spdy_http_stream.h" | 28 #include "net/spdy/chromium/spdy_http_stream.h" |
29 #include "url/gurl.h" | 29 #include "url/gurl.h" |
30 #include "url/scheme_host_port.h" | 30 #include "url/scheme_host_port.h" |
31 #include "url/url_constants.h" | 31 #include "url/url_constants.h" |
32 | 32 |
33 namespace net { | 33 namespace net { |
34 | 34 |
| 35 namespace { |
| 36 // Default JobFactory for creating HttpStreamFactoryImpl::Jobs. |
| 37 class DefaultJobFactory : public HttpStreamFactoryImpl::JobFactory { |
| 38 public: |
| 39 DefaultJobFactory() {} |
| 40 |
| 41 ~DefaultJobFactory() override {} |
| 42 |
| 43 HttpStreamFactoryImpl::Job* CreateJob( |
| 44 HttpStreamFactoryImpl::Job::Delegate* delegate, |
| 45 HttpStreamFactoryImpl::JobType job_type, |
| 46 HttpNetworkSession* session, |
| 47 const HttpRequestInfo& request_info, |
| 48 RequestPriority priority, |
| 49 const SSLConfig& server_ssl_config, |
| 50 const SSLConfig& proxy_ssl_config, |
| 51 HostPortPair destination, |
| 52 GURL origin_url, |
| 53 bool enable_ip_based_pooling, |
| 54 NetLog* net_log) override { |
| 55 return new HttpStreamFactoryImpl::Job( |
| 56 delegate, job_type, session, request_info, priority, server_ssl_config, |
| 57 proxy_ssl_config, destination, origin_url, enable_ip_based_pooling, |
| 58 net_log); |
| 59 } |
| 60 |
| 61 HttpStreamFactoryImpl::Job* CreateJob( |
| 62 HttpStreamFactoryImpl::Job::Delegate* delegate, |
| 63 HttpStreamFactoryImpl::JobType job_type, |
| 64 HttpNetworkSession* session, |
| 65 const HttpRequestInfo& request_info, |
| 66 RequestPriority priority, |
| 67 const SSLConfig& server_ssl_config, |
| 68 const SSLConfig& proxy_ssl_config, |
| 69 HostPortPair destination, |
| 70 GURL origin_url, |
| 71 AlternativeService alternative_service, |
| 72 bool enable_ip_based_pooling, |
| 73 NetLog* net_log) override { |
| 74 return new HttpStreamFactoryImpl::Job( |
| 75 delegate, job_type, session, request_info, priority, server_ssl_config, |
| 76 proxy_ssl_config, destination, origin_url, alternative_service, |
| 77 ProxyServer(), enable_ip_based_pooling, net_log); |
| 78 } |
| 79 |
| 80 HttpStreamFactoryImpl::Job* CreateJob( |
| 81 HttpStreamFactoryImpl::Job::Delegate* delegate, |
| 82 HttpStreamFactoryImpl::JobType job_type, |
| 83 HttpNetworkSession* session, |
| 84 const HttpRequestInfo& request_info, |
| 85 RequestPriority priority, |
| 86 const SSLConfig& server_ssl_config, |
| 87 const SSLConfig& proxy_ssl_config, |
| 88 HostPortPair destination, |
| 89 GURL origin_url, |
| 90 const ProxyServer& alternative_proxy_server, |
| 91 bool enable_ip_based_pooling, |
| 92 NetLog* net_log) override { |
| 93 return new HttpStreamFactoryImpl::Job( |
| 94 delegate, job_type, session, request_info, priority, server_ssl_config, |
| 95 proxy_ssl_config, destination, origin_url, AlternativeService(), |
| 96 alternative_proxy_server, enable_ip_based_pooling, net_log); |
| 97 } |
| 98 }; |
| 99 |
| 100 } // anonymous namespace |
| 101 |
35 HttpStreamFactoryImpl::HttpStreamFactoryImpl(HttpNetworkSession* session, | 102 HttpStreamFactoryImpl::HttpStreamFactoryImpl(HttpNetworkSession* session, |
36 bool for_websockets) | 103 bool for_websockets) |
37 : session_(session), | 104 : session_(session), |
38 job_factory_(new JobFactory()), | 105 job_factory_(new DefaultJobFactory()), |
39 for_websockets_(for_websockets), | 106 for_websockets_(for_websockets), |
40 last_logged_job_controller_count_(0) {} | 107 last_logged_job_controller_count_(0) {} |
41 | 108 |
42 HttpStreamFactoryImpl::~HttpStreamFactoryImpl() { | 109 HttpStreamFactoryImpl::~HttpStreamFactoryImpl() { |
43 DCHECK(spdy_session_request_map_.empty()); | 110 DCHECK(spdy_session_request_map_.empty()); |
44 UMA_HISTOGRAM_COUNTS_1M("Net.JobControllerSet.CountOfJobControllerAtShutDown", | 111 UMA_HISTOGRAM_COUNTS_1M("Net.JobControllerSet.CountOfJobControllerAtShutDown", |
45 job_controller_set_.size()); | 112 job_controller_set_.size()); |
46 } | 113 } |
47 | 114 |
48 std::unique_ptr<HttpStreamRequest> HttpStreamFactoryImpl::RequestStream( | 115 HttpStreamRequest* HttpStreamFactoryImpl::RequestStream( |
49 const HttpRequestInfo& request_info, | 116 const HttpRequestInfo& request_info, |
50 RequestPriority priority, | 117 RequestPriority priority, |
51 const SSLConfig& server_ssl_config, | 118 const SSLConfig& server_ssl_config, |
52 const SSLConfig& proxy_ssl_config, | 119 const SSLConfig& proxy_ssl_config, |
53 HttpStreamRequest::Delegate* delegate, | 120 HttpStreamRequest::Delegate* delegate, |
54 bool enable_ip_based_pooling, | 121 bool enable_ip_based_pooling, |
55 bool enable_alternative_services, | 122 bool enable_alternative_services, |
56 const NetLogWithSource& net_log) { | 123 const NetLogWithSource& net_log) { |
57 DCHECK(!for_websockets_); | 124 DCHECK(!for_websockets_); |
58 return RequestStreamInternal( | 125 return RequestStreamInternal( |
59 request_info, priority, server_ssl_config, proxy_ssl_config, delegate, | 126 request_info, priority, server_ssl_config, proxy_ssl_config, delegate, |
60 nullptr, HttpStreamRequest::HTTP_STREAM, enable_ip_based_pooling, | 127 nullptr, HttpStreamRequest::HTTP_STREAM, enable_ip_based_pooling, |
61 enable_alternative_services, net_log); | 128 enable_alternative_services, net_log); |
62 } | 129 } |
63 | 130 |
64 std::unique_ptr<HttpStreamRequest> | 131 HttpStreamRequest* HttpStreamFactoryImpl::RequestWebSocketHandshakeStream( |
65 HttpStreamFactoryImpl::RequestWebSocketHandshakeStream( | |
66 const HttpRequestInfo& request_info, | 132 const HttpRequestInfo& request_info, |
67 RequestPriority priority, | 133 RequestPriority priority, |
68 const SSLConfig& server_ssl_config, | 134 const SSLConfig& server_ssl_config, |
69 const SSLConfig& proxy_ssl_config, | 135 const SSLConfig& proxy_ssl_config, |
70 HttpStreamRequest::Delegate* delegate, | 136 HttpStreamRequest::Delegate* delegate, |
71 WebSocketHandshakeStreamBase::CreateHelper* create_helper, | 137 WebSocketHandshakeStreamBase::CreateHelper* create_helper, |
72 bool enable_ip_based_pooling, | 138 bool enable_ip_based_pooling, |
73 bool enable_alternative_services, | 139 bool enable_alternative_services, |
74 const NetLogWithSource& net_log) { | 140 const NetLogWithSource& net_log) { |
75 DCHECK(for_websockets_); | 141 DCHECK(for_websockets_); |
76 DCHECK(create_helper); | 142 DCHECK(create_helper); |
77 return RequestStreamInternal( | 143 return RequestStreamInternal( |
78 request_info, priority, server_ssl_config, proxy_ssl_config, delegate, | 144 request_info, priority, server_ssl_config, proxy_ssl_config, delegate, |
79 create_helper, HttpStreamRequest::HTTP_STREAM, enable_ip_based_pooling, | 145 create_helper, HttpStreamRequest::HTTP_STREAM, enable_ip_based_pooling, |
80 enable_alternative_services, net_log); | 146 enable_alternative_services, net_log); |
81 } | 147 } |
82 | 148 |
83 std::unique_ptr<HttpStreamRequest> | 149 HttpStreamRequest* HttpStreamFactoryImpl::RequestBidirectionalStreamImpl( |
84 HttpStreamFactoryImpl::RequestBidirectionalStreamImpl( | |
85 const HttpRequestInfo& request_info, | 150 const HttpRequestInfo& request_info, |
86 RequestPriority priority, | 151 RequestPriority priority, |
87 const SSLConfig& server_ssl_config, | 152 const SSLConfig& server_ssl_config, |
88 const SSLConfig& proxy_ssl_config, | 153 const SSLConfig& proxy_ssl_config, |
89 HttpStreamRequest::Delegate* delegate, | 154 HttpStreamRequest::Delegate* delegate, |
90 bool enable_ip_based_pooling, | 155 bool enable_ip_based_pooling, |
91 bool enable_alternative_services, | 156 bool enable_alternative_services, |
92 const NetLogWithSource& net_log) { | 157 const NetLogWithSource& net_log) { |
93 DCHECK(!for_websockets_); | 158 DCHECK(!for_websockets_); |
94 DCHECK(request_info.url.SchemeIs(url::kHttpsScheme)); | 159 DCHECK(request_info.url.SchemeIs(url::kHttpsScheme)); |
95 | 160 |
96 return RequestStreamInternal( | 161 return RequestStreamInternal( |
97 request_info, priority, server_ssl_config, proxy_ssl_config, delegate, | 162 request_info, priority, server_ssl_config, proxy_ssl_config, delegate, |
98 nullptr, HttpStreamRequest::BIDIRECTIONAL_STREAM, enable_ip_based_pooling, | 163 nullptr, HttpStreamRequest::BIDIRECTIONAL_STREAM, enable_ip_based_pooling, |
99 enable_alternative_services, net_log); | 164 enable_alternative_services, net_log); |
100 } | 165 } |
101 | 166 |
102 std::unique_ptr<HttpStreamRequest> HttpStreamFactoryImpl::RequestStreamInternal( | 167 HttpStreamRequest* HttpStreamFactoryImpl::RequestStreamInternal( |
103 const HttpRequestInfo& request_info, | 168 const HttpRequestInfo& request_info, |
104 RequestPriority priority, | 169 RequestPriority priority, |
105 const SSLConfig& server_ssl_config, | 170 const SSLConfig& server_ssl_config, |
106 const SSLConfig& proxy_ssl_config, | 171 const SSLConfig& proxy_ssl_config, |
107 HttpStreamRequest::Delegate* delegate, | 172 HttpStreamRequest::Delegate* delegate, |
108 WebSocketHandshakeStreamBase::CreateHelper* | 173 WebSocketHandshakeStreamBase::CreateHelper* |
109 websocket_handshake_stream_create_helper, | 174 websocket_handshake_stream_create_helper, |
110 HttpStreamRequest::StreamType stream_type, | 175 HttpStreamRequest::StreamType stream_type, |
111 bool enable_ip_based_pooling, | 176 bool enable_ip_based_pooling, |
112 bool enable_alternative_services, | 177 bool enable_alternative_services, |
113 const NetLogWithSource& net_log) { | 178 const NetLogWithSource& net_log) { |
114 AddJobControllerCountToHistograms(); | 179 AddJobControllerCountToHistograms(); |
115 | 180 |
116 auto job_controller = base::MakeUnique<JobController>( | 181 auto job_controller = base::MakeUnique<JobController>( |
117 this, delegate, session_, job_factory_.get(), request_info, | 182 this, delegate, session_, job_factory_.get(), request_info, |
118 /* is_preconnect = */ false, enable_ip_based_pooling, | 183 /* is_preconnect = */ false, enable_ip_based_pooling, |
119 enable_alternative_services, server_ssl_config, proxy_ssl_config); | 184 enable_alternative_services); |
120 JobController* job_controller_raw_ptr = job_controller.get(); | 185 JobController* job_controller_raw_ptr = job_controller.get(); |
121 job_controller_set_.insert(std::move(job_controller)); | 186 job_controller_set_.insert(std::move(job_controller)); |
122 return job_controller_raw_ptr->Start(delegate, | 187 Request* request = job_controller_raw_ptr->Start( |
123 websocket_handshake_stream_create_helper, | 188 request_info, delegate, websocket_handshake_stream_create_helper, net_log, |
124 net_log, stream_type, priority); | 189 stream_type, priority, server_ssl_config, proxy_ssl_config); |
| 190 |
| 191 return request; |
125 } | 192 } |
126 | 193 |
127 void HttpStreamFactoryImpl::PreconnectStreams( | 194 void HttpStreamFactoryImpl::PreconnectStreams( |
128 int num_streams, | 195 int num_streams, |
129 const HttpRequestInfo& request_info) { | 196 const HttpRequestInfo& request_info) { |
130 DCHECK(request_info.url.is_valid()); | 197 DCHECK(request_info.url.is_valid()); |
131 | 198 |
132 AddJobControllerCountToHistograms(); | 199 AddJobControllerCountToHistograms(); |
133 | 200 |
134 SSLConfig server_ssl_config; | 201 SSLConfig server_ssl_config; |
135 SSLConfig proxy_ssl_config; | 202 SSLConfig proxy_ssl_config; |
136 session_->GetSSLConfig(request_info, &server_ssl_config, &proxy_ssl_config); | 203 session_->GetSSLConfig(request_info, &server_ssl_config, &proxy_ssl_config); |
137 // All preconnects should perform EV certificate verification. | 204 // All preconnects should perform EV certificate verification. |
138 server_ssl_config.verify_ev_cert = true; | 205 server_ssl_config.verify_ev_cert = true; |
139 proxy_ssl_config.verify_ev_cert = true; | 206 proxy_ssl_config.verify_ev_cert = true; |
140 | 207 |
141 DCHECK(!for_websockets_); | 208 DCHECK(!for_websockets_); |
142 | 209 |
143 auto job_controller = base::MakeUnique<JobController>( | 210 auto job_controller = base::MakeUnique<JobController>( |
144 this, nullptr, session_, job_factory_.get(), request_info, | 211 this, nullptr, session_, job_factory_.get(), request_info, |
145 /* is_preconnect = */ true, | 212 /* is_preconnect = */ true, |
146 /* enable_ip_based_pooling = */ true, | 213 /* enable_ip_based_pooling = */ true, |
147 /* enable_alternative_services = */ true, server_ssl_config, | 214 /* enable_alternative_services = */ true); |
148 proxy_ssl_config); | |
149 JobController* job_controller_raw_ptr = job_controller.get(); | 215 JobController* job_controller_raw_ptr = job_controller.get(); |
150 job_controller_set_.insert(std::move(job_controller)); | 216 job_controller_set_.insert(std::move(job_controller)); |
151 job_controller_raw_ptr->Preconnect(num_streams); | 217 job_controller_raw_ptr->Preconnect(num_streams, request_info, |
| 218 server_ssl_config, proxy_ssl_config); |
152 } | 219 } |
153 | 220 |
154 const HostMappingRules* HttpStreamFactoryImpl::GetHostMappingRules() const { | 221 const HostMappingRules* HttpStreamFactoryImpl::GetHostMappingRules() const { |
155 return session_->params().host_mapping_rules; | 222 return session_->params().host_mapping_rules; |
156 } | 223 } |
157 | 224 |
158 void HttpStreamFactoryImpl::OnNewSpdySessionReady( | 225 void HttpStreamFactoryImpl::OnNewSpdySessionReady( |
159 const base::WeakPtr<SpdySession>& spdy_session, | 226 const base::WeakPtr<SpdySession>& spdy_session, |
160 bool direct, | 227 bool direct, |
161 const SSLConfig& used_ssl_config, | 228 const SSLConfig& used_ssl_config, |
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
385 factory_dump->AddScalar("main_job_count", | 452 factory_dump->AddScalar("main_job_count", |
386 base::trace_event::MemoryAllocatorDump::kUnitsObjects, | 453 base::trace_event::MemoryAllocatorDump::kUnitsObjects, |
387 main_job_count); | 454 main_job_count); |
388 // The number of preconnect controllers. | 455 // The number of preconnect controllers. |
389 factory_dump->AddScalar("preconnect_count", | 456 factory_dump->AddScalar("preconnect_count", |
390 base::trace_event::MemoryAllocatorDump::kUnitsObjects, | 457 base::trace_event::MemoryAllocatorDump::kUnitsObjects, |
391 num_controllers_for_preconnect); | 458 num_controllers_for_preconnect); |
392 } | 459 } |
393 | 460 |
394 } // namespace net | 461 } // namespace net |
OLD | NEW |