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

Unified Diff: google_apis/drive/base_requests.cc

Issue 127613002: google_apis: Stop accessing URLFetcher from ResponseWriter (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 11 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
« no previous file with comments | « google_apis/drive/base_requests.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: google_apis/drive/base_requests.cc
diff --git a/google_apis/drive/base_requests.cc b/google_apis/drive/base_requests.cc
index 4a5ca708781b26fcbe46fd2e14bf264be3211392..be64f783c244041fc650358bd61fbfd07dd58614 100644
--- a/google_apis/drive/base_requests.cc
+++ b/google_apis/drive/base_requests.cc
@@ -107,12 +107,11 @@ void ParseJson(base::TaskRunner* blocking_task_runner,
}
//=========================== ResponseWriter ==================================
-ResponseWriter::ResponseWriter(net::URLFetcher* url_fetcher,
- base::SequencedTaskRunner* file_task_runner,
+ResponseWriter::ResponseWriter(base::SequencedTaskRunner* file_task_runner,
const base::FilePath& file_path,
const GetContentCallback& get_content_callback)
- : url_fetcher_(url_fetcher),
- get_content_callback_(get_content_callback) {
+ : get_content_callback_(get_content_callback),
+ weak_ptr_factory_(this) {
if (!file_path.empty()) {
file_writer_.reset(
new net::URLFetcherFileWriter(file_task_runner, file_path));
@@ -138,17 +137,21 @@ int ResponseWriter::Initialize(const net::CompletionCallback& callback) {
int ResponseWriter::Write(net::IOBuffer* buffer,
int num_bytes,
const net::CompletionCallback& callback) {
- // |get_content_callback_| and |file_writer_| are used only when the response
- // code is successful one.
- if (IsSuccessfulResponseCode(url_fetcher_->GetResponseCode())) {
- if (!get_content_callback_.is_null()) {
- get_content_callback_.Run(
- HTTP_SUCCESS,
- make_scoped_ptr(new std::string(buffer->data(), num_bytes)));
- }
+ if (!get_content_callback_.is_null()) {
+ get_content_callback_.Run(
+ HTTP_SUCCESS,
+ make_scoped_ptr(new std::string(buffer->data(), num_bytes)));
+ }
- if (file_writer_)
- return file_writer_->Write(buffer, num_bytes, callback);
+ if (file_writer_) {
+ const int result = file_writer_->Write(
+ buffer, num_bytes,
+ base::Bind(&ResponseWriter::DidWrite,
+ weak_ptr_factory_.GetWeakPtr(),
+ make_scoped_refptr(buffer), callback));
+ if (result != net::ERR_IO_PENDING)
+ DidWrite(buffer, net::CompletionCallback(), result);
+ return result;
}
data_.append(buffer->data(), num_bytes);
@@ -162,6 +165,24 @@ int ResponseWriter::Finish(const net::CompletionCallback& callback) {
return net::OK;
}
+void ResponseWriter::DidWrite(scoped_refptr<net::IOBuffer> buffer,
+ const net::CompletionCallback& callback,
+ int result) {
+ if (result > 0) {
+ // Even if file_writer_ is used, append the data to |data_|, so that it can
+ // be used to get error information in case of server side errors.
+ // The size limit is to avoid consuming too much redundant memory.
+ const size_t kMaxStringSize = 1024*1024;
+ if (data_.size() < kMaxStringSize) {
+ data_.append(buffer->data(), std::min(static_cast<size_t>(result),
+ kMaxStringSize - data_.size()));
+ }
+ }
+
+ if (!callback.is_null())
+ callback.Run(result);
+}
+
//============================ UrlFetchRequestBase ===========================
UrlFetchRequestBase::UrlFetchRequestBase(RequestSender* sender)
@@ -207,8 +228,7 @@ void UrlFetchRequestBase::Start(const std::string& access_token,
GetOutputFilePath(&output_file_path, &get_content_callback);
if (!get_content_callback.is_null())
get_content_callback = CreateRelayCallback(get_content_callback);
- response_writer_ = new ResponseWriter(url_fetcher_.get(),
- blocking_task_runner(),
+ response_writer_ = new ResponseWriter(blocking_task_runner(),
output_file_path,
get_content_callback);
url_fetcher_->SaveResponseWithWriter(
« no previous file with comments | « google_apis/drive/base_requests.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698