| 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); |
| 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 |