Chromium Code Reviews| 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/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 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 175 | 175 | 
| 176 URLRequest::~URLRequest() { | 176 URLRequest::~URLRequest() { | 
| 177 Cancel(); | 177 Cancel(); | 
| 178 | 178 | 
| 179 if (network_delegate_) { | 179 if (network_delegate_) { | 
| 180 network_delegate_->NotifyURLRequestDestroyed(this); | 180 network_delegate_->NotifyURLRequestDestroyed(this); | 
| 181 if (job_.get()) | 181 if (job_.get()) | 
| 182 job_->NotifyURLRequestDestroyed(); | 182 job_->NotifyURLRequestDestroyed(); | 
| 183 } | 183 } | 
| 184 | 184 | 
| 185 if (job_.get()) | 185 // Delete job before |this|, since subclasses may do weird things, like depend | 
| 186 OrphanJob(); | 186 // on UserData associated with |this| and poke at it during teardown. | 
| 187 job_.reset(); | |
| 187 | 188 | 
| 188 int deleted = context_->url_requests()->erase(this); | 189 DCHECK_EQ(1u, context_->url_requests()->count(this)); | 
| 189 CHECK_EQ(1, deleted); | 190 context_->url_requests()->erase(this); | 
| 
 
mmenke
2016/11/03 20:31:06
This admittedly isn't really related to the CL, ju
 
 | |
| 190 | 191 | 
| 191 int net_error = OK; | 192 int net_error = OK; | 
| 192 // Log error only on failure, not cancellation, as even successful requests | 193 // Log error only on failure, not cancellation, as even successful requests | 
| 193 // are "cancelled" on destruction. | 194 // are "cancelled" on destruction. | 
| 194 if (status_.status() == URLRequestStatus::FAILED) | 195 if (status_.status() == URLRequestStatus::FAILED) | 
| 195 net_error = status_.error(); | 196 net_error = status_.error(); | 
| 196 net_log_.EndEventWithNetErrorCode(NetLogEventType::REQUEST_ALIVE, net_error); | 197 net_log_.EndEventWithNetErrorCode(NetLogEventType::REQUEST_ALIVE, net_error); | 
| 197 } | 198 } | 
| 198 | 199 | 
| 199 void URLRequest::set_upload(std::unique_ptr<UploadDataStream> upload) { | 200 void URLRequest::set_upload(std::unique_ptr<UploadDataStream> upload) { | 
| (...skipping 688 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 888 job_->ContinueDespiteLastError(); | 889 job_->ContinueDespiteLastError(); | 
| 889 } | 890 } | 
| 890 | 891 | 
| 891 void URLRequest::PrepareToRestart() { | 892 void URLRequest::PrepareToRestart() { | 
| 892 DCHECK(job_.get()); | 893 DCHECK(job_.get()); | 
| 893 | 894 | 
| 894 // Close the current URL_REQUEST_START_JOB, since we will be starting a new | 895 // Close the current URL_REQUEST_START_JOB, since we will be starting a new | 
| 895 // one. | 896 // one. | 
| 896 net_log_.EndEvent(NetLogEventType::URL_REQUEST_START_JOB); | 897 net_log_.EndEvent(NetLogEventType::URL_REQUEST_START_JOB); | 
| 897 | 898 | 
| 898 OrphanJob(); | 899 job_.reset(); | 
| 899 | 900 | 
| 900 response_info_ = HttpResponseInfo(); | 901 response_info_ = HttpResponseInfo(); | 
| 901 response_info_.request_time = base::Time::Now(); | 902 response_info_.request_time = base::Time::Now(); | 
| 902 | 903 | 
| 903 load_timing_info_ = LoadTimingInfo(); | 904 load_timing_info_ = LoadTimingInfo(); | 
| 904 load_timing_info_.request_start_time = response_info_.request_time; | 905 load_timing_info_.request_start_time = response_info_.request_time; | 
| 905 load_timing_info_.request_start = base::TimeTicks::Now(); | 906 load_timing_info_.request_start = base::TimeTicks::Now(); | 
| 906 | 907 | 
| 907 status_ = URLRequestStatus(); | 908 status_ = URLRequestStatus(); | 
| 908 is_pending_ = false; | 909 is_pending_ = false; | 
| 909 proxy_server_ = ProxyServer(); | 910 proxy_server_ = ProxyServer(); | 
| 910 } | 911 } | 
| 911 | 912 | 
| 912 void URLRequest::OrphanJob() { | |
| 913 // When calling this function, please check that URLRequestHttpJob is | |
| 914 // not in between calling NetworkDelegate::NotifyHeadersReceived receiving | |
| 915 // the call back. This is currently guaranteed by the following strategies: | |
| 916 // - OrphanJob is called on JobRestart, in this case the URLRequestJob cannot | |
| 917 // be receiving any headers at that time. | |
| 918 // - OrphanJob is called in ~URLRequest, in this case | |
| 919 // NetworkDelegate::NotifyURLRequestDestroyed notifies the NetworkDelegate | |
| 920 // that the callback becomes invalid. | |
| 921 job_->Kill(); | |
| 922 job_ = NULL; | |
| 923 } | |
| 924 | |
| 925 int URLRequest::Redirect(const RedirectInfo& redirect_info) { | 913 int URLRequest::Redirect(const RedirectInfo& redirect_info) { | 
| 926 // Matches call in NotifyReceivedRedirect. | 914 // Matches call in NotifyReceivedRedirect. | 
| 927 OnCallToDelegateComplete(); | 915 OnCallToDelegateComplete(); | 
| 928 if (net_log_.IsCapturing()) { | 916 if (net_log_.IsCapturing()) { | 
| 929 net_log_.AddEvent( | 917 net_log_.AddEvent( | 
| 930 NetLogEventType::URL_REQUEST_REDIRECTED, | 918 NetLogEventType::URL_REQUEST_REDIRECTED, | 
| 931 NetLog::StringCallback("location", | 919 NetLog::StringCallback("location", | 
| 932 &redirect_info.new_url.possibly_invalid_spec())); | 920 &redirect_info.new_url.possibly_invalid_spec())); | 
| 933 } | 921 } | 
| 934 | 922 | 
| (...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1223 out->clear(); | 1211 out->clear(); | 
| 1224 } | 1212 } | 
| 1225 | 1213 | 
| 1226 void URLRequest::set_status(URLRequestStatus status) { | 1214 void URLRequest::set_status(URLRequestStatus status) { | 
| 1227 DCHECK(status_.is_io_pending() || status_.is_success() || | 1215 DCHECK(status_.is_io_pending() || status_.is_success() || | 
| 1228 (!status.is_success() && !status.is_io_pending())); | 1216 (!status.is_success() && !status.is_io_pending())); | 
| 1229 status_ = status; | 1217 status_ = status; | 
| 1230 } | 1218 } | 
| 1231 | 1219 | 
| 1232 } // namespace net | 1220 } // namespace net | 
| OLD | NEW |