Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(978)

Side by Side Diff: content/browser/loader/resource_loader.cc

Issue 2327433002: Stop using CertStore which is not compatible with PlzNavigate. (Closed)
Patch Set: remove cert_store on ios Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "content/browser/loader/resource_loader.h" 5 #include "content/browser/loader/resource_loader.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/location.h" 10 #include "base/location.h"
11 #include "base/metrics/histogram_macros.h" 11 #include "base/metrics/histogram_macros.h"
12 #include "base/profiler/scoped_tracker.h" 12 #include "base/profiler/scoped_tracker.h"
13 #include "base/single_thread_task_runner.h" 13 #include "base/single_thread_task_runner.h"
14 #include "base/threading/thread_task_runner_handle.h" 14 #include "base/threading/thread_task_runner_handle.h"
15 #include "base/time/time.h" 15 #include "base/time/time.h"
16 #include "base/trace_event/trace_event.h" 16 #include "base/trace_event/trace_event.h"
17 #include "content/browser/appcache/appcache_interceptor.h" 17 #include "content/browser/appcache/appcache_interceptor.h"
18 #include "content/browser/child_process_security_policy_impl.h" 18 #include "content/browser/child_process_security_policy_impl.h"
19 #include "content/browser/loader/cross_site_resource_handler.h" 19 #include "content/browser/loader/cross_site_resource_handler.h"
20 #include "content/browser/loader/detachable_resource_handler.h" 20 #include "content/browser/loader/detachable_resource_handler.h"
21 #include "content/browser/loader/resource_loader_delegate.h" 21 #include "content/browser/loader/resource_loader_delegate.h"
22 #include "content/browser/loader/resource_request_info_impl.h" 22 #include "content/browser/loader/resource_request_info_impl.h"
23 #include "content/browser/service_worker/service_worker_request_handler.h" 23 #include "content/browser/service_worker/service_worker_request_handler.h"
24 #include "content/browser/service_worker/service_worker_response_info.h" 24 #include "content/browser/service_worker/service_worker_response_info.h"
25 #include "content/browser/ssl/ssl_client_auth_handler.h" 25 #include "content/browser/ssl/ssl_client_auth_handler.h"
26 #include "content/browser/ssl/ssl_manager.h" 26 #include "content/browser/ssl/ssl_manager.h"
27 #include "content/browser/ssl/ssl_policy.h" 27 #include "content/browser/ssl/ssl_policy.h"
28 #include "content/common/security_style_util.h" 28 #include "content/common/security_style_util.h"
29 #include "content/public/browser/cert_store.h"
30 #include "content/public/browser/resource_dispatcher_host_login_delegate.h" 29 #include "content/public/browser/resource_dispatcher_host_login_delegate.h"
31 #include "content/public/common/content_client.h" 30 #include "content/public/common/content_client.h"
32 #include "content/public/common/content_switches.h" 31 #include "content/public/common/content_switches.h"
33 #include "content/public/common/process_type.h" 32 #include "content/public/common/process_type.h"
34 #include "content/public/common/resource_response.h" 33 #include "content/public/common/resource_response.h"
35 #include "content/public/common/resource_type.h" 34 #include "content/public/common/resource_type.h"
36 #include "content/public/common/security_style.h" 35 #include "content/public/common/security_style.h"
37 #include "content/public/common/ssl_status.h" 36 #include "content/public/common/ssl_status.h"
38 #include "net/base/io_buffer.h" 37 #include "net/base/io_buffer.h"
39 #include "net/base/load_flags.h" 38 #include "net/base/load_flags.h"
40 #include "net/http/http_response_headers.h" 39 #include "net/http/http_response_headers.h"
41 #include "net/nqe/effective_connection_type.h" 40 #include "net/nqe/effective_connection_type.h"
42 #include "net/nqe/network_quality_estimator.h" 41 #include "net/nqe/network_quality_estimator.h"
43 #include "net/ssl/client_cert_store.h" 42 #include "net/ssl/client_cert_store.h"
44 #include "net/ssl/ssl_platform_key.h" 43 #include "net/ssl/ssl_platform_key.h"
45 #include "net/ssl/ssl_private_key.h" 44 #include "net/ssl/ssl_private_key.h"
46 #include "net/url_request/redirect_info.h" 45 #include "net/url_request/redirect_info.h"
47 #include "net/url_request/url_request_context.h" 46 #include "net/url_request/url_request_context.h"
48 #include "net/url_request/url_request_status.h" 47 #include "net/url_request/url_request_status.h"
49 48
50 using base::TimeDelta; 49 using base::TimeDelta;
51 using base::TimeTicks; 50 using base::TimeTicks;
52 51
53 namespace content { 52 namespace content {
54 namespace { 53 namespace {
55 54
56 void PopulateResourceResponse(ResourceRequestInfoImpl* info, 55 void PopulateResourceResponse(ResourceRequestInfoImpl* info,
57 net::URLRequest* request, 56 net::URLRequest* request,
58 CertStore* cert_store,
59 ResourceResponse* response) { 57 ResourceResponse* response) {
60 response->head.request_time = request->request_time(); 58 response->head.request_time = request->request_time();
61 response->head.response_time = request->response_time(); 59 response->head.response_time = request->response_time();
62 response->head.headers = request->response_headers(); 60 response->head.headers = request->response_headers();
63 request->GetCharset(&response->head.charset); 61 request->GetCharset(&response->head.charset);
64 response->head.content_length = request->GetExpectedContentSize(); 62 response->head.content_length = request->GetExpectedContentSize();
65 request->GetMimeType(&response->head.mime_type); 63 request->GetMimeType(&response->head.mime_type);
66 net::HttpResponseInfo response_info = request->response_info(); 64 net::HttpResponseInfo response_info = request->response_info();
67 response->head.was_fetched_via_spdy = response_info.was_fetched_via_spdy; 65 response->head.was_fetched_via_spdy = response_info.was_fetched_via_spdy;
68 response->head.was_npn_negotiated = response_info.was_npn_negotiated; 66 response->head.was_npn_negotiated = response_info.was_npn_negotiated;
(...skipping 29 matching lines...) Expand all
98 request, &response->head.appcache_id, 96 request, &response->head.appcache_id,
99 &response->head.appcache_manifest_url); 97 &response->head.appcache_manifest_url);
100 if (info->is_load_timing_enabled()) 98 if (info->is_load_timing_enabled())
101 request->GetLoadTimingInfo(&response->head.load_timing); 99 request->GetLoadTimingInfo(&response->head.load_timing);
102 100
103 if (request->ssl_info().cert.get()) { 101 if (request->ssl_info().cert.get()) {
104 SSLStatus ssl_status; 102 SSLStatus ssl_status;
105 // TODO(jam): keep this call temporarily since it's what adds the 103 // TODO(jam): keep this call temporarily since it's what adds the
106 // certificate to the CertStore. 104 // certificate to the CertStore.
107 ResourceLoader::GetSSLStatusForRequest( 105 ResourceLoader::GetSSLStatusForRequest(
108 request->url(), request->ssl_info(), info->GetChildID(), 106 request->url(), request->ssl_info(), info->GetChildID(), &ssl_status);
109 cert_store, &ssl_status);
110 response->head.has_major_certificate_errors = 107 response->head.has_major_certificate_errors =
111 net::IsCertStatusError(request->ssl_info().cert_status) && 108 net::IsCertStatusError(request->ssl_info().cert_status) &&
112 !net::IsCertStatusMinorError(request->ssl_info().cert_status); 109 !net::IsCertStatusMinorError(request->ssl_info().cert_status);
113 if (info->ShouldReportRawHeaders()) { 110 if (info->ShouldReportRawHeaders()) {
114 // Only pass these members when the network panel of the DevTools is open, 111 // Only pass these members when the network panel of the DevTools is open,
115 // i.e. ShouldReportRawHeaders() is set. These data are used to populate 112 // i.e. ShouldReportRawHeaders() is set. These data are used to populate
116 // the requests in the security panel too. 113 // the requests in the security panel too.
117 response->head.cert_status = request->ssl_info().cert_status; 114 response->head.cert_status = request->ssl_info().cert_status;
118 response->head.ssl_connection_status = 115 response->head.ssl_connection_status =
119 request->ssl_info().connection_status; 116 request->ssl_info().connection_status;
(...skipping 18 matching lines...) Expand all
138 DCHECK_EQ(request->ssl_info().key_exchange_info, 0); 135 DCHECK_EQ(request->ssl_info().key_exchange_info, 0);
139 DCHECK(!request->ssl_info().connection_status); 136 DCHECK(!request->ssl_info().connection_status);
140 } 137 }
141 } 138 }
142 139
143 } // namespace 140 } // namespace
144 141
145 void ResourceLoader::GetSSLStatusForRequest(const GURL& url, 142 void ResourceLoader::GetSSLStatusForRequest(const GURL& url,
146 const net::SSLInfo& ssl_info, 143 const net::SSLInfo& ssl_info,
147 int child_id, 144 int child_id,
148 CertStore* cert_store,
149 SSLStatus* ssl_status) { 145 SSLStatus* ssl_status) {
150 DCHECK(ssl_info.cert); 146 DCHECK(ssl_info.cert);
151 int cert_id = cert_store->StoreCert(ssl_info.cert.get(), child_id);
152
153 *ssl_status = SSLStatus(GetSecurityStyleForResource( 147 *ssl_status = SSLStatus(GetSecurityStyleForResource(
154 url, !!cert_id, ssl_info.cert_status), 148 url, !!ssl_info.cert, ssl_info.cert_status),
155 cert_id, ssl_info); 149 ssl_info.cert, ssl_info);
156 } 150 }
157 151
158 ResourceLoader::ResourceLoader(std::unique_ptr<net::URLRequest> request, 152 ResourceLoader::ResourceLoader(std::unique_ptr<net::URLRequest> request,
159 std::unique_ptr<ResourceHandler> handler, 153 std::unique_ptr<ResourceHandler> handler,
160 CertStore* cert_store,
161 ResourceLoaderDelegate* delegate) 154 ResourceLoaderDelegate* delegate)
162 : deferred_stage_(DEFERRED_NONE), 155 : deferred_stage_(DEFERRED_NONE),
163 request_(std::move(request)), 156 request_(std::move(request)),
164 handler_(std::move(handler)), 157 handler_(std::move(handler)),
165 delegate_(delegate), 158 delegate_(delegate),
166 is_transferring_(false), 159 is_transferring_(false),
167 times_cancelled_before_request_start_(0), 160 times_cancelled_before_request_start_(0),
168 started_request_(false), 161 started_request_(false),
169 times_cancelled_after_request_start_(0), 162 times_cancelled_after_request_start_(0),
170 cert_store_(cert_store),
171 weak_ptr_factory_(this) { 163 weak_ptr_factory_(this) {
172 request_->set_delegate(this); 164 request_->set_delegate(this);
173 handler_->SetController(this); 165 handler_->SetController(this);
174 } 166 }
175 167
176 ResourceLoader::~ResourceLoader() { 168 ResourceLoader::~ResourceLoader() {
177 if (login_delegate_.get()) 169 if (login_delegate_.get())
178 login_delegate_->OnRequestCancelled(); 170 login_delegate_->OnRequestCancelled();
179 ssl_client_auth_handler_.reset(); 171 ssl_client_auth_handler_.reset();
180 172
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
221 TRACE_EVENT_WITH_FLOW0("loading", "ResourceLoader::CancelWithError", this, 213 TRACE_EVENT_WITH_FLOW0("loading", "ResourceLoader::CancelWithError", this,
222 TRACE_EVENT_FLAG_FLOW_IN); 214 TRACE_EVENT_FLAG_FLOW_IN);
223 CancelRequestInternal(error_code, false); 215 CancelRequestInternal(error_code, false);
224 } 216 }
225 217
226 void ResourceLoader::MarkAsTransferring( 218 void ResourceLoader::MarkAsTransferring(
227 const scoped_refptr<ResourceResponse>& response) { 219 const scoped_refptr<ResourceResponse>& response) {
228 CHECK(IsResourceTypeFrame(GetRequestInfo()->GetResourceType())) 220 CHECK(IsResourceTypeFrame(GetRequestInfo()->GetResourceType()))
229 << "Can only transfer for navigations"; 221 << "Can only transfer for navigations";
230 is_transferring_ = true; 222 is_transferring_ = true;
231 transferring_response_ = response;
232 223
233 int child_id = GetRequestInfo()->GetChildID(); 224 int child_id = GetRequestInfo()->GetChildID();
234 AppCacheInterceptor::PrepareForCrossSiteTransfer(request(), child_id); 225 AppCacheInterceptor::PrepareForCrossSiteTransfer(request(), child_id);
235 ServiceWorkerRequestHandler* handler = 226 ServiceWorkerRequestHandler* handler =
236 ServiceWorkerRequestHandler::GetHandler(request()); 227 ServiceWorkerRequestHandler::GetHandler(request());
237 if (handler) 228 if (handler)
238 handler->PrepareForCrossSiteTransfer(child_id); 229 handler->PrepareForCrossSiteTransfer(child_id);
239 } 230 }
240 231
241 void ResourceLoader::CompleteTransfer() { 232 void ResourceLoader::CompleteTransfer() {
242 // Although CrossSiteResourceHandler defers at OnResponseStarted 233 // Although CrossSiteResourceHandler defers at OnResponseStarted
243 // (DEFERRED_READ), it may be seeing a replay of events via 234 // (DEFERRED_READ), it may be seeing a replay of events via
244 // MimeTypeResourceHandler, and so the request itself is actually deferred 235 // MimeTypeResourceHandler, and so the request itself is actually deferred
245 // at a later read stage. 236 // at a later read stage.
246 DCHECK(DEFERRED_READ == deferred_stage_ || 237 DCHECK(DEFERRED_READ == deferred_stage_ ||
247 DEFERRED_RESPONSE_COMPLETE == deferred_stage_); 238 DEFERRED_RESPONSE_COMPLETE == deferred_stage_);
248 DCHECK(is_transferring_); 239 DCHECK(is_transferring_);
249 DCHECK(transferring_response_);
250 240
251 // In some cases, a process transfer doesn't really happen and the 241 // In some cases, a process transfer doesn't really happen and the
252 // request is resumed in the original process. Real transfers to a new process 242 // request is resumed in the original process. Real transfers to a new process
253 // are completed via ResourceDispatcherHostImpl::UpdateRequestForTransfer. 243 // are completed via ResourceDispatcherHostImpl::UpdateRequestForTransfer.
254 int child_id = GetRequestInfo()->GetChildID(); 244 int child_id = GetRequestInfo()->GetChildID();
255 AppCacheInterceptor::MaybeCompleteCrossSiteTransferInOldProcess( 245 AppCacheInterceptor::MaybeCompleteCrossSiteTransferInOldProcess(
256 request(), child_id); 246 request(), child_id);
257 ServiceWorkerRequestHandler* handler = 247 ServiceWorkerRequestHandler* handler =
258 ServiceWorkerRequestHandler::GetHandler(request()); 248 ServiceWorkerRequestHandler::GetHandler(request());
259 if (handler) 249 if (handler)
260 handler->MaybeCompleteCrossSiteTransferInOldProcess(child_id); 250 handler->MaybeCompleteCrossSiteTransferInOldProcess(child_id);
261 251
262 is_transferring_ = false; 252 is_transferring_ = false;
263 transferring_response_ = nullptr;
264 GetRequestInfo()->cross_site_handler()->ResumeResponse(); 253 GetRequestInfo()->cross_site_handler()->ResumeResponse();
265 } 254 }
266 255
267 ResourceRequestInfoImpl* ResourceLoader::GetRequestInfo() { 256 ResourceRequestInfoImpl* ResourceLoader::GetRequestInfo() {
268 return ResourceRequestInfoImpl::ForRequest(request_.get()); 257 return ResourceRequestInfoImpl::ForRequest(request_.get());
269 } 258 }
270 259
271 void ResourceLoader::ClearLoginDelegate() { 260 void ResourceLoader::ClearLoginDelegate() {
272 login_delegate_ = NULL; 261 login_delegate_ = NULL;
273 } 262 }
(...skipping 20 matching lines...) Expand all
294 return; 283 return;
295 } 284 }
296 285
297 if (delegate_->HandleExternalProtocol(this, redirect_info.new_url)) { 286 if (delegate_->HandleExternalProtocol(this, redirect_info.new_url)) {
298 // The request is complete so we can remove it. 287 // The request is complete so we can remove it.
299 CancelAndIgnore(); 288 CancelAndIgnore();
300 return; 289 return;
301 } 290 }
302 291
303 scoped_refptr<ResourceResponse> response = new ResourceResponse(); 292 scoped_refptr<ResourceResponse> response = new ResourceResponse();
304 PopulateResourceResponse(info, request_.get(), cert_store_, response.get()); 293 PopulateResourceResponse(info, request_.get(), response.get());
305 delegate_->DidReceiveRedirect(this, redirect_info.new_url, response.get()); 294 delegate_->DidReceiveRedirect(this, redirect_info.new_url, response.get());
306 if (!handler_->OnRequestRedirected(redirect_info, response.get(), defer)) { 295 if (!handler_->OnRequestRedirected(redirect_info, response.get(), defer)) {
307 Cancel(); 296 Cancel();
308 } else if (*defer) { 297 } else if (*defer) {
309 deferred_stage_ = DEFERRED_REDIRECT; // Follow redirect when resumed. 298 deferred_stage_ = DEFERRED_REDIRECT; // Follow redirect when resumed.
310 } 299 }
311 } 300 }
312 301
313 void ResourceLoader::OnAuthRequired(net::URLRequest* unused, 302 void ResourceLoader::OnAuthRequired(net::URLRequest* unused,
314 net::AuthChallengeInfo* auth_info) { 303 net::AuthChallengeInfo* auth_info) {
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
557 // this request. 546 // this request.
558 base::ThreadTaskRunnerHandle::Get()->PostTask( 547 base::ThreadTaskRunnerHandle::Get()->PostTask(
559 FROM_HERE, base::Bind(&ResourceLoader::ResponseCompleted, 548 FROM_HERE, base::Bind(&ResourceLoader::ResponseCompleted,
560 weak_ptr_factory_.GetWeakPtr())); 549 weak_ptr_factory_.GetWeakPtr()));
561 } 550 }
562 } 551 }
563 552
564 void ResourceLoader::CompleteResponseStarted() { 553 void ResourceLoader::CompleteResponseStarted() {
565 ResourceRequestInfoImpl* info = GetRequestInfo(); 554 ResourceRequestInfoImpl* info = GetRequestInfo();
566 scoped_refptr<ResourceResponse> response = new ResourceResponse(); 555 scoped_refptr<ResourceResponse> response = new ResourceResponse();
567 PopulateResourceResponse(info, request_.get(), cert_store_, response.get()); 556 PopulateResourceResponse(info, request_.get(), response.get());
568 557
569 delegate_->DidReceiveResponse(this); 558 delegate_->DidReceiveResponse(this);
570 559
571 // TODO(darin): Remove ScopedTracker below once crbug.com/475761 is fixed. 560 // TODO(darin): Remove ScopedTracker below once crbug.com/475761 is fixed.
572 tracked_objects::ScopedTracker tracking_profile( 561 tracked_objects::ScopedTracker tracking_profile(
573 FROM_HERE_WITH_EXPLICIT_FUNCTION("475761 OnResponseStarted()")); 562 FROM_HERE_WITH_EXPLICIT_FUNCTION("475761 OnResponseStarted()"));
574 563
575 bool defer = false; 564 bool defer = false;
576 if (!handler_->OnResponseStarted(response.get(), &defer)) { 565 if (!handler_->OnResponseStarted(response.get(), &defer)) {
577 Cancel(); 566 Cancel();
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
678 DVLOG(1) << "ResponseCompleted: " << request_->url().spec(); 667 DVLOG(1) << "ResponseCompleted: " << request_->url().spec();
679 RecordHistograms(); 668 RecordHistograms();
680 ResourceRequestInfoImpl* info = GetRequestInfo(); 669 ResourceRequestInfoImpl* info = GetRequestInfo();
681 670
682 const net::SSLInfo& ssl_info = request_->ssl_info(); 671 const net::SSLInfo& ssl_info = request_->ssl_info();
683 if (ssl_info.cert.get() != NULL) { 672 if (ssl_info.cert.get() != NULL) {
684 SSLStatus ssl_status; 673 SSLStatus ssl_status;
685 // TODO(jam): keep this call temporarily since it's what adds the 674 // TODO(jam): keep this call temporarily since it's what adds the
686 // certificate to the CertStore. 675 // certificate to the CertStore.
687 GetSSLStatusForRequest(request_->url(), ssl_info, info->GetChildID(), 676 GetSSLStatusForRequest(request_->url(), ssl_info, info->GetChildID(),
688 cert_store_, &ssl_status); 677 &ssl_status);
689 } 678 }
690 679
691 bool defer = false; 680 bool defer = false;
692 { 681 {
693 // TODO(darin): Remove ScopedTracker below once crbug.com/475761 is fixed. 682 // TODO(darin): Remove ScopedTracker below once crbug.com/475761 is fixed.
694 tracked_objects::ScopedTracker tracking_profile( 683 tracked_objects::ScopedTracker tracking_profile(
695 FROM_HERE_WITH_EXPLICIT_FUNCTION("475761 OnResponseCompleted()")); 684 FROM_HERE_WITH_EXPLICIT_FUNCTION("475761 OnResponseCompleted()"));
696 685
697 handler_->OnResponseCompleted(request_->status(), &defer); 686 handler_->OnResponseCompleted(request_->status(), &defer);
698 } 687 }
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
754 } 743 }
755 744
756 UMA_HISTOGRAM_ENUMERATION("Net.Prefetch.Pattern", status, STATUS_MAX); 745 UMA_HISTOGRAM_ENUMERATION("Net.Prefetch.Pattern", status, STATUS_MAX);
757 } else if (request_->response_info().unused_since_prefetch) { 746 } else if (request_->response_info().unused_since_prefetch) {
758 TimeDelta total_time = base::TimeTicks::Now() - request_->creation_time(); 747 TimeDelta total_time = base::TimeTicks::Now() - request_->creation_time();
759 UMA_HISTOGRAM_TIMES("Net.Prefetch.TimeSpentOnPrefetchHit", total_time); 748 UMA_HISTOGRAM_TIMES("Net.Prefetch.TimeSpentOnPrefetchHit", total_time);
760 } 749 }
761 } 750 }
762 751
763 } // namespace content 752 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/loader/resource_loader.h ('k') | content/browser/loader/resource_loader_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698