summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/chromeos/drive/drive_url_request_job_unittest.cc8
-rw-r--r--chrome/browser/prerender/prerender_tracker_unittest.cc5
-rw-r--r--chrome/renderer/extensions/extension_localization_peer.cc3
-rw-r--r--chrome/renderer/extensions/extension_localization_peer.h3
-rw-r--r--chrome/renderer/extensions/extension_localization_peer_unittest.cc6
-rw-r--r--chrome/renderer/security_filter_peer.cc3
-rw-r--r--chrome/renderer/security_filter_peer.h5
-rw-r--r--components/navigation_interception/intercept_navigation_resource_throttle.cc2
-rw-r--r--content/browser/appcache/appcache_update_job.cc4
-rw-r--r--content/browser/appcache/appcache_update_job.h2
-rw-r--r--content/browser/download/download_resource_handler.cc5
-rw-r--r--content/browser/download/download_resource_handler.h2
-rw-r--r--content/browser/download/save_file_resource_handler.cc5
-rw-r--r--content/browser/download/save_file_resource_handler.h2
-rw-r--r--content/browser/loader/async_resource_handler.cc13
-rw-r--r--content/browser/loader/async_resource_handler.h2
-rw-r--r--content/browser/loader/certificate_resource_handler.cc9
-rw-r--r--content/browser/loader/certificate_resource_handler.h4
-rw-r--r--content/browser/loader/cross_site_resource_handler.cc9
-rw-r--r--content/browser/loader/cross_site_resource_handler.h2
-rw-r--r--content/browser/loader/detachable_resource_handler.cc10
-rw-r--r--content/browser/loader/detachable_resource_handler.h2
-rw-r--r--content/browser/loader/layered_resource_handler.cc9
-rw-r--r--content/browser/loader/layered_resource_handler.h2
-rw-r--r--content/browser/loader/resource_dispatcher_host_impl.cc16
-rw-r--r--content/browser/loader/resource_handler.h3
-rw-r--r--content/browser/loader/resource_loader.cc13
-rw-r--r--content/browser/loader/resource_loader.h2
-rw-r--r--content/browser/loader/resource_loader_unittest.cc2
-rw-r--r--content/browser/loader/stream_resource_handler.cc7
-rw-r--r--content/browser/loader/stream_resource_handler.h2
-rw-r--r--content/browser/loader/sync_resource_handler.cc10
-rw-r--r--content/browser/loader/sync_resource_handler.h2
-rw-r--r--content/browser/loader/throttling_resource_handler.cc19
-rw-r--r--content/browser/loader/throttling_resource_handler.h4
-rw-r--r--content/browser/service_worker/service_worker_url_request_job.cc7
-rw-r--r--content/browser/service_worker/service_worker_url_request_job.h2
-rw-r--r--content/browser/service_worker/service_worker_write_to_cache_job.cc2
-rw-r--r--content/browser/service_worker/service_worker_write_to_cache_job.h2
-rw-r--r--content/child/npapi/plugin_url_fetcher.cc34
-rw-r--r--content/child/npapi/plugin_url_fetcher.h4
-rw-r--r--content/child/resource_dispatcher.cc9
-rw-r--r--content/child/resource_dispatcher.h7
-rw-r--r--content/child/resource_dispatcher_unittest.cc14
-rw-r--r--content/child/web_url_loader_impl.cc40
-rw-r--r--content/child/web_url_loader_impl_unittest.cc8
-rw-r--r--content/common/resource_messages.h14
-rw-r--r--content/public/child/request_peer.h14
-rw-r--r--mojo/services/network/url_loader_impl.cc9
-rw-r--r--mojo/services/network/url_loader_impl.h2
-rw-r--r--net/net.gypi2
-rw-r--r--net/ocsp/nss_ocsp.cc5
-rw-r--r--net/url_request/redirect_info.cc13
-rw-r--r--net/url_request/redirect_info.h43
-rw-r--r--net/url_request/url_fetcher_core.cc5
-rw-r--r--net/url_request/url_fetcher_core.h2
-rw-r--r--net/url_request/url_request.cc46
-rw-r--r--net/url_request/url_request.h38
-rw-r--r--net/url_request/url_request_job.cc93
-rw-r--r--net/url_request/url_request_job.h10
-rw-r--r--net/url_request/url_request_test_util.cc4
-rw-r--r--net/url_request/url_request_test_util.h3
-rw-r--r--net/url_request/url_request_unittest.cc147
-rw-r--r--net/websockets/websocket_stream.cc3
-rw-r--r--webkit/browser/fileapi/file_writer_delegate.cc7
-rw-r--r--webkit/browser/fileapi/file_writer_delegate.h2
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;