diff options
author | mmenke@chromium.org <mmenke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-01-28 13:32:03 +0000 |
---|---|---|
committer | mmenke@chromium.org <mmenke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-01-28 13:32:03 +0000 |
commit | ec5b02bb5176487ecba980748480a07d38c98077 (patch) | |
tree | 801e26f8141aa2c75bb9426a390ec5eaaca36447 /content/renderer/fetchers | |
parent | a7b6b40a3198a44da241b59ab99b840b43f12c37 (diff) | |
download | chromium_src-ec5b02bb5176487ecba980748480a07d38c98077.zip chromium_src-ec5b02bb5176487ecba980748480a07d38c98077.tar.gz chromium_src-ec5b02bb5176487ecba980748480a07d38c98077.tar.bz2 |
ResourceFetcher: Add POST support and the ability to set headers
These are needed to use the new Link Doctor API.
BUG=64832
R=darin@chromium.org, ttuttle@chromium.org
Review URL: https://codereview.chromium.org/140823010
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@247445 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/renderer/fetchers')
4 files changed, 75 insertions, 39 deletions
diff --git a/content/renderer/fetchers/image_resource_fetcher.cc b/content/renderer/fetchers/image_resource_fetcher.cc index f43b3d8..9fee6f4 100644 --- a/content/renderer/fetchers/image_resource_fetcher.cc +++ b/content/renderer/fetchers/image_resource_fetcher.cc @@ -31,10 +31,10 @@ ImageResourceFetcher::ImageResourceFetcher( id_(id), image_url_(image_url), image_size_(image_size) { - fetcher_.reset(ResourceFetcher::Create( - image_url, frame, target_type, - base::Bind(&ImageResourceFetcher::OnURLFetchComplete, - base::Unretained(this)))); + fetcher_.reset(ResourceFetcher::Create(image_url)); + fetcher_->Start(frame, target_type, + base::Bind(&ImageResourceFetcher::OnURLFetchComplete, + base::Unretained(this))); // Set subresource URL for crash reporting. base::debug::SetCrashKeyValue("subresource_url", image_url.spec()); diff --git a/content/renderer/fetchers/multi_resolution_image_resource_fetcher.cc b/content/renderer/fetchers/multi_resolution_image_resource_fetcher.cc index ea0e6d0..2f4b3ff 100644 --- a/content/renderer/fetchers/multi_resolution_image_resource_fetcher.cc +++ b/content/renderer/fetchers/multi_resolution_image_resource_fetcher.cc @@ -29,10 +29,11 @@ MultiResolutionImageResourceFetcher::MultiResolutionImageResourceFetcher( id_(id), http_status_code_(0), image_url_(image_url) { - fetcher_.reset(ResourceFetcher::Create( - image_url, frame, target_type, + fetcher_.reset(ResourceFetcher::Create(image_url)); + fetcher_->Start( + frame, target_type, base::Bind(&MultiResolutionImageResourceFetcher::OnURLFetchComplete, - base::Unretained(this)))); + base::Unretained(this))); } MultiResolutionImageResourceFetcher::~MultiResolutionImageResourceFetcher() { diff --git a/content/renderer/fetchers/resource_fetcher_impl.cc b/content/renderer/fetchers/resource_fetcher_impl.cc index 5c59de3..093ed76 100644 --- a/content/renderer/fetchers/resource_fetcher_impl.cc +++ b/content/renderer/fetchers/resource_fetcher_impl.cc @@ -7,6 +7,7 @@ #include "base/logging.h" #include "base/time/time.h" #include "third_party/WebKit/public/platform/Platform.h" +#include "third_party/WebKit/public/platform/WebHTTPBody.h" #include "third_party/WebKit/public/platform/WebURL.h" #include "third_party/WebKit/public/platform/WebURLError.h" #include "third_party/WebKit/public/platform/WebURLLoader.h" @@ -17,6 +18,7 @@ using base::TimeDelta; using blink::WebFrame; +using blink::WebHTTPBody; using blink::WebURLError; using blink::WebURLLoader; using blink::WebURLRequest; @@ -25,21 +27,13 @@ using blink::WebURLResponse; namespace content { // static -ResourceFetcher* ResourceFetcher::Create( - const GURL& url, WebFrame* frame, WebURLRequest::TargetType target_type, - const Callback& callback) { - return new ResourceFetcherImpl(url, frame, target_type, callback); +ResourceFetcher* ResourceFetcher::Create(const GURL& url) { + return new ResourceFetcherImpl(url); } -ResourceFetcherImpl::ResourceFetcherImpl(const GURL& url, WebFrame* frame, - WebURLRequest::TargetType target_type, - const Callback& callback) - : completed_(false), - callback_(callback) { - // Can't do anything without a frame. However, delegate can be NULL (so we - // can do a http request and ignore the results). - DCHECK(frame); - Start(url, frame, target_type); +ResourceFetcherImpl::ResourceFetcherImpl(const GURL& url) + : request_(url), + completed_(false) { } ResourceFetcherImpl::~ResourceFetcherImpl() { @@ -47,24 +41,62 @@ ResourceFetcherImpl::~ResourceFetcherImpl() { loader_->cancel(); } +void ResourceFetcherImpl::SetMethod(const std::string& method) { + DCHECK(!request_.isNull()); + DCHECK(!loader_); + + request_.setHTTPMethod(blink::WebString::fromUTF8(method)); +} + +void ResourceFetcherImpl::SetBody(const std::string& body) { + DCHECK(!request_.isNull()); + DCHECK(!loader_); + + WebHTTPBody web_http_body; + web_http_body.initialize(); + web_http_body.appendData(blink::WebData(body)); + request_.setHTTPBody(web_http_body); +} + +void ResourceFetcherImpl::SetHeader(const std::string& header, + const std::string& value) { + DCHECK(!request_.isNull()); + DCHECK(!loader_); + + request_.setHTTPHeaderField(blink::WebString::fromUTF8(header), + blink::WebString::fromUTF8(value)); +} + +void ResourceFetcherImpl::Start(WebFrame* frame, + WebURLRequest::TargetType target_type, + const Callback& callback) { + DCHECK(!loader_); + DCHECK(!request_.isNull()); + DCHECK(callback_.is_null()); + DCHECK(!completed_); + if (!request_.httpBody().isNull()) + DCHECK_NE("GET", request_.httpMethod().utf8()) << "GETs can't have bodies."; + + callback_ = callback; + + request_.setTargetType(target_type); + request_.setFirstPartyForCookies(frame->document().firstPartyForCookies()); + frame->dispatchWillSendRequest(request_); + loader_.reset(blink::Platform::current()->createURLLoader()); + loader_->loadAsynchronously(request_, this); + + // No need to hold on to the request. + request_.reset(); +} + void ResourceFetcherImpl::SetTimeout(const base::TimeDelta& timeout) { DCHECK(loader_); DCHECK(!completed_); + timeout_timer_.Start(FROM_HERE, timeout, this, &ResourceFetcherImpl::TimeoutFired); } -void ResourceFetcherImpl::Start(const GURL& url, WebFrame* frame, - WebURLRequest::TargetType target_type) { - WebURLRequest request(url); - request.setTargetType(target_type); - request.setFirstPartyForCookies(frame->document().firstPartyForCookies()); - frame->dispatchWillSendRequest(request); - - loader_.reset(blink::Platform::current()->createURLLoader()); - loader_->loadAsynchronously(request, this); -} - void ResourceFetcherImpl::RunCallback(const WebURLResponse& response, const std::string& data) { completed_ = true; diff --git a/content/renderer/fetchers/resource_fetcher_impl.h b/content/renderer/fetchers/resource_fetcher_impl.h index 2aa5d23..5ae09e2 100644 --- a/content/renderer/fetchers/resource_fetcher_impl.h +++ b/content/renderer/fetchers/resource_fetcher_impl.h @@ -31,22 +31,22 @@ class ResourceFetcherImpl : public ResourceFetcher, public blink::WebURLLoaderClient { public: // ResourceFetcher implementation: + virtual void SetMethod(const std::string& method) OVERRIDE; + virtual void SetBody(const std::string& body) OVERRIDE; + virtual void SetHeader(const std::string& header, + const std::string& value) OVERRIDE; + virtual void Start(blink::WebFrame* frame, + blink::WebURLRequest::TargetType target_type, + const Callback& callback) OVERRIDE; virtual void SetTimeout(const base::TimeDelta& timeout) OVERRIDE; private: friend class ResourceFetcher; - ResourceFetcherImpl( - const GURL& url, blink::WebFrame* frame, - blink::WebURLRequest::TargetType target_type, - const Callback& callback); + explicit ResourceFetcherImpl(const GURL& url); virtual ~ResourceFetcherImpl(); - // Start the actual download. - void Start(const GURL& url, blink::WebFrame* frame, - blink::WebURLRequest::TargetType target_type); - void RunCallback(const blink::WebURLResponse& response, const std::string& data); @@ -76,6 +76,9 @@ class ResourceFetcherImpl : public ResourceFetcher, scoped_ptr<blink::WebURLLoader> loader_; + // Request to send. Released once Start() is called. + blink::WebURLRequest request_; + // Set to true once the request is complete. bool completed_; |