Index: net/url_request/url_request.cc |
diff --git a/net/url_request/url_request.cc b/net/url_request/url_request.cc |
index eac30aeb4157f9f54ea97f57c3ce1c6d2a91fbb6..76b5b12879fed6e4e1de91280714731ddddc1271 100644 |
--- a/net/url_request/url_request.cc |
+++ b/net/url_request/url_request.cc |
@@ -159,6 +159,15 @@ void URLRequest::Delegate::OnSSLCertificateError(URLRequest* request, |
request->Cancel(); |
} |
+void URLRequest::Delegate::OnResponseStarted(URLRequest* request, |
+ int net_error) { |
+ OnResponseStarted(request); |
+} |
+ |
+void URLRequest::Delegate::OnResponseStarted(URLRequest* request) { |
+ NOTREACHED(); |
+} |
+ |
/////////////////////////////////////////////////////////////////////////////// |
// URLRequest |
@@ -496,6 +505,9 @@ void URLRequest::set_delegate(Delegate* delegate) { |
void URLRequest::Start() { |
DCHECK(delegate_); |
+ if (!status_.is_success()) |
+ return; |
+ |
// TODO(pkasting): Remove ScopedTracker below once crbug.com/456327 is fixed. |
tracked_objects::ScopedTracker tracking_profile( |
FROM_HERE_WITH_EXPLICIT_FUNCTION("456327 URLRequest::Start")); |
@@ -555,6 +567,7 @@ URLRequest::URLRequest(const GURL& url, |
first_party_url_policy_(NEVER_CHANGE_FIRST_PARTY_URL), |
load_flags_(LOAD_NORMAL), |
delegate_(delegate), |
+ status_(URLRequestStatus::FromError(OK)), |
is_pending_(false), |
is_redirecting_(false), |
redirect_limit_(kMaxRedirects), |
@@ -672,12 +685,12 @@ void URLRequest::RestartWithJob(URLRequestJob *job) { |
StartJob(job); |
} |
-void URLRequest::Cancel() { |
- DoCancel(ERR_ABORTED, SSLInfo()); |
+int URLRequest::Cancel() { |
+ return DoCancel(ERR_ABORTED, SSLInfo()); |
} |
-void URLRequest::CancelWithError(int error) { |
- DoCancel(error, SSLInfo()); |
+int URLRequest::CancelWithError(int error) { |
+ return DoCancel(error, SSLInfo()); |
} |
void URLRequest::CancelWithSSLError(int error, const SSLInfo& ssl_info) { |
@@ -689,7 +702,7 @@ void URLRequest::CancelWithSSLError(int error, const SSLInfo& ssl_info) { |
DoCancel(error, ssl_info); |
} |
-void URLRequest::DoCancel(int error, const SSLInfo& ssl_info) { |
+int URLRequest::DoCancel(int error, const SSLInfo& ssl_info) { |
DCHECK(error < 0); |
// If cancelled while calling a delegate, clear delegate info. |
if (calling_delegate_) { |
@@ -722,58 +735,59 @@ void URLRequest::DoCancel(int error, const SSLInfo& ssl_info) { |
// The Job will call our NotifyDone method asynchronously. This is done so |
// that the Delegate implementation can call Cancel without having to worry |
// about being called recursively. |
+ |
+ return status_.error(); |
} |
-bool URLRequest::Read(IOBuffer* dest, int dest_size, int* bytes_read) { |
+int URLRequest::Read(IOBuffer* dest, int dest_size) { |
DCHECK(job_.get()); |
- DCHECK(bytes_read); |
- *bytes_read = 0; |
// If this is the first read, end the delegate call that may have started in |
// OnResponseStarted. |
OnCallToDelegateComplete(); |
- // This handles a cancel that happens while paused. |
+ // If the request has failed, Read() will return actual network error code. |
+ if (!status_.is_success()) |
+ return status_.error(); |
+ |
+ // This handles reads after the request already completed successfully. |
// TODO(ahendrickson): DCHECK() that it is not done after |
// http://crbug.com/115705 is fixed. |
if (job_->is_done()) |
- return false; |
+ return status_.error(); |
if (dest_size == 0) { |
// Caller is not too bright. I guess we've done what they asked. |
- return true; |
+ return OK; |
} |
- // Once the request fails or is cancelled, read will just return 0 bytes |
- // to indicate end of stream. |
- if (!status_.is_success()) { |
+ int rv = job_->Read(dest, dest_size); |
+ if (rv == ERR_IO_PENDING) |
+ set_status(URLRequestStatus::FromError(ERR_IO_PENDING)); |
+ |
+ // If rv is not 0 or actual bytes read, the status cannot be success. |
+ DCHECK(rv >= 0 || status_.status() != URLRequestStatus::SUCCESS); |
+ |
+ if (rv == 0 && status_.is_success()) |
+ NotifyRequestCompleted(); |
+ return rv; |
+} |
+ |
+// Deprecated. |
+bool URLRequest::Read(IOBuffer* dest, int dest_size, int* bytes_read) { |
+ int result = Read(dest, dest_size); |
+ if (result >= 0) { |
+ *bytes_read = result; |
return true; |
} |
- bool rv = job_->Read(dest, dest_size, bytes_read); |
- if (*bytes_read < 0) { |
- if (*bytes_read == ERR_IO_PENDING) { |
- set_status(URLRequestStatus::FromError(ERR_IO_PENDING)); |
- // Check the status was set correctly. |
- DCHECK_EQ(*bytes_read, status_.error()); |
- // Adjust to the previous behavior. If the error is ERR_IO_PENDING, |
- // |*bytes_read| should be 0. |
- *bytes_read = 0; |
- } else { |
- // Check the status was set correctly. |
- DCHECK_EQ(*bytes_read, status_.error()); |
- // Adjust to the previous behavior. If the error is other than |
- // ERR_IO_PENDING, |*bytes_read| should be -1. |
- *bytes_read = -1; |
- } |
+ if (result == ERR_IO_PENDING) { |
+ *bytes_read = 0; |
+ } else { |
+ *bytes_read = -1; |
} |
- // If rv is false, the status cannot be success. |
- DCHECK(rv || status_.status() != URLRequestStatus::SUCCESS); |
- |
- if (rv && *bytes_read <= 0 && status_.is_success()) |
- NotifyRequestCompleted(); |
- return rv; |
+ return false; |
} |
void URLRequest::StopCaching() { |
@@ -826,7 +840,7 @@ void URLRequest::NotifyResponseStarted(const URLRequestStatus& status) { |
// completion event and receive a NotifyResponseStarted() later. |
if (!has_notified_completion_ && status_.is_success()) { |
if (network_delegate_) |
- network_delegate_->NotifyResponseStarted(this); |
+ network_delegate_->NotifyResponseStarted(this, net_error); |
} |
// Notify in case the entire URL Request has been finished. |
@@ -834,7 +848,7 @@ void URLRequest::NotifyResponseStarted(const URLRequestStatus& status) { |
NotifyRequestCompleted(); |
OnCallToDelegate(); |
- delegate_->OnResponseStarted(this); |
+ delegate_->OnResponseStarted(this, net_error); |
// Nothing may appear below this line as OnResponseStarted may delete |
// |this|. |
} |
@@ -1140,6 +1154,14 @@ void URLRequest::NotifyReadCompleted(int bytes_read) { |
if (bytes_read <= 0) |
NotifyRequestCompleted(); |
+ // When URLRequestJob notices there was an error in URLRequest's |status_|, |
+ // it calls this method with |bytes_read| set to -1. Set it to a real error |
+ // here. |
+ // TODO(maksims): NotifyReadCompleted take the error code as an argument on |
+ // failure, rather than -1. |
+ if (bytes_read == -1) |
+ bytes_read = status_.error(); |
+ |
// Notify NetworkChangeNotifier that we just received network data. |
// This is to identify cases where the NetworkChangeNotifier thinks we |
// are off-line but we are still receiving network data (crbug.com/124069), |
@@ -1184,7 +1206,8 @@ void URLRequest::NotifyRequestCompleted() { |
is_redirecting_ = false; |
has_notified_completion_ = true; |
if (network_delegate_) |
- network_delegate_->NotifyCompleted(this, job_.get() != NULL); |
+ network_delegate_->NotifyCompleted(this, job_.get() != NULL, |
+ status_.error()); |
} |
void URLRequest::OnCallToDelegate() { |