diff options
author | davidben@chromium.org <davidben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-08-15 20:49:59 +0000 |
---|---|---|
committer | davidben@chromium.org <davidben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-08-15 20:51:41 +0000 |
commit | cba246463b2bda73877fc53da6d7eff97448d93d (patch) | |
tree | c8a77dfaff426ea06667b3714e4af2d9ed3b7d94 /content/browser/loader | |
parent | 7d0a0cac7c1233e6beeaf7ca8092f89f81e950ef (diff) | |
download | chromium_src-cba246463b2bda73877fc53da6d7eff97448d93d.zip chromium_src-cba246463b2bda73877fc53da6d7eff97448d93d.tar.gz chromium_src-cba246463b2bda73877fc53da6d7eff97448d93d.tar.bz2 |
Plumb redirect info out of net, through content, and into child processes.
This saves the logic in PluginURLFetcher and WebURLLoader that has to replicate
the method-munging, referrer-munging, and first-party-URL-munging logic that is
already done in net/.
BUG=384609
Review URL: https://codereview.chromium.org/398903002
Cr-Commit-Position: refs/heads/master@{#290005}
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@290005 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser/loader')
21 files changed, 82 insertions, 60 deletions
diff --git a/content/browser/loader/async_resource_handler.cc b/content/browser/loader/async_resource_handler.cc index 4038771..87d82ca 100644 --- a/content/browser/loader/async_resource_handler.cc +++ b/content/browser/loader/async_resource_handler.cc @@ -29,6 +29,7 @@ #include "net/base/load_flags.h" #include "net/base/net_log.h" #include "net/base/net_util.h" +#include "net/url_request/redirect_info.h" using base::TimeTicks; @@ -134,9 +135,10 @@ bool AsyncResourceHandler::OnUploadProgress(uint64 position, new ResourceMsg_UploadProgress(GetRequestID(), position, size)); } -bool AsyncResourceHandler::OnRequestRedirected(const GURL& new_url, - ResourceResponse* response, - bool* defer) { +bool AsyncResourceHandler::OnRequestRedirected( + const net::RedirectInfo& redirect_info, + ResourceResponse* response, + bool* defer) { const ResourceRequestInfoImpl* info = GetRequestInfo(); if (!info->filter()) return false; @@ -146,7 +148,7 @@ bool AsyncResourceHandler::OnRequestRedirected(const GURL& new_url, if (rdh_->delegate()) { rdh_->delegate()->OnRequestRedirected( - new_url, request(), info->GetContext(), response); + redirect_info.new_url, request(), info->GetContext(), response); } DevToolsNetLogObserver::PopulateResponseInfo(request(), response); @@ -159,8 +161,7 @@ bool AsyncResourceHandler::OnRequestRedirected(const GURL& new_url, // and hopefully those will eventually all be owned by the browser. It's // possible this is still needed while renderer-owned ones exist. return info->filter()->Send(new ResourceMsg_ReceivedRedirect( - GetRequestID(), new_url, request()->first_party_for_cookies(), - response->head)); + GetRequestID(), redirect_info, response->head)); } bool AsyncResourceHandler::OnResponseStarted(ResourceResponse* response, diff --git a/content/browser/loader/async_resource_handler.h b/content/browser/loader/async_resource_handler.h index b082119..6842b19 100644 --- a/content/browser/loader/async_resource_handler.h +++ b/content/browser/loader/async_resource_handler.h @@ -36,7 +36,7 @@ class AsyncResourceHandler : public ResourceHandler, // ResourceHandler implementation: virtual bool OnUploadProgress(uint64 position, uint64 size) OVERRIDE; - virtual bool OnRequestRedirected(const GURL& new_url, + virtual bool OnRequestRedirected(const net::RedirectInfo& redirect_info, ResourceResponse* response, bool* defer) OVERRIDE; virtual bool OnResponseStarted(ResourceResponse* response, diff --git a/content/browser/loader/certificate_resource_handler.cc b/content/browser/loader/certificate_resource_handler.cc index 9b3a607..eb1976b 100644 --- a/content/browser/loader/certificate_resource_handler.cc +++ b/content/browser/loader/certificate_resource_handler.cc @@ -12,6 +12,7 @@ #include "net/base/mime_sniffer.h" #include "net/base/mime_util.h" #include "net/http/http_response_headers.h" +#include "net/url_request/redirect_info.h" #include "net/url_request/url_request.h" #include "net/url_request/url_request_status.h" @@ -34,10 +35,10 @@ bool CertificateResourceHandler::OnUploadProgress(uint64 position, return true; } -bool CertificateResourceHandler::OnRequestRedirected(const GURL& url, - ResourceResponse* resp, - bool* defer) { - url_ = url; +bool CertificateResourceHandler::OnRequestRedirected( + const net::RedirectInfo& redirect_info, + ResourceResponse* resp, + bool* defer) { return true; } diff --git a/content/browser/loader/certificate_resource_handler.h b/content/browser/loader/certificate_resource_handler.h index 9c67860..b91e495 100644 --- a/content/browser/loader/certificate_resource_handler.h +++ b/content/browser/loader/certificate_resource_handler.h @@ -14,7 +14,6 @@ #include "base/memory/scoped_ptr.h" #include "content/browser/loader/resource_handler.h" #include "net/base/mime_util.h" -#include "url/gurl.h" namespace net { class IOBuffer; @@ -37,7 +36,7 @@ class CertificateResourceHandler : public ResourceHandler { virtual bool OnUploadProgress(uint64 position, uint64 size) OVERRIDE; // Not needed, as this event handler ought to be the final resource. - virtual bool OnRequestRedirected(const GURL& url, + virtual bool OnRequestRedirected(const net::RedirectInfo& redirect_info, ResourceResponse* resp, bool* defer) OVERRIDE; @@ -73,7 +72,6 @@ class CertificateResourceHandler : public ResourceHandler { void AssembleResource(); - GURL url_; size_t content_length_; ContentVector buffer_; scoped_refptr<net::IOBuffer> read_buffer_; diff --git a/content/browser/loader/cross_site_resource_handler.cc b/content/browser/loader/cross_site_resource_handler.cc index 486f6f9..6efe97d 100644 --- a/content/browser/loader/cross_site_resource_handler.cc +++ b/content/browser/loader/cross_site_resource_handler.cc @@ -128,17 +128,12 @@ CrossSiteResourceHandler::~CrossSiteResourceHandler() { } bool CrossSiteResourceHandler::OnRequestRedirected( - const GURL& new_url, + const net::RedirectInfo& redirect_info, ResourceResponse* response, bool* defer) { - // Top-level requests change their cookie first-party URL on redirects, while - // subframes retain the parent's value. - if (GetRequestInfo()->GetResourceType() == RESOURCE_TYPE_MAIN_FRAME) - request()->set_first_party_for_cookies(new_url); - // We should not have started the transition before being redirected. DCHECK(!in_cross_site_transition_); - return next_handler_->OnRequestRedirected(new_url, response, defer); + return next_handler_->OnRequestRedirected(redirect_info, response, defer); } bool CrossSiteResourceHandler::OnResponseStarted( diff --git a/content/browser/loader/cross_site_resource_handler.h b/content/browser/loader/cross_site_resource_handler.h index edbd151..ef29d90 100644 --- a/content/browser/loader/cross_site_resource_handler.h +++ b/content/browser/loader/cross_site_resource_handler.h @@ -31,7 +31,7 @@ class CrossSiteResourceHandler : public LayeredResourceHandler { virtual ~CrossSiteResourceHandler(); // ResourceHandler implementation: - virtual bool OnRequestRedirected(const GURL& new_url, + virtual bool OnRequestRedirected(const net::RedirectInfo& redirect_info, ResourceResponse* response, bool* defer) OVERRIDE; virtual bool OnResponseStarted(ResourceResponse* response, diff --git a/content/browser/loader/detachable_resource_handler.cc b/content/browser/loader/detachable_resource_handler.cc index b8ef55d..1fe9f06 100644 --- a/content/browser/loader/detachable_resource_handler.cc +++ b/content/browser/loader/detachable_resource_handler.cc @@ -89,15 +89,17 @@ bool DetachableResourceHandler::OnUploadProgress(uint64 position, uint64 size) { return next_handler_->OnUploadProgress(position, size); } -bool DetachableResourceHandler::OnRequestRedirected(const GURL& url, - ResourceResponse* response, - bool* defer) { +bool DetachableResourceHandler::OnRequestRedirected( + const net::RedirectInfo& redirect_info, + ResourceResponse* response, + bool* defer) { DCHECK(!is_deferred_); if (!next_handler_) return true; - bool ret = next_handler_->OnRequestRedirected(url, response, &is_deferred_); + bool ret = next_handler_->OnRequestRedirected( + redirect_info, response, &is_deferred_); *defer = is_deferred_; return ret; } diff --git a/content/browser/loader/detachable_resource_handler.h b/content/browser/loader/detachable_resource_handler.h index 9a68570..60181ad 100644 --- a/content/browser/loader/detachable_resource_handler.h +++ b/content/browser/loader/detachable_resource_handler.h @@ -49,7 +49,7 @@ class DetachableResourceHandler : public ResourceHandler, // ResourceHandler implementation: virtual void SetController(ResourceController* controller) OVERRIDE; virtual bool OnUploadProgress(uint64 position, uint64 size) OVERRIDE; - virtual bool OnRequestRedirected(const GURL& url, + virtual bool OnRequestRedirected(const net::RedirectInfo& redirect_info, ResourceResponse* response, bool* defer) OVERRIDE; virtual bool OnResponseStarted(ResourceResponse* response, diff --git a/content/browser/loader/layered_resource_handler.cc b/content/browser/loader/layered_resource_handler.cc index 1c65820..fa15b0d 100644 --- a/content/browser/loader/layered_resource_handler.cc +++ b/content/browser/loader/layered_resource_handler.cc @@ -35,11 +35,12 @@ bool LayeredResourceHandler::OnUploadProgress(uint64 position, return next_handler_->OnUploadProgress(position, size); } -bool LayeredResourceHandler::OnRequestRedirected(const GURL& url, - ResourceResponse* response, - bool* defer) { +bool LayeredResourceHandler::OnRequestRedirected( + const net::RedirectInfo& redirect_info, + ResourceResponse* response, + bool* defer) { DCHECK(next_handler_.get()); - return next_handler_->OnRequestRedirected(url, response, defer); + return next_handler_->OnRequestRedirected(redirect_info, response, defer); } bool LayeredResourceHandler::OnResponseStarted(ResourceResponse* response, diff --git a/content/browser/loader/layered_resource_handler.h b/content/browser/loader/layered_resource_handler.h index dc6de23..3a092c3 100644 --- a/content/browser/loader/layered_resource_handler.h +++ b/content/browser/loader/layered_resource_handler.h @@ -26,7 +26,7 @@ class CONTENT_EXPORT LayeredResourceHandler : public ResourceHandler { // ResourceHandler implementation: virtual void SetController(ResourceController* controller) OVERRIDE; virtual bool OnUploadProgress(uint64 position, uint64 size) OVERRIDE; - virtual bool OnRequestRedirected(const GURL& url, + virtual bool OnRequestRedirected(const net::RedirectInfo& redirect_info, ResourceResponse* response, bool* defer) OVERRIDE; virtual bool OnResponseStarted(ResourceResponse* response, diff --git a/content/browser/loader/resource_dispatcher_host_impl.cc b/content/browser/loader/resource_dispatcher_host_impl.cc index 3b66397..f63b7cf 100644 --- a/content/browser/loader/resource_dispatcher_host_impl.cc +++ b/content/browser/loader/resource_dispatcher_host_impl.cc @@ -517,6 +517,15 @@ DownloadInterruptReason ResourceDispatcherHostImpl::BeginDownload( } request->SetLoadFlags(request->load_flags() | extra_load_flags); + // We treat a download as a main frame load, and thus update the policy URL on + // redirects. + // + // TODO(davidben): Is this correct? If this came from a + // ViewHostMsg_DownloadUrl in a frame, should it have first-party URL set + // appropriately? + request->set_first_party_url_policy( + net::URLRequest::UPDATE_FIRST_PARTY_URL_ON_REDIRECT); + // Check if the renderer is permitted to request the requested URL. if (!ChildProcessSecurityPolicyImpl::GetInstance()-> CanRequestURL(child_id, url)) { @@ -1034,6 +1043,13 @@ void ResourceDispatcherHostImpl::BeginRequest( new_request->set_first_party_for_cookies( request_data.first_party_for_cookies); + // If the request is a MAIN_FRAME request, the first-party URL gets updated on + // redirects. + if (request_data.resource_type == RESOURCE_TYPE_MAIN_FRAME) { + new_request->set_first_party_url_policy( + net::URLRequest::UPDATE_FIRST_PARTY_URL_ON_REDIRECT); + } + const Referrer referrer(request_data.referrer, request_data.referrer_policy); SetReferrerForRequest(new_request.get(), referrer); diff --git a/content/browser/loader/resource_handler.h b/content/browser/loader/resource_handler.h index a9d8a38..306a672 100644 --- a/content/browser/loader/resource_handler.h +++ b/content/browser/loader/resource_handler.h @@ -25,6 +25,7 @@ namespace net { class IOBuffer; class URLRequest; class URLRequestStatus; +struct RedirectInfo; } // namespace net namespace content { @@ -51,7 +52,7 @@ class CONTENT_EXPORT ResourceHandler // false. Set |*defer| to true to defer the redirect. The redirect may be // followed later on via ResourceDispatcherHost::FollowDeferredRedirect. If // the handler returns false, then the request is cancelled. - virtual bool OnRequestRedirected(const GURL& url, + virtual bool OnRequestRedirected(const net::RedirectInfo& redirect_info, ResourceResponse* response, bool* defer) = 0; diff --git a/content/browser/loader/resource_loader.cc b/content/browser/loader/resource_loader.cc index f8a70d1..a0713eb 100644 --- a/content/browser/loader/resource_loader.cc +++ b/content/browser/loader/resource_loader.cc @@ -30,6 +30,7 @@ #include "net/base/load_flags.h" #include "net/http/http_response_headers.h" #include "net/ssl/client_cert_store.h" +#include "net/url_request/redirect_info.h" #include "net/url_request/url_request_status.h" using base::TimeDelta; @@ -199,7 +200,7 @@ void ResourceLoader::OnUploadProgressACK() { } void ResourceLoader::OnReceivedRedirect(net::URLRequest* unused, - const GURL& new_url, + const net::RedirectInfo& redirect_info, bool* defer) { DCHECK_EQ(request_.get(), unused); @@ -210,18 +211,18 @@ void ResourceLoader::OnReceivedRedirect(net::URLRequest* unused, if (info->GetProcessType() != PROCESS_TYPE_PLUGIN && !ChildProcessSecurityPolicyImpl::GetInstance()-> - CanRequestURL(info->GetChildID(), new_url)) { + CanRequestURL(info->GetChildID(), redirect_info.new_url)) { VLOG(1) << "Denied unauthorized request for " - << new_url.possibly_invalid_spec(); + << redirect_info.new_url.possibly_invalid_spec(); // Tell the renderer that this request was disallowed. Cancel(); return; } - delegate_->DidReceiveRedirect(this, new_url); + delegate_->DidReceiveRedirect(this, redirect_info.new_url); - if (delegate_->HandleExternalProtocol(this, new_url)) { + if (delegate_->HandleExternalProtocol(this, redirect_info.new_url)) { // The request is complete so we can remove it. CancelAndIgnore(); return; @@ -230,7 +231,7 @@ void ResourceLoader::OnReceivedRedirect(net::URLRequest* unused, scoped_refptr<ResourceResponse> response(new ResourceResponse()); PopulateResourceResponse(info, request_.get(), response.get()); - if (!handler_->OnRequestRedirected(new_url, response.get(), defer)) { + if (!handler_->OnRequestRedirected(redirect_info, response.get(), defer)) { Cancel(); } else if (*defer) { deferred_stage_ = DEFERRED_REDIRECT; // Follow redirect when resumed. diff --git a/content/browser/loader/resource_loader.h b/content/browser/loader/resource_loader.h index d06f58c..21f800e 100644 --- a/content/browser/loader/resource_loader.h +++ b/content/browser/loader/resource_loader.h @@ -57,7 +57,7 @@ class CONTENT_EXPORT ResourceLoader : public net::URLRequest::Delegate, // net::URLRequest::Delegate implementation: virtual void OnReceivedRedirect(net::URLRequest* request, - const GURL& new_url, + const net::RedirectInfo& redirect_info, bool* defer) OVERRIDE; virtual void OnAuthRequired(net::URLRequest* request, net::AuthChallengeInfo* info) OVERRIDE; diff --git a/content/browser/loader/resource_loader_unittest.cc b/content/browser/loader/resource_loader_unittest.cc index 047e404..1e489e8 100644 --- a/content/browser/loader/resource_loader_unittest.cc +++ b/content/browser/loader/resource_loader_unittest.cc @@ -132,7 +132,7 @@ class ResourceHandlerStub : public ResourceHandler { return true; } - virtual bool OnRequestRedirected(const GURL& url, + virtual bool OnRequestRedirected(const net::RedirectInfo& redirect_info, ResourceResponse* response, bool* defer) OVERRIDE { NOTREACHED(); diff --git a/content/browser/loader/stream_resource_handler.cc b/content/browser/loader/stream_resource_handler.cc index 46713fc..0a2d6e8 100644 --- a/content/browser/loader/stream_resource_handler.cc +++ b/content/browser/loader/stream_resource_handler.cc @@ -36,9 +36,10 @@ bool StreamResourceHandler::OnUploadProgress(uint64 position, return true; } -bool StreamResourceHandler::OnRequestRedirected(const GURL& url, - ResourceResponse* resp, - bool* defer) { +bool StreamResourceHandler::OnRequestRedirected( + const net::RedirectInfo& redirect_info, + ResourceResponse* resp, + bool* defer) { return true; } diff --git a/content/browser/loader/stream_resource_handler.h b/content/browser/loader/stream_resource_handler.h index 3b8bc21..75a987d 100644 --- a/content/browser/loader/stream_resource_handler.h +++ b/content/browser/loader/stream_resource_handler.h @@ -34,7 +34,7 @@ class StreamResourceHandler : public StreamWriteObserver, virtual bool OnUploadProgress(uint64 position, uint64 size) OVERRIDE; // Not needed, as this event handler ought to be the final resource. - virtual bool OnRequestRedirected(const GURL& url, + virtual bool OnRequestRedirected(const net::RedirectInfo& redirect_info, ResourceResponse* resp, bool* defer) OVERRIDE; diff --git a/content/browser/loader/sync_resource_handler.cc b/content/browser/loader/sync_resource_handler.cc index 090b939..1da8887 100644 --- a/content/browser/loader/sync_resource_handler.cc +++ b/content/browser/loader/sync_resource_handler.cc @@ -14,6 +14,7 @@ #include "content/public/browser/resource_request_info.h" #include "net/base/io_buffer.h" #include "net/http/http_response_headers.h" +#include "net/url_request/redirect_info.h" namespace content { @@ -45,23 +46,24 @@ bool SyncResourceHandler::OnUploadProgress(uint64 position, uint64 size) { } bool SyncResourceHandler::OnRequestRedirected( - const GURL& new_url, + const net::RedirectInfo& redirect_info, ResourceResponse* response, bool* defer) { if (rdh_->delegate()) { rdh_->delegate()->OnRequestRedirected( - new_url, request(), GetRequestInfo()->GetContext(), response); + redirect_info.new_url, request(), GetRequestInfo()->GetContext(), + response); } DevToolsNetLogObserver::PopulateResponseInfo(request(), response); // TODO(darin): It would be much better if this could live in WebCore, but // doing so requires API changes at all levels. Similar code exists in // WebCore/platform/network/cf/ResourceHandleCFNet.cpp :-( - if (new_url.GetOrigin() != result_.final_url.GetOrigin()) { + if (redirect_info.new_url.GetOrigin() != result_.final_url.GetOrigin()) { LOG(ERROR) << "Cross origin redirect denied"; return false; } - result_.final_url = new_url; + result_.final_url = redirect_info.new_url; total_transfer_size_ += request()->GetTotalReceivedBytes(); return true; diff --git a/content/browser/loader/sync_resource_handler.h b/content/browser/loader/sync_resource_handler.h index 693b48f..bc26e4b 100644 --- a/content/browser/loader/sync_resource_handler.h +++ b/content/browser/loader/sync_resource_handler.h @@ -34,7 +34,7 @@ class SyncResourceHandler : public ResourceHandler { virtual ~SyncResourceHandler(); virtual bool OnUploadProgress(uint64 position, uint64 size) OVERRIDE; - virtual bool OnRequestRedirected(const GURL& new_url, + virtual bool OnRequestRedirected(const net::RedirectInfo& redirect_info, ResourceResponse* response, bool* defer) OVERRIDE; virtual bool OnResponseStarted(ResourceResponse* response, diff --git a/content/browser/loader/throttling_resource_handler.cc b/content/browser/loader/throttling_resource_handler.cc index 9b1df54..1f17d33 100644 --- a/content/browser/loader/throttling_resource_handler.cc +++ b/content/browser/loader/throttling_resource_handler.cc @@ -31,22 +31,23 @@ ThrottlingResourceHandler::ThrottlingResourceHandler( ThrottlingResourceHandler::~ThrottlingResourceHandler() { } -bool ThrottlingResourceHandler::OnRequestRedirected(const GURL& new_url, - ResourceResponse* response, - bool* defer) { +bool ThrottlingResourceHandler::OnRequestRedirected( + const net::RedirectInfo& redirect_info, + ResourceResponse* response, + bool* defer) { DCHECK(!cancelled_by_resource_throttle_); *defer = false; while (next_index_ < throttles_.size()) { int index = next_index_; - throttles_[index]->WillRedirectRequest(new_url, defer); + throttles_[index]->WillRedirectRequest(redirect_info.new_url, defer); next_index_++; if (cancelled_by_resource_throttle_) return false; if (*defer) { OnRequestDefered(index); deferred_stage_ = DEFERRED_REDIRECT; - deferred_url_ = new_url; + deferred_redirect_ = redirect_info; deferred_response_ = response; return true; // Do not cancel. } @@ -54,7 +55,7 @@ bool ThrottlingResourceHandler::OnRequestRedirected(const GURL& new_url, next_index_ = 0; // Reset for next time. - return next_handler_->OnRequestRedirected(new_url, response, defer); + return next_handler_->OnRequestRedirected(redirect_info, response, defer); } bool ThrottlingResourceHandler::OnWillStart(const GURL& url, bool* defer) { @@ -199,13 +200,13 @@ void ThrottlingResourceHandler::ResumeNetworkStart() { void ThrottlingResourceHandler::ResumeRedirect() { DCHECK(!cancelled_by_resource_throttle_); - GURL new_url = deferred_url_; - deferred_url_ = GURL(); + net::RedirectInfo redirect_info = deferred_redirect_; + deferred_redirect_ = net::RedirectInfo(); scoped_refptr<ResourceResponse> response; deferred_response_.swap(response); bool defer = false; - if (!OnRequestRedirected(new_url, response.get(), &defer)) { + if (!OnRequestRedirected(redirect_info, response.get(), &defer)) { controller()->Cancel(); } else if (!defer) { controller()->Resume(); diff --git a/content/browser/loader/throttling_resource_handler.h b/content/browser/loader/throttling_resource_handler.h index fd284db..4e1b814 100644 --- a/content/browser/loader/throttling_resource_handler.h +++ b/content/browser/loader/throttling_resource_handler.h @@ -9,6 +9,7 @@ #include "base/memory/scoped_vector.h" #include "content/browser/loader/layered_resource_handler.h" #include "content/public/browser/resource_controller.h" +#include "net/url_request/redirect_info.h" #include "url/gurl.h" namespace net { @@ -31,7 +32,7 @@ class ThrottlingResourceHandler : public LayeredResourceHandler, virtual ~ThrottlingResourceHandler(); // LayeredResourceHandler overrides: - virtual bool OnRequestRedirected(const GURL& url, + virtual bool OnRequestRedirected(const net::RedirectInfo& redirect_info, ResourceResponse* response, bool* defer) OVERRIDE; virtual bool OnResponseStarted(ResourceResponse* response, @@ -68,6 +69,7 @@ class ThrottlingResourceHandler : public LayeredResourceHandler, size_t next_index_; GURL deferred_url_; + net::RedirectInfo deferred_redirect_; scoped_refptr<ResourceResponse> deferred_response_; bool cancelled_by_resource_throttle_; |