summaryrefslogtreecommitdiffstats
path: root/content/renderer/fetchers
diff options
context:
space:
mode:
authormmenke@chromium.org <mmenke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-01-28 13:32:03 +0000
committermmenke@chromium.org <mmenke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-01-28 13:32:03 +0000
commitec5b02bb5176487ecba980748480a07d38c98077 (patch)
tree801e26f8141aa2c75bb9426a390ec5eaaca36447 /content/renderer/fetchers
parenta7b6b40a3198a44da241b59ab99b840b43f12c37 (diff)
downloadchromium_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')
-rw-r--r--content/renderer/fetchers/image_resource_fetcher.cc8
-rw-r--r--content/renderer/fetchers/multi_resolution_image_resource_fetcher.cc7
-rw-r--r--content/renderer/fetchers/resource_fetcher_impl.cc80
-rw-r--r--content/renderer/fetchers/resource_fetcher_impl.h19
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_;