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

Unified Diff: components/cronet/android/url_request_adapter.cc

Issue 743713002: Cronet Fix Channel Write after Close when request is canceled after success. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address Matt's comments. Created 6 years 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
« no previous file with comments | « components/cronet/android/url_request_adapter.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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();
}
« no previous file with comments | « components/cronet/android/url_request_adapter.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698