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

Side by Side Diff: net/url_request/url_request_job.cc

Issue 2917133002: Perform redirect checks before OnReceivedRedirect in //net. (Closed)
Patch Set: rebase Created 3 years, 6 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
« no previous file with comments | « net/url_request/url_request_job.h ('k') | net/url_request/url_request_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "net/url_request/url_request_job.h" 5 #include "net/url_request/url_request_job.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/callback_helpers.h" 10 #include "base/callback_helpers.h"
(...skipping 439 matching lines...) Expand 10 before | Expand all | Expand 10 after
450 request_->OnHeadersComplete(); 450 request_->OnHeadersComplete();
451 451
452 GURL new_location; 452 GURL new_location;
453 int http_status_code; 453 int http_status_code;
454 454
455 if (IsRedirectResponse(&new_location, &http_status_code)) { 455 if (IsRedirectResponse(&new_location, &http_status_code)) {
456 // Redirect response bodies are not read. Notify the transaction 456 // Redirect response bodies are not read. Notify the transaction
457 // so it does not treat being stopped as an error. 457 // so it does not treat being stopped as an error.
458 DoneReadingRedirectResponse(); 458 DoneReadingRedirectResponse();
459 459
460 // Invalid redirect targets are failed early before
461 // NotifyReceivedRedirect. This means the delegate can assume that, if it
462 // accepts the redirect, future calls to OnResponseStarted correspond to
463 // |redirect_info.new_url|.
464 int redirect_valid = CanFollowRedirect(new_location);
465 if (redirect_valid != OK) {
466 has_handled_response_ = true;
467 request_->NotifyResponseStarted(
468 URLRequestStatus::FromError(redirect_valid));
mmenke 2017/06/05 19:25:15 Why not use OnDone()?
davidben 2017/06/05 19:44:17 Done.
469 return;
470 }
471
460 // When notifying the URLRequest::Delegate, it can destroy the request, 472 // When notifying the URLRequest::Delegate, it can destroy the request,
461 // which will destroy |this|. After calling to the URLRequest::Delegate, 473 // which will destroy |this|. After calling to the URLRequest::Delegate,
462 // pointer must be checked to see if |this| still exists, and if not, the 474 // pointer must be checked to see if |this| still exists, and if not, the
463 // code must return immediately. 475 // code must return immediately.
464 base::WeakPtr<URLRequestJob> weak_this(weak_factory_.GetWeakPtr()); 476 base::WeakPtr<URLRequestJob> weak_this(weak_factory_.GetWeakPtr());
465 477
466 RedirectInfo redirect_info = 478 RedirectInfo redirect_info =
467 ComputeRedirectInfo(new_location, http_status_code); 479 ComputeRedirectInfo(new_location, http_status_code);
468 bool defer_redirect = false; 480 bool defer_redirect = false;
469 request_->NotifyReceivedRedirect(redirect_info, &defer_redirect); 481 request_->NotifyReceivedRedirect(redirect_info, &defer_redirect);
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after
713 if (result != ERR_IO_PENDING) { 725 if (result != ERR_IO_PENDING) {
714 // If the read completes synchronously, either success or failure, invoke 726 // If the read completes synchronously, either success or failure, invoke
715 // GatherRawReadStats so we can account for the completed read. 727 // GatherRawReadStats so we can account for the completed read.
716 GatherRawReadStats(result); 728 GatherRawReadStats(result);
717 } else { 729 } else {
718 read_raw_callback_ = callback; 730 read_raw_callback_ = callback;
719 } 731 }
720 return result; 732 return result;
721 } 733 }
722 734
735 int URLRequestJob::CanFollowRedirect(const GURL& new_url) {
736 if (request_->redirect_limit_ <= 0) {
737 DVLOG(1) << "disallowing redirect: exceeds limit";
738 return ERR_TOO_MANY_REDIRECTS;
739 }
740
741 if (!new_url.is_valid())
742 return ERR_INVALID_REDIRECT;
743
744 if (!IsSafeRedirect(new_url)) {
mmenke 2017/06/05 19:25:15 Doesn't RDH/CRDHD currently allow redirects to sch
davidben 2017/06/05 19:44:17 Yup, this is exactly why the spec is split up in t
mmenke 2017/06/05 19:52:01 Ah, you're right. I had thought the reason we inf
745 DVLOG(1) << "disallowing redirect: unsafe protocol";
746 return ERR_UNSAFE_REDIRECT;
747 }
748
749 return OK;
750 }
751
723 void URLRequestJob::FollowRedirect(const RedirectInfo& redirect_info) { 752 void URLRequestJob::FollowRedirect(const RedirectInfo& redirect_info) {
724 int rv = request_->Redirect(redirect_info); 753 request_->Redirect(redirect_info);
725 if (rv != OK)
726 OnDone(URLRequestStatus(URLRequestStatus::FAILED, rv), true);
727 } 754 }
728 755
729 void URLRequestJob::GatherRawReadStats(int bytes_read) { 756 void URLRequestJob::GatherRawReadStats(int bytes_read) {
730 DCHECK(raw_read_buffer_ || bytes_read == 0); 757 DCHECK(raw_read_buffer_ || bytes_read == 0);
731 DCHECK_NE(ERR_IO_PENDING, bytes_read); 758 DCHECK_NE(ERR_IO_PENDING, bytes_read);
732 759
733 if (bytes_read > 0) { 760 if (bytes_read > 0) {
734 // If there is a filter, bytes will be logged after the filter is applied. 761 // If there is a filter, bytes will be logged after the filter is applied.
735 if (source_stream_->type() != SourceStream::TYPE_NONE && 762 if (source_stream_->type() != SourceStream::TYPE_NONE &&
736 request()->net_log().IsCapturing()) { 763 request()->net_log().IsCapturing()) {
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
852 int64_t total_sent_bytes = GetTotalSentBytes(); 879 int64_t total_sent_bytes = GetTotalSentBytes();
853 DCHECK_GE(total_sent_bytes, last_notified_total_sent_bytes_); 880 DCHECK_GE(total_sent_bytes, last_notified_total_sent_bytes_);
854 if (total_sent_bytes > last_notified_total_sent_bytes_) { 881 if (total_sent_bytes > last_notified_total_sent_bytes_) {
855 network_delegate_->NotifyNetworkBytesSent( 882 network_delegate_->NotifyNetworkBytesSent(
856 request_, total_sent_bytes - last_notified_total_sent_bytes_); 883 request_, total_sent_bytes - last_notified_total_sent_bytes_);
857 } 884 }
858 last_notified_total_sent_bytes_ = total_sent_bytes; 885 last_notified_total_sent_bytes_ = total_sent_bytes;
859 } 886 }
860 887
861 } // namespace net 888 } // namespace net
OLDNEW
« no previous file with comments | « net/url_request/url_request_job.h ('k') | net/url_request/url_request_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698