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

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

Issue 1271733002: [2/3 chromium] Support redirect option of Request and "opaqueredirect" response type. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add is_redirect_response argument to CompleteResponseStarted Created 5 years, 4 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 "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/location.h" 8 #include "base/location.h"
9 #include "base/metrics/histogram.h" 9 #include "base/metrics/histogram.h"
10 #include "base/profiler/scoped_tracker.h" 10 #include "base/profiler/scoped_tracker.h"
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after
273 !ChildProcessSecurityPolicyImpl::GetInstance()-> 273 !ChildProcessSecurityPolicyImpl::GetInstance()->
274 CanRequestURL(info->GetChildID(), redirect_info.new_url)) { 274 CanRequestURL(info->GetChildID(), redirect_info.new_url)) {
275 DVLOG(1) << "Denied unauthorized request for " 275 DVLOG(1) << "Denied unauthorized request for "
276 << redirect_info.new_url.possibly_invalid_spec(); 276 << redirect_info.new_url.possibly_invalid_spec();
277 277
278 // Tell the renderer that this request was disallowed. 278 // Tell the renderer that this request was disallowed.
279 Cancel(); 279 Cancel();
280 return; 280 return;
281 } 281 }
282 282
283 if (info->fetch_redirect_mode() == FETCH_REDIRECT_MODE_ERROR) {
284 Cancel();
285 return;
286 } else if (info->fetch_redirect_mode() == FETCH_REDIRECT_MODE_MANUAL) {
287 // TODO(horo): If we support upload progress events for Fetch API, we will
288 // have to call ReportUploadProgress().
289 DCHECK(!GetRequestInfo()->is_upload_progress_enabled());
290
291 CompleteResponseStarted(true);
292 if (is_deferred())
293 return;
294
295 // There is no need to read the response body here because there is no way
296 // to read the body of opaque-redirect filtered response's internal
297 // response.
298 // TODO(horo): If we support any API which expose the internal body, we will
299 // have to read the body before calling ResponseCompleted(). And also Cache
300 // changes will be needed because it doesn't store the body of redirect
301 // responses.
302 ResponseCompleted();
303 return;
304 }
305
283 delegate_->DidReceiveRedirect(this, redirect_info.new_url); 306 delegate_->DidReceiveRedirect(this, redirect_info.new_url);
284 307
285 if (delegate_->HandleExternalProtocol(this, redirect_info.new_url)) { 308 if (delegate_->HandleExternalProtocol(this, redirect_info.new_url)) {
286 // The request is complete so we can remove it. 309 // The request is complete so we can remove it.
287 CancelAndIgnore(); 310 CancelAndIgnore();
288 return; 311 return;
289 } 312 }
290 313
291 scoped_refptr<ResourceResponse> response(new ResourceResponse()); 314 scoped_refptr<ResourceResponse> response(new ResourceResponse());
292 PopulateResourceResponse(info, request_.get(), response.get()); 315 PopulateResourceResponse(info, request_.get(), response.get());
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
382 405
383 // We want to send a final upload progress message prior to sending the 406 // We want to send a final upload progress message prior to sending the
384 // response complete message even if we're waiting for an ack to to a 407 // response complete message even if we're waiting for an ack to to a
385 // previous upload progress message. 408 // previous upload progress message.
386 ResourceRequestInfoImpl* info = GetRequestInfo(); 409 ResourceRequestInfoImpl* info = GetRequestInfo();
387 if (info->is_upload_progress_enabled()) { 410 if (info->is_upload_progress_enabled()) {
388 waiting_for_upload_progress_ack_ = false; 411 waiting_for_upload_progress_ack_ = false;
389 ReportUploadProgress(); 412 ReportUploadProgress();
390 } 413 }
391 414
392 CompleteResponseStarted(); 415 CompleteResponseStarted(false);
393 416
394 if (is_deferred()) 417 if (is_deferred())
395 return; 418 return;
396 419
397 if (request_->status().is_success()) 420 if (request_->status().is_success())
398 StartReading(false); // Read the first chunk. 421 StartReading(false); // Read the first chunk.
399 else 422 else
400 ResponseCompleted(); 423 ResponseCompleted();
401 } 424 }
402 425
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
575 if (!was_pending) { 598 if (!was_pending) {
576 // If the request isn't in flight, then we won't get an asynchronous 599 // If the request isn't in flight, then we won't get an asynchronous
577 // notification from the request, so we have to signal ourselves to finish 600 // notification from the request, so we have to signal ourselves to finish
578 // this request. 601 // this request.
579 base::ThreadTaskRunnerHandle::Get()->PostTask( 602 base::ThreadTaskRunnerHandle::Get()->PostTask(
580 FROM_HERE, base::Bind(&ResourceLoader::ResponseCompleted, 603 FROM_HERE, base::Bind(&ResourceLoader::ResponseCompleted,
581 weak_ptr_factory_.GetWeakPtr())); 604 weak_ptr_factory_.GetWeakPtr()));
582 } 605 }
583 } 606 }
584 607
585 void ResourceLoader::CompleteResponseStarted() { 608 void ResourceLoader::CompleteResponseStarted(bool is_redirect_response) {
586 ResourceRequestInfoImpl* info = GetRequestInfo(); 609 ResourceRequestInfoImpl* info = GetRequestInfo();
587 scoped_refptr<ResourceResponse> response(new ResourceResponse()); 610 scoped_refptr<ResourceResponse> response(new ResourceResponse());
588 PopulateResourceResponse(info, request_.get(), response.get()); 611 PopulateResourceResponse(info, request_.get(), response.get());
589 612
590 if (request_->ssl_info().cert.get()) { 613 if (request_->ssl_info().cert.get()) {
591 SSLStatus ssl_status; 614 SSLStatus ssl_status;
592 GetSSLStatusForRequest(request_->url(), request_->ssl_info(), 615 GetSSLStatusForRequest(request_->url(), request_->ssl_info(),
593 info->GetChildID(), &ssl_status); 616 info->GetChildID(), &ssl_status);
594 617
595 response->head.security_info = SerializeSecurityInfo(ssl_status); 618 response->head.security_info = SerializeSecurityInfo(ssl_status);
596 } else { 619 } else {
597 // We should not have any SSL state. 620 // We should not have any SSL state.
598 DCHECK(!request_->ssl_info().cert_status && 621 DCHECK(!request_->ssl_info().cert_status &&
599 request_->ssl_info().security_bits == -1 && 622 request_->ssl_info().security_bits == -1 &&
600 !request_->ssl_info().connection_status); 623 !request_->ssl_info().connection_status);
601 } 624 }
602 625
603 delegate_->DidReceiveResponse(this); 626 delegate_->DidReceiveResponse(this);
604 627
605 // TODO(darin): Remove ScopedTracker below once crbug.com/475761 is fixed. 628 // TODO(darin): Remove ScopedTracker below once crbug.com/475761 is fixed.
606 tracked_objects::ScopedTracker tracking_profile( 629 tracked_objects::ScopedTracker tracking_profile(
607 FROM_HERE_WITH_EXPLICIT_FUNCTION("475761 OnResponseStarted()")); 630 FROM_HERE_WITH_EXPLICIT_FUNCTION("475761 OnResponseStarted()"));
608 631
609 bool defer = false; 632 bool defer = false;
610 if (!handler_->OnResponseStarted(response.get(), &defer)) { 633 if (!handler_->OnResponseStarted(response.get(), &defer)) {
611 Cancel(); 634 Cancel();
612 } else if (defer) { 635 } else if (defer) {
613 read_deferral_start_time_ = base::TimeTicks::Now(); 636 read_deferral_start_time_ = base::TimeTicks::Now();
614 deferred_stage_ = DEFERRED_READ; // Read first chunk when resumed. 637 // Complete when resumed for redirect responses, otherwise read first chunk.
638 deferred_stage_ =
639 is_redirect_response ? DEFERRED_RESPONSE_COMPLETE : DEFERRED_READ;
mmenke 2015/08/11 18:48:56 In this new path, we skip both OnWillRead and OnRe
615 } 640 }
616 } 641 }
617 642
618 void ResourceLoader::StartReading(bool is_continuation) { 643 void ResourceLoader::StartReading(bool is_continuation) {
619 int bytes_read = 0; 644 int bytes_read = 0;
620 ReadMore(&bytes_read); 645 ReadMore(&bytes_read);
621 646
622 // If IO is pending, wait for the URLRequest to call OnReadCompleted. 647 // If IO is pending, wait for the URLRequest to call OnReadCompleted.
623 if (request_->status().is_io_pending()) 648 if (request_->status().is_io_pending())
624 return; 649 return;
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
764 case net::URLRequestStatus::FAILED: 789 case net::URLRequestStatus::FAILED:
765 status = STATUS_UNDEFINED; 790 status = STATUS_UNDEFINED;
766 break; 791 break;
767 } 792 }
768 793
769 UMA_HISTOGRAM_ENUMERATION("Net.Prefetch.Pattern", status, STATUS_MAX); 794 UMA_HISTOGRAM_ENUMERATION("Net.Prefetch.Pattern", status, STATUS_MAX);
770 } 795 }
771 } 796 }
772 797
773 } // namespace content 798 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/loader/resource_loader.h ('k') | content/browser/loader/resource_request_info_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698