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

Unified Diff: chrome/common/net/url_fetcher.cc

Issue 6904057: Schetch changes required to support URLFetcher saving response to a file (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 8 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 | « chrome/common/net/url_fetcher.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/common/net/url_fetcher.cc
diff --git a/chrome/common/net/url_fetcher.cc b/chrome/common/net/url_fetcher.cc
index 29695646bdf8e3059204a797f052930d9cdde859..3c4b519f0f109928919a8dd89bbe4124e89da648 100644
--- a/chrome/common/net/url_fetcher.cc
+++ b/chrome/common/net/url_fetcher.cc
@@ -26,6 +26,55 @@
static const int kBufferSize = 4096;
+// Hold the body of a response to a URL fetch in a std::string.
+class StringResponseBodyContainer
+ : public URLFetcher::ResponseBodyContainerInterface {
+ public:
+ StringResponseBodyContainer() {}
+
+ virtual void Append(char* data, int data_length) {
darin (slow to review) 2011/04/28 03:25:17 if the goal is to have an alternative implementati
Sam Kerner (Chrome) 2011/04/28 04:24:58 My plan was to have each call to Append() send a m
+ data_.append(data, data_length);
+ }
+
+ virtual bool GetAsString(std::string* out_body) const {
+ *out_body = data_;
+ return true;
+ }
+
+ private:
+ std::string data_;
+};
+
+// Default implementation of OnURLFetchCompleteNew() takes the response
+// body, makes it into a string, and calls the old callback.
+void URLFetcher::Delegate::OnURLFetchCompleteNew(
+ const URLFetcher* source,
+ const GURL& url,
+ const net::URLRequestStatus& status,
+ int response_code,
+ const ResponseCookies& cookies,
+ const ResponseBodyContainerInterface& response_body) {
+
+ std::string response_data;
+
+ // If the response container doesn't support getting the response as
+ // a string, then it is not the default string container. The delegate that
+ // passed in its wn container should have overriden this method and
+ // dealt with the container itself.
+ CHECK(response_body.GetAsString(&response_data));
+
+ // To avoid changing existing code, call the old callback with a string
+ // holding the response.
+ OnURLFetchComplete(
+ source, url, status, response_code, cookies, response_data);
+}
+
+URLFetcher::ResponseBodyContainerInterface*
+URLFetcher::Delegate::CreateResponseBodyContainer() {
+ // If subclass does not override, use a string.
+ return new StringResponseBodyContainer;
+}
+
class URLFetcher::Core
: public base::RefCountedThreadSafe<URLFetcher::Core>,
public net::URLRequest::Delegate {
@@ -124,7 +173,8 @@ class URLFetcher::Core
scoped_ptr<net::URLRequest> request_; // The actual request this wraps
int load_flags_; // Flags for the load operation
int response_code_; // HTTP status code for the request
- std::string data_; // Results of the request
+ scoped_ptr<ResponseBodyContainerInterface> response_body_;
+ // Results of the request
scoped_refptr<net::IOBuffer> buffer_;
// Read buffer
scoped_refptr<net::URLRequestContextGetter> request_context_getter_;
@@ -324,7 +374,7 @@ void URLFetcher::Core::OnReadCompleted(net::URLRequest* request,
do {
if (!request_->status().is_success() || bytes_read <= 0)
break;
- data_.append(buffer_->data(), bytes_read);
+ response_body_->Append(buffer_->data(), bytes_read);
} while (request_->Read(buffer_, kBufferSize, &bytes_read));
if (request_->status().is_success())
@@ -399,7 +449,7 @@ void URLFetcher::Core::StartURLRequest() {
request_->SetExtraRequestHeaders(extra_request_headers_);
// There might be data left over from a previous request attempt.
- data_.clear();
+ response_body_.reset(delegate_->CreateResponseBodyContainer());
request_->Start();
}
@@ -465,15 +515,15 @@ void URLFetcher::Core::OnCompletedURLRequest(
FROM_HERE,
NewRunnableMethod(this, &Core::StartURLRequestWhenAppropriate));
} else {
- delegate_->OnURLFetchComplete(fetcher_, url_, status, response_code_,
- cookies_, data_);
+ delegate_->OnURLFetchCompleteNew(fetcher_, url_, status, response_code_,
+ cookies_, *response_body_);
}
}
} else {
if (delegate_) {
fetcher_->backoff_delay_ = base::TimeDelta();
- delegate_->OnURLFetchComplete(fetcher_, url_, status, response_code_,
- cookies_, data_);
+ delegate_->OnURLFetchCompleteNew(fetcher_, url_, status, response_code_,
+ cookies_, *response_body_);
}
}
}
« no previous file with comments | « chrome/common/net/url_fetcher.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698