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

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

Issue 2917133002: Perform redirect checks before OnReceivedRedirect in //net. (Closed)
Patch Set: nasko comments 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.h ('k') | net/url_request/url_request_job.h » ('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.h" 5 #include "net/url_request/url_request.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
(...skipping 899 matching lines...) Expand 10 before | Expand all | Expand 10 after
910 910
911 load_timing_info_ = LoadTimingInfo(); 911 load_timing_info_ = LoadTimingInfo();
912 load_timing_info_.request_start_time = response_info_.request_time; 912 load_timing_info_.request_start_time = response_info_.request_time;
913 load_timing_info_.request_start = base::TimeTicks::Now(); 913 load_timing_info_.request_start = base::TimeTicks::Now();
914 914
915 status_ = URLRequestStatus(); 915 status_ = URLRequestStatus();
916 is_pending_ = false; 916 is_pending_ = false;
917 proxy_server_ = ProxyServer(); 917 proxy_server_ = ProxyServer();
918 } 918 }
919 919
920 int URLRequest::Redirect(const RedirectInfo& redirect_info) { 920 void URLRequest::Redirect(const RedirectInfo& redirect_info) {
921 // Matches call in NotifyReceivedRedirect. 921 // This method always succeeds. Whether |job_| is allowed to redirect to
922 // |redirect_info| is checked in URLRequestJob::CanFollowRedirect, before
923 // NotifyReceivedRedirect. This means the delegate can assume that, if it
924 // accepted the redirect, future calls to OnResponseStarted correspond to
925 // |redirect_info.new_url|.
922 OnCallToDelegateComplete(); 926 OnCallToDelegateComplete();
923 if (net_log_.IsCapturing()) { 927 if (net_log_.IsCapturing()) {
924 net_log_.AddEvent( 928 net_log_.AddEvent(
925 NetLogEventType::URL_REQUEST_REDIRECTED, 929 NetLogEventType::URL_REQUEST_REDIRECTED,
926 NetLog::StringCallback("location", 930 NetLog::StringCallback("location",
927 &redirect_info.new_url.possibly_invalid_spec())); 931 &redirect_info.new_url.possibly_invalid_spec()));
928 } 932 }
929 933
930 if (network_delegate_) 934 if (network_delegate_)
931 network_delegate_->NotifyBeforeRedirect(this, redirect_info.new_url); 935 network_delegate_->NotifyBeforeRedirect(this, redirect_info.new_url);
932 936
933 if (redirect_limit_ <= 0) {
934 DVLOG(1) << "disallowing redirect: exceeds limit";
935 return ERR_TOO_MANY_REDIRECTS;
936 }
937
938 if (!redirect_info.new_url.is_valid())
939 return ERR_INVALID_URL;
940
941 if (!job_->IsSafeRedirect(redirect_info.new_url)) {
942 DVLOG(1) << "disallowing redirect: unsafe protocol";
943 return ERR_UNSAFE_REDIRECT;
944 }
945
946 if (!final_upload_progress_.position() && upload_data_stream_) 937 if (!final_upload_progress_.position() && upload_data_stream_)
947 final_upload_progress_ = upload_data_stream_->GetUploadProgress(); 938 final_upload_progress_ = upload_data_stream_->GetUploadProgress();
948 PrepareToRestart(); 939 PrepareToRestart();
949 940
950 if (redirect_info.new_method != method_) { 941 if (redirect_info.new_method != method_) {
951 // TODO(davidben): This logic still needs to be replicated at the consumers. 942 // TODO(davidben): This logic still needs to be replicated at the consumers.
952 if (method_ == "POST") { 943 if (method_ == "POST") {
953 // If being switched from POST, must remove Origin header. 944 // If being switched from POST, must remove Origin header.
954 // TODO(jww): This is Origin header removal is probably layering violation 945 // TODO(jww): This is Origin header removal is probably layering violation
955 // and 946 // and
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
990 981
991 referrer_ = redirect_info.new_referrer; 982 referrer_ = redirect_info.new_referrer;
992 referrer_policy_ = redirect_info.new_referrer_policy; 983 referrer_policy_ = redirect_info.new_referrer_policy;
993 first_party_for_cookies_ = redirect_info.new_first_party_for_cookies; 984 first_party_for_cookies_ = redirect_info.new_first_party_for_cookies;
994 token_binding_referrer_ = redirect_info.referred_token_binding_host; 985 token_binding_referrer_ = redirect_info.referred_token_binding_host;
995 986
996 url_chain_.push_back(redirect_info.new_url); 987 url_chain_.push_back(redirect_info.new_url);
997 --redirect_limit_; 988 --redirect_limit_;
998 989
999 Start(); 990 Start();
1000 return OK;
1001 } 991 }
1002 992
1003 const URLRequestContext* URLRequest::context() const { 993 const URLRequestContext* URLRequest::context() const {
1004 return context_; 994 return context_;
1005 } 995 }
1006 996
1007 int64_t URLRequest::GetExpectedContentSize() const { 997 int64_t URLRequest::GetExpectedContentSize() const {
1008 int64_t expected_content_size = -1; 998 int64_t expected_content_size = -1;
1009 if (job_.get()) 999 if (job_.get())
1010 expected_content_size = job_->expected_content_size(); 1000 expected_content_size = job_->expected_content_size();
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
1216 out->clear(); 1206 out->clear();
1217 } 1207 }
1218 1208
1219 void URLRequest::set_status(URLRequestStatus status) { 1209 void URLRequest::set_status(URLRequestStatus status) {
1220 DCHECK(status_.is_io_pending() || status_.is_success() || 1210 DCHECK(status_.is_io_pending() || status_.is_success() ||
1221 (!status.is_success() && !status.is_io_pending())); 1211 (!status.is_success() && !status.is_io_pending()));
1222 status_ = status; 1212 status_ = status;
1223 } 1213 }
1224 1214
1225 } // namespace net 1215 } // namespace net
OLDNEW
« no previous file with comments | « net/url_request/url_request.h ('k') | net/url_request/url_request_job.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698