Index: components/cronet/android/url_request_adapter.cc |
diff --git a/components/cronet/android/url_request_adapter.cc b/components/cronet/android/url_request_adapter.cc |
index 5d8f84965fc9c59dc616399aa77d4637234728f8..7eaf9ab6f139b96f2548c782eae8033adb162a12 100644 |
--- a/components/cronet/android/url_request_adapter.cc |
+++ b/components/cronet/android/url_request_adapter.cc |
@@ -22,7 +22,7 @@ |
namespace cronet { |
-static const size_t kBufferSizeIncrement = 8192; |
+static const size_t kBufferSizeIncrement = 32768; |
URLRequestAdapter::URLRequestAdapter(URLRequestContextAdapter* context, |
URLRequestAdapterDelegate* delegate, |
@@ -30,7 +30,6 @@ URLRequestAdapter::URLRequestAdapter(URLRequestContextAdapter* context, |
net::RequestPriority priority) |
: method_("GET"), |
read_buffer_(new net::GrowableIOBuffer()), |
- bytes_read_(0), |
total_bytes_read_(0), |
error_code_(0), |
http_status_code_(0), |
@@ -171,12 +170,6 @@ void URLRequestAdapter::OnInitiateConnection() { |
} |
void URLRequestAdapter::Cancel() { |
mmenke
2014/12/02 20:33:47
Problem: What if cancel is called on the network
mef
2014/12/05 23:25:07
Done. I don't think embedder can expect immediate
|
- if (canceled_) { |
- return; |
- } |
- |
- canceled_ = true; |
- |
context_->PostTaskToNetworkThread( |
FROM_HERE, |
base::Bind(&URLRequestAdapter::OnCancelRequest, base::Unretained(this))); |
@@ -185,12 +178,15 @@ void URLRequestAdapter::Cancel() { |
void URLRequestAdapter::OnCancelRequest() { |
DCHECK(OnNetworkThread()); |
VLOG(1) << "Canceling chromium request: " << url_.possibly_invalid_spec(); |
+ if (canceled_) |
+ return; |
+ canceled_ = true; |
if (url_request_ != NULL) { |
url_request_->Cancel(); |
} |
- OnRequestCanceled(); |
+ OnRequestCompleted(); |
} |
void URLRequestAdapter::Destroy() { |
@@ -231,46 +227,27 @@ void URLRequestAdapter::OnResponseStarted(net::URLRequest* request) { |
// Reads all available data or starts an asynchronous read. |
void URLRequestAdapter::Read() { |
DCHECK(OnNetworkThread()); |
- while (true) { |
- if (read_buffer_->RemainingCapacity() == 0) { |
- int new_capacity = read_buffer_->capacity() + kBufferSizeIncrement; |
- read_buffer_->SetCapacity(new_capacity); |
- } |
- |
- int bytes_read; |
- if (url_request_->Read(read_buffer_.get(), |
- read_buffer_->RemainingCapacity(), |
- &bytes_read)) { |
- if (bytes_read == 0) { |
- OnRequestSucceeded(); |
- break; |
- } |
- |
- VLOG(1) << "Synchronously read: " << bytes_read << " bytes"; |
- OnBytesRead(bytes_read); |
- } else if (url_request_->status().status() == |
- net::URLRequestStatus::IO_PENDING) { |
- if (bytes_read_ != 0) { |
- VLOG(1) << "Flushing buffer: " << bytes_read_ << " bytes"; |
- |
- delegate_->OnBytesRead(this); |
- read_buffer_->set_offset(0); |
- bytes_read_ = 0; |
- } |
- VLOG(1) << "Started async read"; |
- break; |
- } else { |
- OnRequestFailed(); |
- break; |
- } |
+ if (read_buffer_->RemainingCapacity() == 0) { |
+ int new_capacity = read_buffer_->capacity() + kBufferSizeIncrement; |
+ read_buffer_->SetCapacity(new_capacity); |
} |
+ |
+ int bytes_read = 0; |
+ url_request_->Read( |
+ read_buffer_.get(), read_buffer_->RemainingCapacity(), &bytes_read); |
+ // If IO is pending, wait for the URLRequest to call OnReadCompleted. |
+ if (url_request_->status().is_io_pending()) |
+ return; |
+ |
+ VLOG(1) << "Synchronously read: " << bytes_read << " bytes"; |
+ OnReadCompleted(url_request_.get(), bytes_read); |
} |
void URLRequestAdapter::OnReadCompleted(net::URLRequest* request, |
int bytes_read) { |
DCHECK(OnNetworkThread()); |
- VLOG(1) << "Asynchronously read: " << bytes_read << " bytes"; |
- if (bytes_read < 0) { |
+ VLOG(1) << "Completed read: " << bytes_read << " bytes"; |
+ if (!url_request_->status().is_success()) { |
OnRequestFailed(); |
return; |
} else if (bytes_read == 0) { |
@@ -278,8 +255,14 @@ void URLRequestAdapter::OnReadCompleted(net::URLRequest* request, |
return; |
} |
- OnBytesRead(bytes_read); |
+ total_bytes_read_ += bytes_read; |
+ delegate_->OnBytesRead(this, bytes_read); |
+ read_buffer_->set_offset(0); |
+ |
Read(); |
+// context_->PostTaskToNetworkThread( |
+// FROM_HERE, |
+// base::Bind(&URLRequestAdapter::Read, base::Unretained(this))); |
} |
void URLRequestAdapter::OnReceivedRedirect(net::URLRequest* request, |
@@ -296,13 +279,6 @@ void URLRequestAdapter::OnReceivedRedirect(net::URLRequest* request, |
} |
} |
-void URLRequestAdapter::OnBytesRead(int bytes_read) { |
- DCHECK(OnNetworkThread()); |
- read_buffer_->set_offset(read_buffer_->offset() + bytes_read); |
- bytes_read_ += bytes_read; |
- total_bytes_read_ += bytes_read; |
-} |
- |
void URLRequestAdapter::OnRequestSucceeded() { |
DCHECK(OnNetworkThread()); |
if (canceled_) { |
@@ -327,16 +303,13 @@ void URLRequestAdapter::OnRequestFailed() { |
OnRequestCompleted(); |
} |
-void URLRequestAdapter::OnRequestCanceled() { |
- DCHECK(OnNetworkThread()); |
- OnRequestCompleted(); |
-} |
- |
void URLRequestAdapter::OnRequestCompleted() { |
DCHECK(OnNetworkThread()); |
VLOG(1) << "Completed: " << url_.possibly_invalid_spec(); |
- delegate_->OnBytesRead(this); |
+ if (url_request_ == nullptr) |
+ return; |
+ |
delegate_->OnRequestFinished(this); |
url_request_.reset(); |
} |