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

Unified Diff: content/browser/android/url_request_content_job.cc

Issue 1410643007: URLRequestJob: change ReadRawData contract (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Randy's comments Created 5 years, 2 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/android/url_request_content_job.cc
diff --git a/content/browser/android/url_request_content_job.cc b/content/browser/android/url_request_content_job.cc
index 594e89f35e974c9dec70466a6cd5532dd367347c..9cac54e334ce06966fe4fe93b39ea9630c2c0b88 100644
--- a/content/browser/android/url_request_content_job.cc
+++ b/content/browser/android/url_request_content_job.cc
@@ -34,6 +34,7 @@ URLRequestContentJob::URLRequestContentJob(
content_path_(content_path),
stream_(new net::FileStream(content_task_runner)),
content_task_runner_(content_task_runner),
+ range_parse_result_(net::OK),
remaining_bytes_(0),
io_pending_(false),
weak_ptr_factory_(this) {}
@@ -56,44 +57,29 @@ void URLRequestContentJob::Kill() {
net::URLRequestJob::Kill();
}
-bool URLRequestContentJob::ReadRawData(net::IOBuffer* dest,
- int dest_size,
- int* bytes_read) {
+int URLRequestContentJob::ReadRawData(net::IOBuffer* dest, int dest_size) {
DCHECK_GT(dest_size, 0);
- DCHECK(bytes_read);
DCHECK_GE(remaining_bytes_, 0);
if (remaining_bytes_ < dest_size)
- dest_size = static_cast<int>(remaining_bytes_);
+ dest_size = remaining_bytes_;
// If we should copy zero bytes because |remaining_bytes_| is zero, short
// circuit here.
- if (!dest_size) {
- *bytes_read = 0;
- return true;
- }
+ if (!dest_size)
+ return 0;
- int rv = stream_->Read(dest,
- dest_size,
- base::Bind(&URLRequestContentJob::DidRead,
- weak_ptr_factory_.GetWeakPtr(),
- make_scoped_refptr(dest)));
- if (rv >= 0) {
- // Data is immediately available.
- *bytes_read = rv;
- remaining_bytes_ -= rv;
- DCHECK_GE(remaining_bytes_, 0);
- return true;
- }
-
- // Otherwise, a read error occured. We may just need to wait...
+ int rv =
+ stream_->Read(dest, dest_size, base::Bind(&URLRequestContentJob::DidRead,
+ weak_ptr_factory_.GetWeakPtr(),
+ make_scoped_refptr(dest)));
if (rv == net::ERR_IO_PENDING) {
io_pending_ = true;
- SetStatus(net::URLRequestStatus(net::URLRequestStatus::IO_PENDING, 0));
- } else {
- NotifyDone(net::URLRequestStatus(net::URLRequestStatus::FAILED, rv));
+ } else if (rv > 0) {
+ remaining_bytes_ -= rv;
}
- return false;
+ DCHECK_GE(remaining_bytes_, 0);
+ return rv;
}
bool URLRequestContentJob::IsRedirectResponse(GURL* location,
@@ -110,6 +96,10 @@ bool URLRequestContentJob::GetMimeType(std::string* mime_type) const {
return false;
}
+// Extracts headers that this job cares about from the supplied request headers.
+// Currently this job only cares about the Range header. Note that validation is
+// deferred to DidOpen(), because NotifyStartError is not legal to call since
+// the job has not started.
void URLRequestContentJob::SetExtraRequestHeaders(
const net::HttpRequestHeaders& headers) {
std::string range_header;
@@ -123,9 +113,8 @@ void URLRequestContentJob::SetExtraRequestHeaders(
byte_range_ = ranges[0];
} else {
// We don't support multiple range requests.
- NotifyDone(net::URLRequestStatus(
- net::URLRequestStatus::FAILED,
- net::ERR_REQUEST_RANGE_NOT_SATISFIABLE));
+ // Saves the failure and report it in DidOpen().
+ range_parse_result_ = net::ERR_REQUEST_RANGE_NOT_SATISFIABLE;
}
}
}
@@ -162,13 +151,20 @@ void URLRequestContentJob::DidFetchMetaInfo(const ContentMetaInfo* meta_info) {
void URLRequestContentJob::DidOpen(int result) {
if (result != net::OK) {
- NotifyDone(net::URLRequestStatus(net::URLRequestStatus::FAILED, result));
+ NotifyStartError(
+ net::URLRequestStatus(net::URLRequestStatus::FAILED, result));
+ return;
+ }
+
+ if (range_parse_result_ != net::OK) {
+ NotifyStartError(net::URLRequestStatus(net::URLRequestStatus::FAILED,
+ range_parse_result_));
return;
}
if (!byte_range_.ComputeBounds(meta_info_.content_size)) {
- NotifyDone(net::URLRequestStatus(net::URLRequestStatus::FAILED,
- net::ERR_REQUEST_RANGE_NOT_SATISFIABLE));
+ NotifyStartError(net::URLRequestStatus(
+ net::URLRequestStatus::FAILED, net::ERR_REQUEST_RANGE_NOT_SATISFIABLE));
return;
}
@@ -195,8 +191,8 @@ void URLRequestContentJob::DidOpen(int result) {
void URLRequestContentJob::DidSeek(int64 result) {
if (result != byte_range_.first_byte_position()) {
- NotifyDone(net::URLRequestStatus(net::URLRequestStatus::FAILED,
- net::ERR_REQUEST_RANGE_NOT_SATISFIABLE));
+ NotifyStartError(net::URLRequestStatus(
+ net::URLRequestStatus::FAILED, net::ERR_REQUEST_RANGE_NOT_SATISFIABLE));
return;
}
@@ -204,24 +200,17 @@ void URLRequestContentJob::DidSeek(int64 result) {
NotifyHeadersComplete();
}
-void URLRequestContentJob::DidRead(
- scoped_refptr<net::IOBuffer> buf, int result) {
- if (result > 0) {
- SetStatus(net::URLRequestStatus()); // Clear the IO_PENDING status
- remaining_bytes_ -= result;
- DCHECK_GE(remaining_bytes_, 0);
- }
-
+void URLRequestContentJob::DidRead(scoped_refptr<net::IOBuffer> buf,
+ int result) {
DCHECK(io_pending_);
io_pending_ = false;
- if (result == 0) {
- NotifyDone(net::URLRequestStatus());
- } else if (result < 0) {
- NotifyDone(net::URLRequestStatus(net::URLRequestStatus::FAILED, result));
+ if (result > 0) {
+ remaining_bytes_ -= result;
+ DCHECK_GE(remaining_bytes_, 0);
}
- NotifyReadComplete(result);
+ ReadRawDataComplete(result);
}
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698