diff options
66 files changed, 488 insertions, 300 deletions
diff --git a/chrome/browser/chromeos/drive/drive_url_request_job_unittest.cc b/chrome/browser/chromeos/drive/drive_url_request_job_unittest.cc index aaa3e30..cc99b38 100644 --- a/chrome/browser/chromeos/drive/drive_url_request_job_unittest.cc +++ b/chrome/browser/chromeos/drive/drive_url_request_job_unittest.cc @@ -24,6 +24,7 @@ #include "net/base/request_priority.h" #include "net/base/test_completion_callback.h" #include "net/http/http_byte_range.h" +#include "net/url_request/redirect_info.h" #include "net/url_request/url_request_test_util.h" #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h" @@ -81,10 +82,11 @@ class TestDelegate : public net::TestDelegate { // net::TestDelegate override. virtual void OnReceivedRedirect(net::URLRequest* request, - const GURL& new_url, + const net::RedirectInfo& redirect_info, bool* defer_redirect) OVERRIDE{ - redirect_url_ = new_url; - net::TestDelegate::OnReceivedRedirect(request, new_url, defer_redirect); + redirect_url_ = redirect_info.new_url; + net::TestDelegate::OnReceivedRedirect( + request, redirect_info, defer_redirect); } private: diff --git a/chrome/browser/prerender/prerender_tracker_unittest.cc b/chrome/browser/prerender/prerender_tracker_unittest.cc index eb19533..54b77a9 100644 --- a/chrome/browser/prerender/prerender_tracker_unittest.cc +++ b/chrome/browser/prerender/prerender_tracker_unittest.cc @@ -22,6 +22,7 @@ #include "content/test/net/url_request_mock_http_job.h" #include "ipc/ipc_message.h" #include "net/base/request_priority.h" +#include "net/url_request/redirect_info.h" #include "net/url_request/url_request.h" #include "net/url_request/url_request_test_util.h" #include "testing/gtest/include/gtest/gtest.h" @@ -119,13 +120,13 @@ class DeferredRedirectDelegate : 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_redirect) OVERRIDE { // Defer the redirect either way. *defer_redirect = true; // Find out what the throttle would have done. - throttle_->WillRedirectRequest(new_url, &was_deferred_); + throttle_->WillRedirectRequest(redirect_info.new_url, &was_deferred_); run_loop_->Quit(); } virtual void OnResponseStarted(net::URLRequest* request) OVERRIDE { } diff --git a/chrome/renderer/extensions/extension_localization_peer.cc b/chrome/renderer/extensions/extension_localization_peer.cc index ec93caf..8c20331 100644 --- a/chrome/renderer/extensions/extension_localization_peer.cc +++ b/chrome/renderer/extensions/extension_localization_peer.cc @@ -46,8 +46,7 @@ void ExtensionLocalizationPeer::OnUploadProgress( } bool ExtensionLocalizationPeer::OnReceivedRedirect( - const GURL& new_url, - const GURL& new_first_party_for_cookies, + const net::RedirectInfo& redirect_info, const content::ResourceResponseInfo& info) { NOTREACHED(); return false; diff --git a/chrome/renderer/extensions/extension_localization_peer.h b/chrome/renderer/extensions/extension_localization_peer.h index 4d6c056..95127cd 100644 --- a/chrome/renderer/extensions/extension_localization_peer.h +++ b/chrome/renderer/extensions/extension_localization_peer.h @@ -34,8 +34,7 @@ class ExtensionLocalizationPeer : public content::RequestPeer { // content::RequestPeer methods. virtual void OnUploadProgress(uint64 position, uint64 size) OVERRIDE; virtual bool OnReceivedRedirect( - const GURL& new_url, - const GURL& new_first_party_for_cookies, + const net::RedirectInfo& redirect_info, const content::ResourceResponseInfo& info) OVERRIDE; virtual void OnReceivedResponse( const content::ResourceResponseInfo& info) OVERRIDE; diff --git a/chrome/renderer/extensions/extension_localization_peer_unittest.cc b/chrome/renderer/extensions/extension_localization_peer_unittest.cc index 750405b..38ad056 100644 --- a/chrome/renderer/extensions/extension_localization_peer_unittest.cc +++ b/chrome/renderer/extensions/extension_localization_peer_unittest.cc @@ -11,6 +11,7 @@ #include "ipc/ipc_sender.h" #include "ipc/ipc_sync_message.h" #include "net/base/net_errors.h" +#include "net/url_request/redirect_info.h" #include "net/url_request/url_request_status.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -55,9 +56,8 @@ class MockRequestPeer : public content::RequestPeer { virtual ~MockRequestPeer() {} MOCK_METHOD2(OnUploadProgress, void(uint64 position, uint64 size)); - MOCK_METHOD3(OnReceivedRedirect, - bool(const GURL& new_url, - const GURL& new_first_party_for_cookies, + MOCK_METHOD2(OnReceivedRedirect, + bool(const net::RedirectInfo& redirect_info, const content::ResourceResponseInfo& info)); MOCK_METHOD1(OnReceivedResponse, void(const content::ResourceResponseInfo& info)); diff --git a/chrome/renderer/security_filter_peer.cc b/chrome/renderer/security_filter_peer.cc index ce8c5bc..e43e7ec 100644 --- a/chrome/renderer/security_filter_peer.cc +++ b/chrome/renderer/security_filter_peer.cc @@ -69,8 +69,7 @@ void SecurityFilterPeer::OnUploadProgress(uint64 position, uint64 size) { } bool SecurityFilterPeer::OnReceivedRedirect( - const GURL& new_url, - const GURL& new_first_party_for_cookies, + const net::RedirectInfo& redirect_info, const content::ResourceResponseInfo& info) { NOTREACHED(); return false; diff --git a/chrome/renderer/security_filter_peer.h b/chrome/renderer/security_filter_peer.h index 8fa57497..792fba4 100644 --- a/chrome/renderer/security_filter_peer.h +++ b/chrome/renderer/security_filter_peer.h @@ -14,7 +14,7 @@ // unsafe resources (such as mixed-content resource). // Call the factory method CreateSecurityFilterPeer() to obtain an instance of // SecurityFilterPeer based on the original Peer. -// NOTE: subclasses should insure they delete themselves at the end of the +// NOTE: subclasses should ensure they delete themselves at the end of the // OnReceiveComplete call. class SecurityFilterPeer : public content::RequestPeer { public: @@ -32,8 +32,7 @@ class SecurityFilterPeer : public content::RequestPeer { // content::RequestPeer methods. virtual void OnUploadProgress(uint64 position, uint64 size) OVERRIDE; virtual bool OnReceivedRedirect( - const GURL& new_url, - const GURL& new_first_party_for_cookies, + const net::RedirectInfo& redirect_info, const content::ResourceResponseInfo& info) OVERRIDE; virtual void OnReceivedResponse( const content::ResourceResponseInfo& info) OVERRIDE; diff --git a/components/navigation_interception/intercept_navigation_resource_throttle.cc b/components/navigation_interception/intercept_navigation_resource_throttle.cc index f8f094e..8729d2c 100644 --- a/components/navigation_interception/intercept_navigation_resource_throttle.cc +++ b/components/navigation_interception/intercept_navigation_resource_throttle.cc @@ -92,6 +92,8 @@ std::string InterceptNavigationResourceThrottle::GetMethodAfterRedirect() { net::HttpResponseHeaders* headers = request_->response_headers(); if (!headers) return request_->method(); + // TODO(davidben): Plumb net::RedirectInfo through content::ResourceThrottle + // and unexpose net::URLRequest::ComputeMethodForRedirect. return net::URLRequest::ComputeMethodForRedirect( request_->method(), headers->response_code()); } diff --git a/content/browser/appcache/appcache_update_job.cc b/content/browser/appcache/appcache_update_job.cc index 347d4b5c..351bd80 100644 --- a/content/browser/appcache/appcache_update_job.cc +++ b/content/browser/appcache/appcache_update_job.cc @@ -140,7 +140,9 @@ void AppCacheUpdateJob::URLFetcher::Start() { } void AppCacheUpdateJob::URLFetcher::OnReceivedRedirect( - net::URLRequest* request, const GURL& new_url, bool* defer_redirect) { + net::URLRequest* request, + const net::RedirectInfo& redirect_info, + bool* defer_redirect) { DCHECK(request_ == request); // Redirect is not allowed by the update process. job_->MadeProgress(); diff --git a/content/browser/appcache/appcache_update_job.h b/content/browser/appcache/appcache_update_job.h index a2c4df8..4da4ac2 100644 --- a/content/browser/appcache/appcache_update_job.h +++ b/content/browser/appcache/appcache_update_job.h @@ -135,7 +135,7 @@ class CONTENT_EXPORT AppCacheUpdateJob private: // URLRequest::Delegate overrides virtual void OnReceivedRedirect(net::URLRequest* request, - const GURL& new_url, + const net::RedirectInfo& redirect_info, bool* defer_redirect) OVERRIDE; virtual void OnResponseStarted(net::URLRequest* request) OVERRIDE; virtual void OnReadCompleted(net::URLRequest* request, diff --git a/content/browser/download/download_resource_handler.cc b/content/browser/download/download_resource_handler.cc index 073e25c..f2fb2a5 100644 --- a/content/browser/download/download_resource_handler.cc +++ b/content/browser/download/download_resource_handler.cc @@ -141,12 +141,9 @@ bool DownloadResourceHandler::OnUploadProgress(uint64 position, } bool DownloadResourceHandler::OnRequestRedirected( - const GURL& url, + const net::RedirectInfo& redirect_info, ResourceResponse* response, bool* defer) { - // We treat a download as a main frame load, and thus update the policy URL - // on redirects. - request()->set_first_party_for_cookies(url); return true; } diff --git a/content/browser/download/download_resource_handler.h b/content/browser/download/download_resource_handler.h index de6efef..68169bc 100644 --- a/content/browser/download/download_resource_handler.h +++ b/content/browser/download/download_resource_handler.h @@ -48,7 +48,7 @@ class CONTENT_EXPORT DownloadResourceHandler 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; diff --git a/content/browser/download/save_file_resource_handler.cc b/content/browser/download/save_file_resource_handler.cc index e1fc32b..17c29ed 100644 --- a/content/browser/download/save_file_resource_handler.cc +++ b/content/browser/download/save_file_resource_handler.cc @@ -11,6 +11,7 @@ #include "content/browser/download/save_file_manager.h" #include "content/public/browser/browser_thread.h" #include "net/base/io_buffer.h" +#include "net/url_request/redirect_info.h" #include "net/url_request/url_request_status.h" namespace content { @@ -37,10 +38,10 @@ bool SaveFileResourceHandler::OnUploadProgress(uint64 position, uint64 size) { } bool SaveFileResourceHandler::OnRequestRedirected( - const GURL& url, + const net::RedirectInfo& redirect_info, ResourceResponse* response, bool* defer) { - final_url_ = url; + final_url_ = redirect_info.new_url; return true; } diff --git a/content/browser/download/save_file_resource_handler.h b/content/browser/download/save_file_resource_handler.h index 5adbc5c..beca8dc 100644 --- a/content/browser/download/save_file_resource_handler.h +++ b/content/browser/download/save_file_resource_handler.h @@ -33,7 +33,7 @@ class SaveFileResourceHandler : public ResourceHandler { // Saves the redirected URL to final_url_, we need to use the original // URL to match original request. - virtual bool OnRequestRedirected(const GURL& url, + virtual bool OnRequestRedirected(const net::RedirectInfo& redirect_info, ResourceResponse* response, bool* defer) OVERRIDE; 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_; diff --git a/content/browser/service_worker/service_worker_url_request_job.cc b/content/browser/service_worker/service_worker_url_request_job.cc index fd101a0..94298ca 100644 --- a/content/browser/service_worker/service_worker_url_request_job.cc +++ b/content/browser/service_worker/service_worker_url_request_job.cc @@ -117,9 +117,10 @@ bool ServiceWorkerURLRequestJob::ReadRawData( return status.is_success(); } -void ServiceWorkerURLRequestJob::OnReceivedRedirect(net::URLRequest* request, - const GURL& new_url, - bool* defer_redirect) { +void ServiceWorkerURLRequestJob::OnReceivedRedirect( + net::URLRequest* request, + const net::RedirectInfo& redirect_info, + bool* defer_redirect) { NOTREACHED(); } diff --git a/content/browser/service_worker/service_worker_url_request_job.h b/content/browser/service_worker/service_worker_url_request_job.h index 4da11fe..dbbba10 100644 --- a/content/browser/service_worker/service_worker_url_request_job.h +++ b/content/browser/service_worker/service_worker_url_request_job.h @@ -64,7 +64,7 @@ class CONTENT_EXPORT ServiceWorkerURLRequestJob // net::URLRequest::Delegate overrides that read the blob from the // ServiceWorkerFetchResponse. virtual void OnReceivedRedirect(net::URLRequest* request, - const GURL& new_url, + const net::RedirectInfo& redirect_info, bool* defer_redirect) OVERRIDE; virtual void OnAuthRequired(net::URLRequest* request, net::AuthChallengeInfo* auth_info) OVERRIDE; diff --git a/content/browser/service_worker/service_worker_write_to_cache_job.cc b/content/browser/service_worker/service_worker_write_to_cache_job.cc index 2f376c4..77c2c2d 100644 --- a/content/browser/service_worker/service_worker_write_to_cache_job.cc +++ b/content/browser/service_worker/service_worker_write_to_cache_job.cc @@ -246,7 +246,7 @@ void ServiceWorkerWriteToCacheJob::OnWriteDataComplete(int result) { void ServiceWorkerWriteToCacheJob::OnReceivedRedirect( net::URLRequest* request, - const GURL& new_url, + const net::RedirectInfo& redirect_info, bool* defer_redirect) { DCHECK_EQ(net_request_, request); // Script resources can't redirect. diff --git a/content/browser/service_worker/service_worker_write_to_cache_job.h b/content/browser/service_worker/service_worker_write_to_cache_job.h index c11f84e..7506c6c 100644 --- a/content/browser/service_worker/service_worker_write_to_cache_job.h +++ b/content/browser/service_worker/service_worker_write_to_cache_job.h @@ -83,7 +83,7 @@ class CONTENT_EXPORT ServiceWorkerWriteToCacheJob // net::URLRequest::Delegate overrides that observe the net request. virtual void OnReceivedRedirect( net::URLRequest* request, - const GURL& new_url, + const net::RedirectInfo& redirect_info, bool* defer_redirect) OVERRIDE; virtual void OnAuthRequired( net::URLRequest* request, diff --git a/content/child/npapi/plugin_url_fetcher.cc b/content/child/npapi/plugin_url_fetcher.cc index 48c685e..d339033 100644 --- a/content/child/npapi/plugin_url_fetcher.cc +++ b/content/child/npapi/plugin_url_fetcher.cc @@ -23,7 +23,7 @@ #include "net/base/load_flags.h" #include "net/base/net_errors.h" #include "net/http/http_response_headers.h" -#include "net/url_request/url_request.h" +#include "net/url_request/redirect_info.h" #include "third_party/WebKit/public/platform/WebURLLoaderClient.h" #include "third_party/WebKit/public/platform/WebURLResponse.h" #include "webkit/child/resource_loader_bridge.h" @@ -95,7 +95,6 @@ PluginURLFetcher::PluginURLFetcher(PluginStreamUrl* plugin_stream, : plugin_stream_(plugin_stream), url_(url), first_party_for_cookies_(first_party_for_cookies), - method_(method), referrer_(referrer), notify_redirects_(notify_redirects), is_plugin_src_load_(is_plugin_src_load), @@ -191,8 +190,7 @@ void PluginURLFetcher::OnUploadProgress(uint64 position, uint64 size) { } bool PluginURLFetcher::OnReceivedRedirect( - const GURL& new_url, - const GURL& new_first_party_for_cookies, + const net::RedirectInfo& redirect_info, const ResourceResponseInfo& info) { if (!plugin_stream_) return false; @@ -206,42 +204,28 @@ bool PluginURLFetcher::OnReceivedRedirect( // initiated by plug-ins. if (is_plugin_src_load_ && !plugin_stream_->instance()->webplugin()->CheckIfRunInsecureContent( - new_url)) { + redirect_info.new_url)) { plugin_stream_->DidFail(resource_id_); // That will delete |this|. return false; } - // It's unfortunate that this logic of when a redirect's method changes is - // in url_request.cc, but weburlloader_impl.cc and this file have to duplicate - // it instead of passing that information. - int response_code; - if (info.headers) { - response_code = info.headers->response_code(); - } else { - // A redirect may have NULL headers if it came from URLRequestRedirectJob. - // - // TODO(davidben): Get the actual response code from the browser. Either - // fake enough of headers to have a response code or pass it down as part of - // https://crbug.com/384609. - response_code = 307; - } - method_ = net::URLRequest::ComputeMethodForRedirect(method_, response_code); GURL old_url = url_; - url_ = new_url; - first_party_for_cookies_ = new_first_party_for_cookies; + url_ = redirect_info.new_url; + first_party_for_cookies_ = redirect_info.new_first_party_for_cookies; // If the plugin does not participate in url redirect notifications then just // block cross origin 307 POST redirects. if (!notify_redirects_) { - if (response_code == 307 && method_ == "POST" && - old_url.GetOrigin() != new_url.GetOrigin()) { + if (redirect_info.status_code == 307 && + redirect_info.new_method == "POST" && + old_url.GetOrigin() != url_.GetOrigin()) { plugin_stream_->DidFail(resource_id_); // That will delete |this|. return false; } } else { // Pause the request while we ask the plugin what to do about the redirect. bridge_->SetDefersLoading(true); - plugin_stream_->WillSendRequest(url_, response_code); + plugin_stream_->WillSendRequest(url_, redirect_info.status_code); } return true; diff --git a/content/child/npapi/plugin_url_fetcher.h b/content/child/npapi/plugin_url_fetcher.h index b1d7716..8dc53f2 100644 --- a/content/child/npapi/plugin_url_fetcher.h +++ b/content/child/npapi/plugin_url_fetcher.h @@ -56,8 +56,7 @@ class PluginURLFetcher : public RequestPeer { private: // RequestPeer implementation: virtual void OnUploadProgress(uint64 position, uint64 size) OVERRIDE; - virtual bool OnReceivedRedirect(const GURL& new_url, - const GURL& new_first_party_for_cookies, + virtual bool OnReceivedRedirect(const net::RedirectInfo& redirect_info, const ResourceResponseInfo& info) OVERRIDE; virtual void OnReceivedResponse(const ResourceResponseInfo& info) OVERRIDE; virtual void OnDownloadedData(int len, int encoded_data_length) OVERRIDE; @@ -76,7 +75,6 @@ class PluginURLFetcher : public RequestPeer { PluginStreamUrl* plugin_stream_; GURL url_; GURL first_party_for_cookies_; - std::string method_; GURL referrer_; bool notify_redirects_; bool is_plugin_src_load_; diff --git a/content/child/resource_dispatcher.cc b/content/child/resource_dispatcher.cc index 3ca9668..c8fe61a 100644 --- a/content/child/resource_dispatcher.cc +++ b/content/child/resource_dispatcher.cc @@ -499,8 +499,7 @@ void ResourceDispatcher::OnDownloadedData(int request_id, void ResourceDispatcher::OnReceivedRedirect( int request_id, - const GURL& new_url, - const GURL& new_first_party_for_cookies, + const net::RedirectInfo& redirect_info, const ResourceResponseHead& response_head) { TRACE_EVENT0("loader", "ResourceDispatcher::OnReceivedRedirect"); PendingRequestInfo* request_info = GetPendingRequestInfo(request_id); @@ -510,8 +509,8 @@ void ResourceDispatcher::OnReceivedRedirect( ResourceResponseInfo renderer_response_info; ToResourceResponseInfo(*request_info, response_head, &renderer_response_info); - if (request_info->peer->OnReceivedRedirect( - new_url, new_first_party_for_cookies, renderer_response_info)) { + if (request_info->peer->OnReceivedRedirect(redirect_info, + renderer_response_info)) { // Double-check if the request is still around. The call above could // potentially remove it. request_info = GetPendingRequestInfo(request_id); @@ -519,7 +518,7 @@ void ResourceDispatcher::OnReceivedRedirect( return; // We update the response_url here so that we can send it to // SiteIsolationPolicy later when OnReceivedResponse is called. - request_info->response_url = new_url; + request_info->response_url = redirect_info.new_url; request_info->pending_redirect_message.reset( new ResourceHostMsg_FollowRedirect(request_id)); if (!request_info->is_deferred) { diff --git a/content/child/resource_dispatcher.h b/content/child/resource_dispatcher.h index 5fa68e9..ad1c79d 100644 --- a/content/child/resource_dispatcher.h +++ b/content/child/resource_dispatcher.h @@ -28,6 +28,10 @@ namespace blink { class WebThreadedDataReceiver; } +namespace net { +struct RedirectInfo; +} + namespace webkit_glue { class ResourceLoaderBridge; } @@ -156,8 +160,7 @@ class CONTENT_EXPORT ResourceDispatcher : public IPC::Listener { void OnReceivedResponse(int request_id, const ResourceResponseHead&); void OnReceivedCachedMetadata(int request_id, const std::vector<char>& data); void OnReceivedRedirect(int request_id, - const GURL& new_url, - const GURL& new_first_party_for_cookies, + const net::RedirectInfo& redirect_info, const ResourceResponseHead& response_head); void OnSetDataBuffer(int request_id, base::SharedMemoryHandle shm_handle, diff --git a/content/child/resource_dispatcher_unittest.cc b/content/child/resource_dispatcher_unittest.cc index 4e95428..d878e37 100644 --- a/content/child/resource_dispatcher_unittest.cc +++ b/content/child/resource_dispatcher_unittest.cc @@ -59,8 +59,7 @@ class TestRequestPeer : public RequestPeer { virtual void OnUploadProgress(uint64 position, uint64 size) OVERRIDE { } - virtual bool OnReceivedRedirect(const GURL& new_url, - const GURL& new_first_party_for_cookies, + virtual bool OnReceivedRedirect(const net::RedirectInfo& redirect_info, const ResourceResponseInfo& info) OVERRIDE { ++seen_redirects_; if (defer_on_redirect_) @@ -252,9 +251,13 @@ class ResourceDispatcherTest : public testing::Test, public IPC::Sender { std::replace(raw_headers.begin(), raw_headers.end(), '\n', '\0'); head.headers = new net::HttpResponseHeaders(raw_headers); head.error_code = net::OK; + net::RedirectInfo redirect_info; + redirect_info.status_code = 302; + redirect_info.new_method = "GET"; + redirect_info.new_url = GURL(kTestPageUrl); + redirect_info.new_first_party_for_cookies = GURL(kTestPageUrl); EXPECT_EQ(true, dispatcher_.OnMessageReceived( - ResourceMsg_ReceivedRedirect(request_id, GURL(kTestPageUrl), - GURL(kTestPageUrl), head))); + ResourceMsg_ReceivedRedirect(request_id, redirect_info, head))); } void NotifyReceivedResponse(int request_id) { @@ -722,8 +725,7 @@ class TimeConversionTest : public ResourceDispatcherTest, virtual void OnUploadProgress(uint64 position, uint64 size) OVERRIDE { } - virtual bool OnReceivedRedirect(const GURL& new_url, - const GURL& new_first_party_for_cookies, + virtual bool OnReceivedRedirect(const net::RedirectInfo& redirect_info, const ResourceResponseInfo& info) OVERRIDE { return true; } diff --git a/content/child/web_url_loader_impl.cc b/content/child/web_url_loader_impl.cc index 5aba97c..ba560b6 100644 --- a/content/child/web_url_loader_impl.cc +++ b/content/child/web_url_loader_impl.cc @@ -29,7 +29,7 @@ #include "net/base/net_errors.h" #include "net/http/http_response_headers.h" #include "net/http/http_util.h" -#include "net/url_request/url_request.h" +#include "net/url_request/redirect_info.h" #include "third_party/WebKit/public/platform/WebHTTPHeaderVisitor.h" #include "third_party/WebKit/public/platform/WebHTTPLoadInfo.h" #include "third_party/WebKit/public/platform/WebURL.h" @@ -223,8 +223,7 @@ class WebURLLoaderImpl::Context : public base::RefCounted<Context>, // RequestPeer methods: virtual void OnUploadProgress(uint64 position, uint64 size) OVERRIDE; - virtual bool OnReceivedRedirect(const GURL& new_url, - const GURL& new_first_party_for_cookies, + virtual bool OnReceivedRedirect(const net::RedirectInfo& redirect_info, const ResourceResponseInfo& info) OVERRIDE; virtual void OnReceivedResponse(const ResourceResponseInfo& info) OVERRIDE; virtual void OnDownloadedData(int len, int encoded_data_length) OVERRIDE; @@ -470,8 +469,7 @@ void WebURLLoaderImpl::Context::OnUploadProgress(uint64 position, uint64 size) { } bool WebURLLoaderImpl::Context::OnReceivedRedirect( - const GURL& new_url, - const GURL& new_first_party_for_cookies, + const net::RedirectInfo& redirect_info, const ResourceResponseInfo& info) { if (!client_) return false; @@ -482,23 +480,17 @@ bool WebURLLoaderImpl::Context::OnReceivedRedirect( // TODO(darin): We lack sufficient information to construct the actual // request that resulted from the redirect. - WebURLRequest new_request(new_url); - new_request.setFirstPartyForCookies(new_first_party_for_cookies); + WebURLRequest new_request(redirect_info.new_url); + new_request.setFirstPartyForCookies( + redirect_info.new_first_party_for_cookies); new_request.setDownloadToFile(request_.downloadToFile()); - WebString referrer_string = WebString::fromUTF8("Referer"); - WebString referrer = WebSecurityPolicy::generateReferrerHeader( - referrer_policy_, - new_url, - request_.httpHeaderField(referrer_string)); - if (!referrer.isEmpty()) - new_request.setHTTPReferrer(referrer, referrer_policy_); - - std::string method = request_.httpMethod().utf8(); - std::string new_method = net::URLRequest::ComputeMethodForRedirect( - method, response.httpStatusCode()); - new_request.setHTTPMethod(WebString::fromUTF8(new_method)); - if (new_method == method) + new_request.setHTTPReferrer(WebString::fromUTF8(redirect_info.new_referrer), + referrer_policy_); + + std::string old_method = request_.httpMethod().utf8(); + new_request.setHTTPMethod(WebString::fromUTF8(redirect_info.new_method)); + if (redirect_info.new_method == old_method) new_request.setHTTPBody(request_.httpBody()); // Protect from deletion during call to willSendRequest. @@ -508,11 +500,11 @@ bool WebURLLoaderImpl::Context::OnReceivedRedirect( request_ = new_request; // Only follow the redirect if WebKit left the URL unmodified. - if (new_url == GURL(new_request.url())) { + if (redirect_info.new_url == GURL(new_request.url())) { // First-party cookie logic moved from DocumentLoader in Blink to - // CrossSiteResourceHandler in the browser. Assert that Blink didn't try to - // change it to something else. - DCHECK_EQ(new_first_party_for_cookies.spec(), + // net::URLRequest in the browser. Assert that Blink didn't try to change it + // to something else. + DCHECK_EQ(redirect_info.new_first_party_for_cookies.spec(), request_.firstPartyForCookies().string().utf8()); return true; } diff --git a/content/child/web_url_loader_impl_unittest.cc b/content/child/web_url_loader_impl_unittest.cc index 81b6779..0adfe08 100644 --- a/content/child/web_url_loader_impl_unittest.cc +++ b/content/child/web_url_loader_impl_unittest.cc @@ -15,6 +15,7 @@ #include "net/base/net_errors.h" #include "net/http/http_response_headers.h" #include "net/http/http_util.h" +#include "net/url_request/redirect_info.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/WebKit/public/platform/WebString.h" #include "third_party/WebKit/public/platform/WebURLError.h" @@ -281,7 +282,12 @@ class WebURLLoaderImplTest : public testing::Test { void DoReceiveRedirect() { EXPECT_FALSE(client()->did_receive_redirect()); - peer()->OnReceivedRedirect(GURL(kTestURL), GURL(kTestURL), + net::RedirectInfo redirect_info; + redirect_info.status_code = 302; + redirect_info.new_method = "GET"; + redirect_info.new_url = GURL(kTestURL); + redirect_info.new_first_party_for_cookies = GURL(kTestURL); + peer()->OnReceivedRedirect(redirect_info, content::ResourceResponseInfo()); EXPECT_TRUE(client()->did_receive_redirect()); } diff --git a/content/common/resource_messages.h b/content/common/resource_messages.h index d4a7d97..dc6147a 100644 --- a/content/common/resource_messages.h +++ b/content/common/resource_messages.h @@ -16,6 +16,7 @@ #include "ipc/ipc_message_macros.h" #include "net/base/request_priority.h" #include "net/http/http_response_info.h" +#include "net/url_request/redirect_info.h" #ifndef CONTENT_COMMON_RESOURCE_MESSAGES_H_ #define CONTENT_COMMON_RESOURCE_MESSAGES_H_ @@ -121,6 +122,14 @@ IPC_STRUCT_TRAITS_BEGIN(content::ResourceResponseInfo) IPC_STRUCT_TRAITS_MEMBER(original_url_via_service_worker) IPC_STRUCT_TRAITS_END() +IPC_STRUCT_TRAITS_BEGIN(net::RedirectInfo) + IPC_STRUCT_TRAITS_MEMBER(status_code) + IPC_STRUCT_TRAITS_MEMBER(new_method) + IPC_STRUCT_TRAITS_MEMBER(new_url) + IPC_STRUCT_TRAITS_MEMBER(new_first_party_for_cookies) + IPC_STRUCT_TRAITS_MEMBER(new_referrer) +IPC_STRUCT_TRAITS_END() + // Parameters for a resource request. IPC_STRUCT_BEGIN(ResourceHostMsg_Request) // The request method: GET, POST, etc. @@ -260,10 +269,9 @@ IPC_MESSAGE_CONTROL3(ResourceMsg_UploadProgress, // Sent when the request has been redirected. The receiver is expected to // respond with either a FollowRedirect message (if the redirect is to be // followed) or a CancelRequest message (if it should not be followed). -IPC_MESSAGE_CONTROL4(ResourceMsg_ReceivedRedirect, +IPC_MESSAGE_CONTROL3(ResourceMsg_ReceivedRedirect, int /* request_id */, - GURL /* new_url */, - GURL /* new_first_party_for_cookies */, + net::RedirectInfo /* redirect_info */, content::ResourceResponseHead) // Sent to set the shared memory buffer to be used to transmit response data to diff --git a/content/public/child/request_peer.h b/content/public/child/request_peer.h index 93143c5..ebce5f8 100644 --- a/content/public/child/request_peer.h +++ b/content/public/child/request_peer.h @@ -16,6 +16,10 @@ namespace base { class TimeTicks; } +namespace net { +struct RedirectInfo; +} + namespace content { struct ResourceResponseInfo; @@ -34,12 +38,10 @@ class CONTENT_EXPORT RequestPeer { virtual void OnUploadProgress(uint64 position, uint64 size) = 0; // Called when a redirect occurs. The implementation may return false to - // suppress the redirect. The given ResponseInfo provides complete - // information about the redirect, and new_url is the URL that will be loaded - // if this method returns true. new_first_party_for_cookies is the new - // first-party URL for cookies should that have changed. - virtual bool OnReceivedRedirect(const GURL& new_url, - const GURL& new_first_party_for_cookies, + // suppress the redirect. The ResourceResponseInfo provides information about + // the redirect response and the RedirectInfo includes information about the + // request to be made if the method returns true. + virtual bool OnReceivedRedirect(const net::RedirectInfo& redirect_info, const ResourceResponseInfo& info) = 0; // Called when response headers are available (after all redirects have diff --git a/mojo/services/network/url_loader_impl.cc b/mojo/services/network/url_loader_impl.cc index 7e53c40..52f6148 100644 --- a/mojo/services/network/url_loader_impl.cc +++ b/mojo/services/network/url_loader_impl.cc @@ -13,6 +13,7 @@ #include "net/base/upload_bytes_element_reader.h" #include "net/base/upload_data_stream.h" #include "net/http/http_response_headers.h" +#include "net/url_request/redirect_info.h" namespace mojo { namespace { @@ -240,7 +241,7 @@ void URLLoaderImpl::QueryStatus( } void URLLoaderImpl::OnReceivedRedirect(net::URLRequest* url_request, - const GURL& new_url, + const net::RedirectInfo& redirect_info, bool* defer_redirect) { DCHECK(url_request == url_request_.get()); DCHECK(url_request->status().is_success()); @@ -253,10 +254,8 @@ void URLLoaderImpl::OnReceivedRedirect(net::URLRequest* url_request, *defer_redirect = true; URLResponsePtr response = MakeURLResponse(url_request); - response->redirect_method = - net::URLRequest::ComputeMethodForRedirect(url_request->method(), - response->status_code); - response->redirect_url = String::From(new_url); + response->redirect_method = redirect_info.new_method; + response->redirect_url = String::From(redirect_info.new_url); SendResponse(response.Pass()); } diff --git a/mojo/services/network/url_loader_impl.h b/mojo/services/network/url_loader_impl.h index 6785501..5c5af8a 100644 --- a/mojo/services/network/url_loader_impl.h +++ b/mojo/services/network/url_loader_impl.h @@ -38,7 +38,7 @@ class URLLoaderImpl : public InterfaceImpl<URLLoader>, // net::URLRequest::Delegate methods: virtual void OnReceivedRedirect(net::URLRequest* url_request, - const GURL& new_url, + const net::RedirectInfo& redirect_info, bool* defer_redirect) OVERRIDE; virtual void OnResponseStarted(net::URLRequest* url_request) OVERRIDE; virtual void OnReadCompleted(net::URLRequest* url_request, int bytes_read) diff --git a/net/net.gypi b/net/net.gypi index 7f59da9..3bd3efc 100644 --- a/net/net.gypi +++ b/net/net.gypi @@ -1122,6 +1122,8 @@ 'url_request/ftp_protocol_handler.cc', 'url_request/ftp_protocol_handler.h', 'url_request/http_user_agent_settings.h', + 'url_request/redirect_info.cc', + 'url_request/redirect_info.h', 'url_request/static_http_user_agent_settings.cc', 'url_request/static_http_user_agent_settings.h', 'url_request/url_fetcher.cc', diff --git a/net/ocsp/nss_ocsp.cc b/net/ocsp/nss_ocsp.cc index 33d1933..7c71948 100644 --- a/net/ocsp/nss_ocsp.cc +++ b/net/ocsp/nss_ocsp.cc @@ -37,6 +37,7 @@ #include "net/base/upload_data_stream.h" #include "net/http/http_request_headers.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_context.h" #include "url/gurl.h" @@ -283,12 +284,12 @@ class OCSPRequestSession } virtual void OnReceivedRedirect(URLRequest* request, - const GURL& new_url, + const RedirectInfo& redirect_info, bool* defer_redirect) OVERRIDE { DCHECK_EQ(request, request_); DCHECK_EQ(base::MessageLoopForIO::current(), io_loop_); - if (!new_url.SchemeIs("http")) { + if (!redirect_info.new_url.SchemeIs("http")) { // Prevent redirects to non-HTTP schemes, including HTTPS. This matches // the initial check in OCSPServerSession::CreateRequest(). CancelURLRequest(); diff --git a/net/url_request/redirect_info.cc b/net/url_request/redirect_info.cc new file mode 100644 index 0000000..16b517a --- /dev/null +++ b/net/url_request/redirect_info.cc @@ -0,0 +1,13 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/url_request/redirect_info.h" + +namespace net { + +RedirectInfo::RedirectInfo() : status_code(-1) {} + +RedirectInfo::~RedirectInfo() {} + +} // namespace net diff --git a/net/url_request/redirect_info.h b/net/url_request/redirect_info.h new file mode 100644 index 0000000..b1ae636 --- /dev/null +++ b/net/url_request/redirect_info.h @@ -0,0 +1,43 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_URL_REQUEST_REDIRECT_INFO_H_ +#define NET_URL_REQUEST_REDIRECT_INFO_H_ + +#include <string> + +#include "net/base/net_export.h" +#include "url/gurl.h" + +namespace net { + +// RedirectInfo captures information about a redirect and any fields in a +// request that change. This struct must be kept in sync with +// content/common/resource_messages.h. +struct NET_EXPORT RedirectInfo { + RedirectInfo(); + ~RedirectInfo(); + + // The status code for the redirect response. This is almost redundant with + // the response headers, but some URLRequestJobs emit redirects without + // headers. + int status_code; + + // The new request method. Depending on the response code, the request method + // may change. + std::string new_method; + + // The new request URL. + GURL new_url; + + // The new first-party URL for cookies. + GURL new_first_party_for_cookies; + + // The new HTTP referrer header. + std::string new_referrer; +}; + +} // namespace net + +#endif // NET_URL_REQUEST_REDIRECT_INFO_H_ diff --git a/net/url_request/url_fetcher_core.cc b/net/url_request/url_fetcher_core.cc index eb45ecf..e8da0e1 100644 --- a/net/url_request/url_fetcher_core.cc +++ b/net/url_request/url_fetcher_core.cc @@ -20,6 +20,7 @@ #include "net/base/upload_data_stream.h" #include "net/base/upload_file_element_reader.h" #include "net/http/http_response_headers.h" +#include "net/url_request/redirect_info.h" #include "net/url_request/url_fetcher_delegate.h" #include "net/url_request/url_fetcher_response_writer.h" #include "net/url_request/url_request_context.h" @@ -371,13 +372,13 @@ bool URLFetcherCore::GetResponseAsFilePath(bool take_ownership, } void URLFetcherCore::OnReceivedRedirect(URLRequest* request, - const GURL& new_url, + const RedirectInfo& redirect_info, bool* defer_redirect) { DCHECK_EQ(request, request_.get()); DCHECK(network_task_runner_->BelongsToCurrentThread()); if (stop_on_redirect_) { stopped_on_redirect_ = true; - url_ = new_url; + url_ = redirect_info.new_url; response_code_ = request_->GetResponseCode(); was_fetched_via_proxy_ = request_->was_fetched_via_proxy(); request->Cancel(); diff --git a/net/url_request/url_fetcher_core.h b/net/url_request/url_fetcher_core.h index abf42b5..bddeaf4 100644 --- a/net/url_request/url_fetcher_core.h +++ b/net/url_request/url_fetcher_core.h @@ -123,7 +123,7 @@ class URLFetcherCore // Overridden from URLRequest::Delegate: virtual void OnReceivedRedirect(URLRequest* request, - const GURL& new_url, + const RedirectInfo& redirect_info, bool* defer_redirect) OVERRIDE; virtual void OnResponseStarted(URLRequest* request) OVERRIDE; virtual void OnReadCompleted(URLRequest* request, diff --git a/net/url_request/url_request.cc b/net/url_request/url_request.cc index 5466be1..6b33aaa 100644 --- a/net/url_request/url_request.cc +++ b/net/url_request/url_request.cc @@ -30,6 +30,7 @@ #include "net/http/http_response_headers.h" #include "net/http/http_util.h" #include "net/ssl/ssl_cert_request_info.h" +#include "net/url_request/redirect_info.h" #include "net/url_request/url_request_context.h" #include "net/url_request/url_request_error_job.h" #include "net/url_request/url_request_job.h" @@ -169,7 +170,7 @@ URLRequestJob* URLRequest::Interceptor::MaybeInterceptResponse( // URLRequest::Delegate void URLRequest::Delegate::OnReceivedRedirect(URLRequest* request, - const GURL& new_url, + const RedirectInfo& redirect_info, bool* defer_redirect) { } @@ -259,6 +260,7 @@ void URLRequest::Init(const GURL& url, url_chain_.push_back(url); method_ = "GET"; referrer_policy_ = CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE; + first_party_url_policy_ = NEVER_CHANGE_FIRST_PARTY_URL; load_flags_ = LOAD_NORMAL; delegate_ = delegate; is_pending_ = false; @@ -563,9 +565,16 @@ bool URLRequest::IsHandledURL(const GURL& url) { void URLRequest::set_first_party_for_cookies( const GURL& first_party_for_cookies) { + DCHECK(!is_pending_); first_party_for_cookies_ = first_party_for_cookies; } +void URLRequest::set_first_party_url_policy( + FirstPartyURLPolicy first_party_url_policy) { + DCHECK(!is_pending_); + first_party_url_policy_ = first_party_url_policy; +} + void URLRequest::set_method(const std::string& method) { DCHECK(!is_pending_); method_ = method; @@ -822,18 +831,19 @@ void URLRequest::StopCaching() { job_->StopCaching(); } -void URLRequest::NotifyReceivedRedirect(const GURL& location, +void URLRequest::NotifyReceivedRedirect(const RedirectInfo& redirect_info, bool* defer_redirect) { is_redirecting_ = true; + // TODO(davidben): Pass the full RedirectInfo down to MaybeInterceptRedirect? URLRequestJob* job = URLRequestJobManager::GetInstance()->MaybeInterceptRedirect( - this, network_delegate_, location); + this, network_delegate_, redirect_info.new_url); if (job) { RestartWithJob(job); } else if (delegate_) { OnCallToDelegate(); - delegate_->OnReceivedRedirect(this, location, defer_redirect); + delegate_->OnReceivedRedirect(this, redirect_info, defer_redirect); // |this| may be have been destroyed here. } } @@ -956,27 +966,29 @@ void URLRequest::OrphanJob() { job_ = NULL; } -int URLRequest::Redirect(const GURL& location, int http_status_code) { +int URLRequest::Redirect(const RedirectInfo& redirect_info) { // Matches call in NotifyReceivedRedirect. OnCallToDelegateComplete(); if (net_log_.IsLogging()) { net_log_.AddEvent( NetLog::TYPE_URL_REQUEST_REDIRECTED, - NetLog::StringCallback("location", &location.possibly_invalid_spec())); + NetLog::StringCallback("location", + &redirect_info.new_url.possibly_invalid_spec())); } + // TODO(davidben): Pass the full RedirectInfo to the NetworkDelegate. if (network_delegate_) - network_delegate_->NotifyBeforeRedirect(this, location); + network_delegate_->NotifyBeforeRedirect(this, redirect_info.new_url); if (redirect_limit_ <= 0) { DVLOG(1) << "disallowing redirect: exceeds limit"; return ERR_TOO_MANY_REDIRECTS; } - if (!location.is_valid()) + if (!redirect_info.new_url.is_valid()) return ERR_INVALID_URL; - if (!job_->IsSafeRedirect(location)) { + if (!job_->IsSafeRedirect(redirect_info.new_url)) { DVLOG(1) << "disallowing redirect: unsafe protocol"; return ERR_UNSAFE_REDIRECT; } @@ -985,8 +997,8 @@ int URLRequest::Redirect(const GURL& location, int http_status_code) { final_upload_progress_ = job_->GetUploadProgress(); PrepareToRestart(); - std::string new_method(ComputeMethodForRedirect(method_, http_status_code)); - if (new_method != method_) { + if (redirect_info.new_method != method_) { + // TODO(davidben): This logic still needs to be replicated at the consumers. if (method_ == "POST") { // If being switched from POST, must remove headers that were specific to // the POST and don't have meaning in other methods. For example the @@ -996,17 +1008,13 @@ int URLRequest::Redirect(const GURL& location, int http_status_code) { StripPostSpecificHeaders(&extra_request_headers_); } upload_data_stream_.reset(); - method_.swap(new_method); + method_ = redirect_info.new_method; } - // Suppress the referrer if we're redirecting out of https. - if (referrer_policy_ == - CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE && - GURL(referrer_).SchemeIsSecure() && !location.SchemeIsSecure()) { - referrer_.clear(); - } + referrer_ = redirect_info.new_referrer; + first_party_for_cookies_ = redirect_info.new_first_party_for_cookies; - url_chain_.push_back(location); + url_chain_.push_back(redirect_info.new_url); --redirect_limit_; Start(); diff --git a/net/url_request/url_request.h b/net/url_request/url_request.h index 0357c6a..b4f20795 100644 --- a/net/url_request/url_request.h +++ b/net/url_request/url_request.h @@ -51,6 +51,7 @@ class CookieOptions; class HostPortPair; class IOBuffer; struct LoadTimingInfo; +struct RedirectInfo; class SSLCertRequestInfo; class SSLInfo; class UploadDataStream; @@ -108,6 +109,15 @@ class NET_EXPORT URLRequest : NON_EXPORTED_BASE(public base::NonThreadSafe), NEVER_CLEAR_REFERRER, }; + // First-party URL redirect policy: During server redirects, the first-party + // URL for cookies normally doesn't change. However, if the request is a + // top-level first-party request, the first-party URL should be updated to the + // URL on every redirect. + enum FirstPartyURLPolicy { + NEVER_CHANGE_FIRST_PARTY_URL, + UPDATE_FIRST_PARTY_URL_ON_REDIRECT, + }; + // This class handles network interception. Use with // (Un)RegisterRequestInterceptor. class NET_EXPORT Interceptor { @@ -185,10 +195,10 @@ class NET_EXPORT URLRequest : NON_EXPORTED_BASE(public base::NonThreadSafe), // class NET_EXPORT Delegate { public: - // Called upon a server-initiated redirect. The delegate may call the - // request's Cancel method to prevent the redirect from being followed. - // Since there may be multiple chained redirects, there may also be more - // than one redirect call. + // Called upon receiving a redirect. The delegate may call the request's + // Cancel method to prevent the redirect from being followed. Since there + // may be multiple chained redirects, there may also be more than one + // redirect call. // // When this function is called, the request will still contain the // original URL, the destination of the redirect is provided in 'new_url'. @@ -202,7 +212,7 @@ class NET_EXPORT URLRequest : NON_EXPORTED_BASE(public base::NonThreadSafe), // need to set it if they are happy with the default behavior of not // deferring redirect. virtual void OnReceivedRedirect(URLRequest* request, - const GURL& new_url, + const RedirectInfo& redirect_info, bool* defer_redirect); // Called when we receive an authentication failure. The delegate should @@ -324,10 +334,17 @@ class NET_EXPORT URLRequest : NON_EXPORTED_BASE(public base::NonThreadSafe), const GURL& first_party_for_cookies() const { return first_party_for_cookies_; } - // This method may be called before Start() or FollowDeferredRedirect() is - // called. + // This method may only be called before Start(). void set_first_party_for_cookies(const GURL& first_party_for_cookies); + // The first-party URL policy to apply when updating the first party URL + // during redirects. The first-party URL policy may only be changed before + // Start() is called. + FirstPartyURLPolicy first_party_url_policy() const { + return first_party_url_policy_; + } + void set_first_party_url_policy(FirstPartyURLPolicy first_party_url_policy); + // The request method, as an uppercase string. "GET" is the default value. // The request method may only be changed before Start() is called and // should only be assigned an uppercase value. @@ -350,6 +367,7 @@ class NET_EXPORT URLRequest : NON_EXPORTED_BASE(public base::NonThreadSafe), // The referrer policy to apply when updating the referrer during redirects. // The referrer policy may only be changed before Start() is called. + ReferrerPolicy referrer_policy() const { return referrer_policy_; } void set_referrer_policy(ReferrerPolicy referrer_policy); // Sets the delegate of the request. This value may be changed at any time, @@ -682,10 +700,11 @@ class NET_EXPORT URLRequest : NON_EXPORTED_BASE(public base::NonThreadSafe), // Allow the URLRequestJob to redirect this request. Returns OK if // successful, otherwise an error code is returned. - int Redirect(const GURL& location, int http_status_code); + int Redirect(const RedirectInfo& redirect_info); // Called by URLRequestJob to allow interception when a redirect occurs. - void NotifyReceivedRedirect(const GURL& location, bool* defer_redirect); + void NotifyReceivedRedirect(const RedirectInfo& redirect_info, + bool* defer_redirect); // Called by URLRequestHttpJob (note, only HTTP(S) jobs will call this) to // allow deferral of network initialization. @@ -788,6 +807,7 @@ class NET_EXPORT URLRequest : NON_EXPORTED_BASE(public base::NonThreadSafe), std::string method_; // "GET", "POST", etc. Should be all uppercase. std::string referrer_; ReferrerPolicy referrer_policy_; + FirstPartyURLPolicy first_party_url_policy_; HttpRequestHeaders extra_request_headers_; int load_flags_; // Flags indicating the request type for the load; // expected values are LOAD_* enums above. diff --git a/net/url_request/url_request_job.cc b/net/url_request/url_request_job.cc index a66a3f5..239f06c 100644 --- a/net/url_request/url_request_job.cc +++ b/net/url_request/url_request_job.cc @@ -33,7 +33,6 @@ URLRequestJob::URLRequestJob(URLRequest* request, filtered_read_buffer_len_(0), has_handled_response_(false), expected_content_size_(-1), - deferred_redirect_status_code_(-1), network_delegate_(network_delegate), weak_factory_(this) { base::PowerMonitor* power_monitor = base::PowerMonitor::Get(); @@ -203,22 +202,18 @@ void URLRequestJob::ContinueDespiteLastError() { } void URLRequestJob::FollowDeferredRedirect() { - DCHECK(deferred_redirect_status_code_ != -1); + DCHECK_NE(-1, deferred_redirect_info_.status_code); - // NOTE: deferred_redirect_url_ may be invalid, and attempting to redirect to - // such an URL will fail inside FollowRedirect. The DCHECK above asserts - // that we called OnReceivedRedirect. + // NOTE: deferred_redirect_info_ may be invalid, and attempting to follow it + // will fail inside FollowRedirect. The DCHECK above asserts that we called + // OnReceivedRedirect. // It is also possible that FollowRedirect will drop the last reference to // this job, so we need to reset our members before calling it. - GURL redirect_url = deferred_redirect_url_; - int redirect_status_code = deferred_redirect_status_code_; - - deferred_redirect_url_ = GURL(); - deferred_redirect_status_code_ = -1; - - FollowRedirect(redirect_url, redirect_status_code); + RedirectInfo redirect_info = deferred_redirect_info_; + deferred_redirect_info_ = RedirectInfo(); + FollowRedirect(redirect_info); } void URLRequestJob::ResumeNetworkStart() { @@ -335,22 +330,11 @@ void URLRequestJob::NotifyHeadersComplete() { // so it does not treat being stopped as an error. DoneReadingRedirectResponse(); - const GURL& url = request_->url(); - - // Move the reference fragment of the old location to the new one if the - // new one has none. This duplicates mozilla's behavior. - if (url.is_valid() && url.has_ref() && !new_location.has_ref() && - CopyFragmentOnRedirect(new_location)) { - GURL::Replacements replacements; - // Reference the |ref| directly out of the original URL to avoid a - // malloc. - replacements.SetRef(url.spec().data(), - url.parsed_for_possibly_invalid_spec().ref); - new_location = new_location.ReplaceComponents(replacements); - } + RedirectInfo redirect_info = + ComputeRedirectInfo(new_location, http_status_code); bool defer_redirect = false; - request_->NotifyReceivedRedirect(new_location, &defer_redirect); + request_->NotifyReceivedRedirect(redirect_info, &defer_redirect); // Ensure that the request wasn't detached or destroyed in // NotifyReceivedRedirect @@ -360,10 +344,9 @@ void URLRequestJob::NotifyHeadersComplete() { // If we were not cancelled, then maybe follow the redirect. if (request_->status().is_success()) { if (defer_redirect) { - deferred_redirect_url_ = new_location; - deferred_redirect_status_code_ = http_status_code; + deferred_redirect_info_ = redirect_info; } else { - FollowRedirect(new_location, http_status_code); + FollowRedirect(redirect_info); } return; } @@ -726,8 +709,8 @@ bool URLRequestJob::ReadRawDataHelper(IOBuffer* buf, int buf_size, return rv; } -void URLRequestJob::FollowRedirect(const GURL& location, int http_status_code) { - int rv = request_->Redirect(location, http_status_code); +void URLRequestJob::FollowRedirect(const RedirectInfo& redirect_info) { + int rv = request_->Redirect(redirect_info); if (rv != OK) NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, rv)); } @@ -770,4 +753,52 @@ bool URLRequestJob::FilterHasData() { void URLRequestJob::UpdatePacketReadTimes() { } +RedirectInfo URLRequestJob::ComputeRedirectInfo(const GURL& location, + int http_status_code) { + const GURL& url = request_->url(); + + RedirectInfo redirect_info; + + redirect_info.status_code = http_status_code; + + // The request method may change, depending on the status code. + redirect_info.new_method = URLRequest::ComputeMethodForRedirect( + request_->method(), http_status_code); + + // Move the reference fragment of the old location to the new one if the + // new one has none. This duplicates mozilla's behavior. + if (url.is_valid() && url.has_ref() && !location.has_ref() && + CopyFragmentOnRedirect(location)) { + GURL::Replacements replacements; + // Reference the |ref| directly out of the original URL to avoid a + // malloc. + replacements.SetRef(url.spec().data(), + url.parsed_for_possibly_invalid_spec().ref); + redirect_info.new_url = location.ReplaceComponents(replacements); + } else { + redirect_info.new_url = location; + } + + // Update the first-party URL if appropriate. + if (request_->first_party_url_policy() == + URLRequest::UPDATE_FIRST_PARTY_URL_ON_REDIRECT) { + redirect_info.new_first_party_for_cookies = redirect_info.new_url; + } else { + redirect_info.new_first_party_for_cookies = + request_->first_party_for_cookies(); + } + + // Suppress the referrer if we're redirecting out of https. + if (request_->referrer_policy() == + URLRequest::CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE && + GURL(request_->referrer()).SchemeIsSecure() && + !redirect_info.new_url.SchemeIsSecure()) { + redirect_info.new_referrer.clear(); + } else { + redirect_info.new_referrer = request_->referrer(); + } + + return redirect_info; +} + } // namespace net diff --git a/net/url_request/url_request_job.h b/net/url_request/url_request_job.h index 2942e79..2dcd67a 100644 --- a/net/url_request/url_request_job.h +++ b/net/url_request/url_request_job.h @@ -19,6 +19,7 @@ #include "net/base/request_priority.h" #include "net/base/upload_progress.h" #include "net/cookies/canonical_cookie.h" +#include "net/url_request/redirect_info.h" #include "url/gurl.h" namespace net { @@ -364,7 +365,7 @@ class NET_EXPORT URLRequestJob // Called in response to a redirect that was not canceled to follow the // redirect. The current job will be replaced with a new job loading the // given redirect destination. - void FollowRedirect(const GURL& location, int http_status_code); + void FollowRedirect(const RedirectInfo& redirect_info); // Called after every raw read. If |bytes_read| is > 0, this indicates // a successful read of |bytes_read| unfiltered bytes. If |bytes_read| @@ -384,6 +385,10 @@ class NET_EXPORT URLRequestJob // The default implementation does nothing. virtual void UpdatePacketReadTimes(); + // Computes a new RedirectInfo based on receiving a redirect response of + // |location| and |http_status_code|. + RedirectInfo ComputeRedirectInfo(const GURL& location, int http_status_code); + // Indicates that the job is done producing data, either it has completed // all the data or an error has been encountered. Set exclusively by // NotifyDone so that it is kept in sync with the request. @@ -419,8 +424,7 @@ class NET_EXPORT URLRequestJob int64 expected_content_size_; // Set when a redirect is deferred. - GURL deferred_redirect_url_; - int deferred_redirect_status_code_; + RedirectInfo deferred_redirect_info_; // The network delegate to use with this request, if any. NetworkDelegate* network_delegate_; diff --git a/net/url_request/url_request_test_util.cc b/net/url_request/url_request_test_util.cc index 03c189b..3800fec 100644 --- a/net/url_request/url_request_test_util.cc +++ b/net/url_request/url_request_test_util.cc @@ -195,7 +195,7 @@ void TestDelegate::ClearFullRequestHeaders() { } void TestDelegate::OnReceivedRedirect(URLRequest* request, - const GURL& new_url, + const RedirectInfo& redirect_info, bool* defer_redirect) { EXPECT_TRUE(request->is_redirecting()); @@ -366,7 +366,7 @@ void TestNetworkDelegate::InitRequestStatesIfNew(int request_id) { int TestNetworkDelegate::OnBeforeURLRequest( URLRequest* request, const CompletionCallback& callback, - GURL* new_url ) { + GURL* new_url) { int req_id = request->identifier(); InitRequestStatesIfNew(req_id); event_order_[req_id] += "OnBeforeURLRequest\n"; diff --git a/net/url_request/url_request_test_util.h b/net/url_request/url_request_test_util.h index 28613ce..3e3a114 100644 --- a/net/url_request/url_request_test_util.h +++ b/net/url_request/url_request_test_util.h @@ -175,7 +175,8 @@ class TestDelegate : public URLRequest::Delegate { void ClearFullRequestHeaders(); // URLRequest::Delegate: - virtual void OnReceivedRedirect(URLRequest* request, const GURL& new_url, + virtual void OnReceivedRedirect(URLRequest* request, + const RedirectInfo& redirect_info, bool* defer_redirect) OVERRIDE; virtual void OnBeforeNetworkStart(URLRequest* request, bool* defer) OVERRIDE; virtual void OnAuthRequired(URLRequest* request, diff --git a/net/url_request/url_request_unittest.cc b/net/url_request/url_request_unittest.cc index a66924e..2a1de2c 100644 --- a/net/url_request/url_request_unittest.cc +++ b/net/url_request/url_request_unittest.cc @@ -104,10 +104,10 @@ const base::string16 kUser(ASCIIToUTF16("user")); // Tests load timing information in the case a fresh connection was used, with // no proxy. -void TestLoadTimingNotReused(const net::LoadTimingInfo& load_timing_info, +void TestLoadTimingNotReused(const LoadTimingInfo& load_timing_info, int connect_timing_flags) { EXPECT_FALSE(load_timing_info.socket_reused); - EXPECT_NE(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id); + EXPECT_NE(NetLog::Source::kInvalidId, load_timing_info.socket_log_id); EXPECT_FALSE(load_timing_info.request_start_time.is_null()); EXPECT_FALSE(load_timing_info.request_start.is_null()); @@ -127,10 +127,10 @@ void TestLoadTimingNotReused(const net::LoadTimingInfo& load_timing_info, // Same as above, but with proxy times. void TestLoadTimingNotReusedWithProxy( - const net::LoadTimingInfo& load_timing_info, + const LoadTimingInfo& load_timing_info, int connect_timing_flags) { EXPECT_FALSE(load_timing_info.socket_reused); - EXPECT_NE(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id); + EXPECT_NE(NetLog::Source::kInvalidId, load_timing_info.socket_log_id); EXPECT_FALSE(load_timing_info.request_start_time.is_null()); EXPECT_FALSE(load_timing_info.request_start.is_null()); @@ -151,9 +151,9 @@ void TestLoadTimingNotReusedWithProxy( // Same as above, but with a reused socket and proxy times. void TestLoadTimingReusedWithProxy( - const net::LoadTimingInfo& load_timing_info) { + const LoadTimingInfo& load_timing_info) { EXPECT_TRUE(load_timing_info.socket_reused); - EXPECT_NE(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id); + EXPECT_NE(NetLog::Source::kInvalidId, load_timing_info.socket_log_id); EXPECT_FALSE(load_timing_info.request_start_time.is_null()); EXPECT_FALSE(load_timing_info.request_start.is_null()); @@ -193,9 +193,9 @@ void FillBuffer(char* buffer, size_t len) { #if !defined(OS_IOS) void TestLoadTimingCacheHitNoNetwork( - const net::LoadTimingInfo& load_timing_info) { + const LoadTimingInfo& load_timing_info) { EXPECT_FALSE(load_timing_info.socket_reused); - EXPECT_EQ(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id); + EXPECT_EQ(NetLog::Source::kInvalidId, load_timing_info.socket_log_id); EXPECT_FALSE(load_timing_info.request_start_time.is_null()); EXPECT_FALSE(load_timing_info.request_start.is_null()); @@ -212,9 +212,9 @@ void TestLoadTimingCacheHitNoNetwork( // Tests load timing in the case that there is no HTTP response. This can be // used to test in the case of errors or non-HTTP requests. void TestLoadTimingNoHttpResponse( - const net::LoadTimingInfo& load_timing_info) { + const LoadTimingInfo& load_timing_info) { EXPECT_FALSE(load_timing_info.socket_reused); - EXPECT_EQ(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id); + EXPECT_EQ(NetLog::Source::kInvalidId, load_timing_info.socket_log_id); // Only the request times should be non-null. EXPECT_FALSE(load_timing_info.request_start_time.is_null()); @@ -305,7 +305,7 @@ class BlockingNetworkDelegate : public TestNetworkDelegate { }; // Behavior during blocked stages. During other stages, just - // returns net::OK or NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION. + // returns OK or NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION. enum BlockMode { SYNCHRONOUS, // No callback, returns specified return values. AUTO_CALLBACK, // |this| posts a task to run the callback using the @@ -771,7 +771,7 @@ TEST_F(URLRequestTest, FileTestFullSpecifiedRange) { HttpRequestHeaders headers; headers.SetHeader( HttpRequestHeaders::kRange, - net::HttpByteRange::Bounded( + HttpByteRange::Bounded( first_byte_position, last_byte_position).GetHeaderValue()); r.SetExtraRequestHeaders(headers); r.Start(); @@ -814,7 +814,7 @@ TEST_F(URLRequestTest, FileTestHalfSpecifiedRange) { HttpRequestHeaders headers; headers.SetHeader(HttpRequestHeaders::kRange, - net::HttpByteRange::RightUnbounded( + HttpByteRange::RightUnbounded( first_byte_position).GetHeaderValue()); r.SetExtraRequestHeaders(headers); r.Start(); @@ -869,7 +869,7 @@ TEST_F(URLRequestTest, AllowFileURLs) { ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir.path(), &test_file)); std::string test_data("monkey"); base::WriteFile(test_file, test_data.data(), test_data.size()); - GURL test_file_url = net::FilePathToFileURL(test_file); + GURL test_file_url = FilePathToFileURL(test_file); { TestDelegate d; @@ -1873,7 +1873,7 @@ TEST_F(URLRequestTest, NetworkDelegateProxyError) { EXPECT_EQ(1, network_delegate.completed_requests()); } -// Make sure that net::NetworkDelegate::NotifyCompleted is called if +// Make sure that NetworkDelegate::NotifyCompleted is called if // content is empty. TEST_F(URLRequestTest, RequestCompletionForEmptyResponse) { TestDelegate d; @@ -2431,12 +2431,12 @@ class FixedDateNetworkDelegate : public TestNetworkDelegate { : fixed_date_(fixed_date) {} virtual ~FixedDateNetworkDelegate() {} - // net::NetworkDelegate implementation + // NetworkDelegate implementation virtual int OnHeadersReceived( - net::URLRequest* request, - const net::CompletionCallback& callback, - const net::HttpResponseHeaders* original_response_headers, - scoped_refptr<net::HttpResponseHeaders>* override_response_headers, + URLRequest* request, + const CompletionCallback& callback, + const HttpResponseHeaders* original_response_headers, + scoped_refptr<HttpResponseHeaders>* override_response_headers, GURL* allowed_unsafe_redirect_url) OVERRIDE; private: @@ -2446,13 +2446,13 @@ class FixedDateNetworkDelegate : public TestNetworkDelegate { }; int FixedDateNetworkDelegate::OnHeadersReceived( - net::URLRequest* request, - const net::CompletionCallback& callback, - const net::HttpResponseHeaders* original_response_headers, - scoped_refptr<net::HttpResponseHeaders>* override_response_headers, + URLRequest* request, + const CompletionCallback& callback, + const HttpResponseHeaders* original_response_headers, + scoped_refptr<HttpResponseHeaders>* override_response_headers, GURL* allowed_unsafe_redirect_url) { - net::HttpResponseHeaders* new_response_headers = - new net::HttpResponseHeaders(original_response_headers->raw_headers()); + HttpResponseHeaders* new_response_headers = + new HttpResponseHeaders(original_response_headers->raw_headers()); new_response_headers->RemoveHeader("Date"); new_response_headers->AddHeader("Date: " + fixed_date_); @@ -3124,7 +3124,7 @@ TEST_F(URLRequestTestHTTP, NetworkDelegateRedirectRequestOnHeadersReceived) { EXPECT_TRUE( network_delegate.last_observed_proxy().Equals( test_server_.host_port_pair())); - EXPECT_EQ(net::OK, r.status().error()); + EXPECT_EQ(OK, r.status().error()); EXPECT_EQ(redirect_url, r.url()); EXPECT_EQ(original_url, r.original_url()); EXPECT_EQ(2U, r.url_chain().size()); @@ -4123,7 +4123,7 @@ class AsyncLoggingUrlRequestDelegate : public TestDelegate { // URLRequest::Delegate implementation: void virtual OnReceivedRedirect(URLRequest* request, - const GURL& new_url, + const RedirectInfo& redirect_info, bool* defer_redirect) OVERRIDE { *defer_redirect = true; AsyncDelegateLogger::Run( @@ -4133,7 +4133,7 @@ class AsyncLoggingUrlRequestDelegate : public TestDelegate { LOAD_STATE_WAITING_FOR_DELEGATE, base::Bind( &AsyncLoggingUrlRequestDelegate::OnReceivedRedirectLoggingComplete, - base::Unretained(this), request, new_url)); + base::Unretained(this), request, redirect_info)); } virtual void OnResponseStarted(URLRequest* request) OVERRIDE { @@ -4161,9 +4161,9 @@ class AsyncLoggingUrlRequestDelegate : public TestDelegate { private: void OnReceivedRedirectLoggingComplete(URLRequest* request, - const GURL& new_url) { + const RedirectInfo& redirect_info) { bool defer_redirect = false; - TestDelegate::OnReceivedRedirect(request, new_url, &defer_redirect); + TestDelegate::OnReceivedRedirect(request, redirect_info, &defer_redirect); // FollowDeferredRedirect should not be called after cancellation. if (cancel_stage_ == CANCEL_ON_RECEIVED_REDIRECT) return; @@ -4621,10 +4621,10 @@ const char kExtraHeader[] = "Allow-Snafu"; const char kExtraValue[] = "fubar"; class RedirectWithAdditionalHeadersDelegate : public TestDelegate { - virtual void OnReceivedRedirect(net::URLRequest* request, - const GURL& new_url, + virtual void OnReceivedRedirect(URLRequest* request, + const RedirectInfo& redirect_info, bool* defer_redirect) OVERRIDE { - TestDelegate::OnReceivedRedirect(request, new_url, defer_redirect); + TestDelegate::OnReceivedRedirect(request, redirect_info, defer_redirect); request->SetExtraRequestHeaderByName(kExtraHeader, kExtraValue, false); } }; @@ -4657,10 +4657,10 @@ namespace { const char kExtraHeaderToRemove[] = "To-Be-Removed"; class RedirectWithHeaderRemovalDelegate : public TestDelegate { - virtual void OnReceivedRedirect(net::URLRequest* request, - const GURL& new_url, - bool* defer_redirect) OVERRIDE { - TestDelegate::OnReceivedRedirect(request, new_url, defer_redirect); + virtual void OnReceivedRedirect(URLRequest* request, + const RedirectInfo& redirect_info, + bool* defer_redirect) OVERRIDE { + TestDelegate::OnReceivedRedirect(request, redirect_info, defer_redirect); request->RemoveRequestHeaderByName(kExtraHeaderToRemove); } }; @@ -5388,7 +5388,7 @@ TEST_F(URLRequestTestHTTP, UnsafeRedirectToWhitelistedUnsafeURL) { EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); EXPECT_EQ(2U, r.url_chain().size()); - EXPECT_EQ(net::OK, r.status().error()); + EXPECT_EQ(OK, r.status().error()); EXPECT_EQ(unsafe_url, r.url()); EXPECT_EQ("this-is-considered-an-unsafe-url", d.data_received()); } @@ -5441,7 +5441,7 @@ TEST_F(URLRequestTestHTTP, UnsafeRedirectWithDifferentReferenceFragment) { EXPECT_EQ(2U, r.url_chain().size()); EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); - EXPECT_EQ(net::OK, r.status().error()); + EXPECT_EQ(OK, r.status().error()); EXPECT_EQ(original_url, r.original_url()); EXPECT_EQ(expected_url, r.url()); } @@ -5469,7 +5469,7 @@ TEST_F(URLRequestTestHTTP, RedirectWithReferenceFragmentAndUnrelatedUnsafeUrl) { EXPECT_EQ(2U, r.url_chain().size()); EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); - EXPECT_EQ(net::OK, r.status().error()); + EXPECT_EQ(OK, r.status().error()); EXPECT_EQ(original_url, r.original_url()); EXPECT_EQ(expected_redirect_url, r.url()); } @@ -5496,7 +5496,7 @@ TEST_F(URLRequestTestHTTP, RedirectWithReferenceFragment) { EXPECT_EQ(2U, r.url_chain().size()); EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); - EXPECT_EQ(net::OK, r.status().error()); + EXPECT_EQ(OK, r.status().error()); EXPECT_EQ(original_url, r.original_url()); EXPECT_EQ(redirect_url, r.url()); } @@ -5522,7 +5522,7 @@ TEST_F(URLRequestTestHTTP, RedirectJobWithReferenceFragment) { base::RunLoop().Run(); EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); - EXPECT_EQ(net::OK, r.status().error()); + EXPECT_EQ(OK, r.status().error()); EXPECT_EQ(original_url, r.original_url()); EXPECT_EQ(redirect_url, r.url()); } @@ -6151,12 +6151,57 @@ TEST_F(URLRequestTestHTTP, Redirect302PreserveReferenceFragment) { EXPECT_EQ(2U, r.url_chain().size()); EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); - EXPECT_EQ(net::OK, r.status().error()); + EXPECT_EQ(OK, r.status().error()); EXPECT_EQ(original_url, r.original_url()); EXPECT_EQ(expected_url, r.url()); } } +TEST_F(URLRequestTestHTTP, RedirectPreserveFirstPartyURL) { + ASSERT_TRUE(test_server_.Start()); + + GURL url(test_server_.GetURL("files/redirect302-to-echo")); + GURL first_party_url("http://example.com"); + + TestDelegate d; + { + URLRequest r(url, DEFAULT_PRIORITY, &d, &default_context_); + r.set_first_party_for_cookies(first_party_url); + + r.Start(); + base::RunLoop().Run(); + + EXPECT_EQ(2U, r.url_chain().size()); + EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); + EXPECT_EQ(OK, r.status().error()); + EXPECT_EQ(first_party_url, r.first_party_for_cookies()); + } +} + +TEST_F(URLRequestTestHTTP, RedirectUpdateFirstPartyURL) { + ASSERT_TRUE(test_server_.Start()); + + GURL url(test_server_.GetURL("files/redirect302-to-echo")); + GURL original_first_party_url("http://example.com"); + GURL expected_first_party_url(test_server_.GetURL("echo")); + + TestDelegate d; + { + URLRequest r(url, DEFAULT_PRIORITY, &d, &default_context_); + r.set_first_party_for_cookies(original_first_party_url); + r.set_first_party_url_policy( + URLRequest::UPDATE_FIRST_PARTY_URL_ON_REDIRECT); + + r.Start(); + base::RunLoop().Run(); + + EXPECT_EQ(2U, r.url_chain().size()); + EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); + EXPECT_EQ(OK, r.status().error()); + EXPECT_EQ(expected_first_party_url, r.first_party_for_cookies()); + } +} + TEST_F(URLRequestTestHTTP, InterceptPost302RedirectGet) { ASSERT_TRUE(test_server_.Start()); @@ -6970,9 +7015,9 @@ TEST_F(HTTPSRequestTest, SSLSessionCacheShardTest) { params.http_server_properties = default_context_.http_server_properties(); params.ssl_session_cache_shard = "alternate"; - scoped_ptr<net::HttpCache> cache(new net::HttpCache( - new net::HttpNetworkSession(params), - net::HttpCache::DefaultBackend::InMemory(0))); + scoped_ptr<HttpCache> cache(new HttpCache( + new HttpNetworkSession(params), + HttpCache::DefaultBackend::InMemory(0))); default_context_.set_http_transaction_factory(cache.get()); @@ -7178,7 +7223,7 @@ TEST_F(HTTPSFallbackTest, SSLv3NoFallbackReset) { class HTTPSSessionTest : public testing::Test { public: HTTPSSessionTest() : default_context_(true) { - cert_verifier_.set_default_result(net::OK); + cert_verifier_.set_default_result(OK); default_context_.set_network_delegate(&default_network_delegate_); default_context_.set_cert_verifier(&cert_verifier_); @@ -7206,7 +7251,7 @@ TEST_F(HTTPSSessionTest, DontResumeSessionsForInvalidCertificates) { SSLClientSocket::ClearSessionCache(); // Simulate the certificate being expired and attempt a connection. - cert_verifier_.set_default_result(net::ERR_CERT_DATE_INVALID); + cert_verifier_.set_default_result(ERR_CERT_DATE_INVALID); { TestDelegate d; URLRequest r(test_server.GetURL("ssl-session-cache"), @@ -7227,7 +7272,7 @@ TEST_F(HTTPSSessionTest, DontResumeSessionsForInvalidCertificates) { // Now change the certificate to be acceptable (so that the response is // loaded), and ensure that no session id is presented to the peer. - cert_verifier_.set_default_result(net::OK); + cert_verifier_.set_default_result(OK); { TestDelegate d; URLRequest r(test_server.GetURL("ssl-session-cache"), @@ -7334,7 +7379,7 @@ class HTTPSOCSPTest : public HTTPSRequestTest { SetupContext(&context_); context_.Init(); - scoped_refptr<net::X509Certificate> root_cert = + scoped_refptr<X509Certificate> root_cert = ImportCertFromFile(GetTestCertsDirectory(), "ocsp-test-root.pem"); CHECK_NE(static_cast<X509Certificate*>(NULL), root_cert); test_root_.reset(new ScopedTestRoot(root_cert.get())); diff --git a/net/websockets/websocket_stream.cc b/net/websockets/websocket_stream.cc index b6a2359..c9513d7 100644 --- a/net/websockets/websocket_stream.cc +++ b/net/websockets/websocket_stream.cc @@ -12,6 +12,7 @@ #include "net/http/http_request_headers.h" #include "net/http/http_response_headers.h" #include "net/http/http_status_code.h" +#include "net/url_request/redirect_info.h" #include "net/url_request/url_request.h" #include "net/url_request/url_request_context.h" #include "net/websockets/websocket_errors.h" @@ -46,7 +47,7 @@ class Delegate : public URLRequest::Delegate { // Implementation of URLRequest::Delegate methods. virtual void OnReceivedRedirect(URLRequest* request, - const GURL& new_url, + const RedirectInfo& redirect_info, bool* defer_redirect) OVERRIDE { // HTTP status codes returned by HttpStreamParser are filtered by // WebSocketBasicHandshakeStream, and only 101, 401 and 407 are permitted diff --git a/webkit/browser/fileapi/file_writer_delegate.cc b/webkit/browser/fileapi/file_writer_delegate.cc index 8311278..3c88fd2 100644 --- a/webkit/browser/fileapi/file_writer_delegate.cc +++ b/webkit/browser/fileapi/file_writer_delegate.cc @@ -61,9 +61,10 @@ void FileWriterDelegate::Cancel() { } } -void FileWriterDelegate::OnReceivedRedirect(net::URLRequest* request, - const GURL& new_url, - bool* defer_redirect) { +void FileWriterDelegate::OnReceivedRedirect( + net::URLRequest* request, + const net::RedirectInfo& redirect_info, + bool* defer_redirect) { NOTREACHED(); OnError(base::File::FILE_ERROR_SECURITY); } diff --git a/webkit/browser/fileapi/file_writer_delegate.h b/webkit/browser/fileapi/file_writer_delegate.h index c046428..e9f3413 100644 --- a/webkit/browser/fileapi/file_writer_delegate.h +++ b/webkit/browser/fileapi/file_writer_delegate.h @@ -52,7 +52,7 @@ class WEBKIT_STORAGE_BROWSER_EXPORT_PRIVATE FileWriterDelegate void Cancel(); virtual void OnReceivedRedirect(net::URLRequest* request, - const GURL& new_url, + const net::RedirectInfo& redirect_info, bool* defer_redirect) OVERRIDE; virtual void OnAuthRequired(net::URLRequest* request, net::AuthChallengeInfo* auth_info) OVERRIDE; |