diff options
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); |