summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/url_request/test_url_fetcher_factory.cc17
-rw-r--r--net/url_request/test_url_fetcher_factory.h1
-rw-r--r--third_party/libaddressinput/chromium/chrome_downloader_impl.cc54
-rw-r--r--third_party/libaddressinput/chromium/chrome_downloader_impl.h11
4 files changed, 73 insertions, 10 deletions
diff --git a/net/url_request/test_url_fetcher_factory.cc b/net/url_request/test_url_fetcher_factory.cc
index f44d22b..2173bfb 100644
--- a/net/url_request/test_url_fetcher_factory.cc
+++ b/net/url_request/test_url_fetcher_factory.cc
@@ -11,6 +11,7 @@
#include "base/memory/weak_ptr.h"
#include "base/message_loop/message_loop.h"
#include "net/base/host_port_pair.h"
+#include "net/base/io_buffer.h"
#include "net/base/net_errors.h"
#include "net/http/http_response_headers.h"
#include "net/url_request/url_fetcher_delegate.h"
@@ -150,6 +151,22 @@ void TestURLFetcher::SaveResponseToTemporaryFile(
void TestURLFetcher::SaveResponseWithWriter(
scoped_ptr<URLFetcherResponseWriter> response_writer) {
+ if (fake_response_destination_ == STRING) {
+ response_writer_ = response_writer.Pass();
+ int response = response_writer_->Initialize(CompletionCallback());
+ // The TestURLFetcher doesn't handle asynchronous writes.
+ DCHECK_EQ(OK, response);
+
+ scoped_refptr<IOBuffer> buffer(new StringIOBuffer(fake_response_string_));
+ response = response_writer_->Write(buffer.get(),
+ fake_response_string_.size(),
+ CompletionCallback());
+ DCHECK_EQ(OK, response);
+ response = response_writer_->Finish(CompletionCallback());
+ DCHECK_EQ(OK, response);
+ } else {
+ NOTIMPLEMENTED();
+ }
}
HttpResponseHeaders* TestURLFetcher::GetResponseHeaders() const {
diff --git a/net/url_request/test_url_fetcher_factory.h b/net/url_request/test_url_fetcher_factory.h
index b88daac..f2139d9 100644
--- a/net/url_request/test_url_fetcher_factory.h
+++ b/net/url_request/test_url_fetcher_factory.h
@@ -222,6 +222,7 @@ class TestURLFetcher : public URLFetcher {
HttpRequestHeaders fake_extra_request_headers_;
int fake_max_retries_;
base::TimeDelta fake_backoff_delay_;
+ scoped_ptr<URLFetcherResponseWriter> response_writer_;
DISALLOW_COPY_AND_ASSIGN(TestURLFetcher);
};
diff --git a/third_party/libaddressinput/chromium/chrome_downloader_impl.cc b/third_party/libaddressinput/chromium/chrome_downloader_impl.cc
index baf9d96..a0a8b17 100644
--- a/third_party/libaddressinput/chromium/chrome_downloader_impl.cc
+++ b/third_party/libaddressinput/chromium/chrome_downloader_impl.cc
@@ -6,31 +6,70 @@
#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
+#include "net/base/io_buffer.h"
#include "net/base/load_flags.h"
+#include "net/base/net_errors.h"
#include "net/http/http_status_code.h"
#include "net/url_request/url_fetcher.h"
+#include "net/url_request/url_fetcher_response_writer.h"
#include "url/gurl.h"
namespace autofill {
+namespace {
+
+// A URLFetcherResponseWriter that writes into a provided buffer.
+class UnownedStringWriter : public net::URLFetcherResponseWriter {
+ public:
+ UnownedStringWriter(std::string* data) : data_(data) {}
+ virtual ~UnownedStringWriter() {}
+
+ virtual int Initialize(const net::CompletionCallback& callback) OVERRIDE {
+ data_->clear();
+ return net::OK;
+ }
+
+ virtual int Write(net::IOBuffer* buffer,
+ int num_bytes,
+ const net::CompletionCallback& callback) OVERRIDE {
+ data_->append(buffer->data(), num_bytes);
+ return num_bytes;
+ }
+
+ virtual int Finish(const net::CompletionCallback& callback) OVERRIDE {
+ return net::OK;
+ }
+
+ private:
+ std::string* data_; // weak reference.
+
+ DISALLOW_COPY_AND_ASSIGN(UnownedStringWriter);
+};
+
+} // namespace
+
ChromeDownloaderImpl::ChromeDownloaderImpl(net::URLRequestContextGetter* getter)
: getter_(getter) {}
ChromeDownloaderImpl::~ChromeDownloaderImpl() {
- STLDeleteContainerPairPointers(requests_.begin(), requests_.end());
+ STLDeleteValues(&requests_);
}
void ChromeDownloaderImpl::Download(
const std::string& url,
scoped_ptr<Callback> downloaded) {
- net::URLFetcher* fetcher =
- net::URLFetcher::Create(GURL(url), net::URLFetcher::GET, this);
+ scoped_ptr<net::URLFetcher> fetcher(
+ net::URLFetcher::Create(GURL(url), net::URLFetcher::GET, this));
fetcher->SetLoadFlags(
net::LOAD_DO_NOT_SEND_COOKIES | net::LOAD_DO_NOT_SAVE_COOKIES);
fetcher->SetRequestContext(getter_);
- requests_[fetcher] = new Request(url, downloaded.Pass());
- fetcher->Start();
+ Request* request = new Request(url, fetcher.Pass(), downloaded.Pass());
+ request->fetcher->SaveResponseWithWriter(
+ scoped_ptr<net::URLFetcherResponseWriter>(
+ new UnownedStringWriter(&request->data)));
+ requests_[request->fetcher.get()] = request;
+ request->fetcher->Start();
}
void ChromeDownloaderImpl::OnURLFetchComplete(const net::URLFetcher* source) {
@@ -41,17 +80,18 @@ void ChromeDownloaderImpl::OnURLFetchComplete(const net::URLFetcher* source) {
bool ok = source->GetResponseCode() == net::HTTP_OK;
scoped_ptr<std::string> data(new std::string());
if (ok)
- source->GetResponseAsString(data.get());
+ data->swap(request->second->data);
(*request->second->callback)(ok, request->second->url, data.Pass());
- delete request->first;
delete request->second;
requests_.erase(request);
}
ChromeDownloaderImpl::Request::Request(const std::string& url,
+ scoped_ptr<net::URLFetcher> fetcher,
scoped_ptr<Callback> callback)
: url(url),
+ fetcher(fetcher.Pass()),
callback(callback.Pass()) {}
} // namespace autofill
diff --git a/third_party/libaddressinput/chromium/chrome_downloader_impl.h b/third_party/libaddressinput/chromium/chrome_downloader_impl.h
index 09a9e7a..2f0bf0d 100644
--- a/third_party/libaddressinput/chromium/chrome_downloader_impl.h
+++ b/third_party/libaddressinput/chromium/chrome_downloader_impl.h
@@ -36,16 +36,21 @@ class ChromeDownloaderImpl : public ::i18n::addressinput::Downloader,
private:
struct Request {
- Request(const std::string& url, scoped_ptr<Callback> callback);
+ Request(const std::string& url,
+ scoped_ptr<net::URLFetcher> fetcher,
+ scoped_ptr<Callback> callback);
std::string url;
+ // The data that's received.
+ std::string data;
+ // The object that manages retrieving the data.
+ scoped_ptr<net::URLFetcher> fetcher;
scoped_ptr<Callback> callback;
};
net::URLRequestContextGetter* const getter_; // weak
- // Maps from active url fetcher to request metadata. Both the key and value
- // are owned.
+ // Maps from active url fetcher to request metadata. The value is owned.
std::map<const net::URLFetcher*, Request*> requests_;
DISALLOW_COPY_AND_ASSIGN(ChromeDownloaderImpl);