diff options
Diffstat (limited to 'net/url_request')
-rw-r--r-- | net/url_request/url_request.cc | 22 | ||||
-rw-r--r-- | net/url_request/url_request_test_util.cc | 10 | ||||
-rw-r--r-- | net/url_request/url_request_test_util.h | 9 | ||||
-rw-r--r-- | net/url_request/url_request_unittest.cc | 15 |
4 files changed, 48 insertions, 8 deletions
diff --git a/net/url_request/url_request.cc b/net/url_request/url_request.cc index 15b9ab7..3764488 100644 --- a/net/url_request/url_request.cc +++ b/net/url_request/url_request.cc @@ -13,7 +13,6 @@ #include "base/memory/singleton.h" #include "base/message_loop/message_loop.h" #include "base/metrics/stats_counters.h" -#include "base/metrics/user_metrics.h" #include "base/stl_util.h" #include "base/strings/utf_string_conversions.h" #include "base/synchronization/lock.h" @@ -691,12 +690,21 @@ void URLRequest::StartJob(URLRequestJob* job) { if (referrer_policy_ == CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE && GURL(referrer_).SchemeIsSecure() && !url().SchemeIsSecure()) { -#if !defined(OFFICIAL_BUILD) - LOG(FATAL) << "Trying to send secure referrer for insecure load"; -#endif - referrer_.clear(); - base::RecordAction( - base::UserMetricsAction("Net.URLRequest_StartJob_InvalidReferrer")); + if (!network_delegate_ || + !network_delegate_->CancelURLRequestWithPolicyViolatingReferrerHeader( + *this, url(), GURL(referrer_))) { + referrer_.clear(); + } else { + // We need to clear the referrer anyway to avoid an infinite recursion + // when starting the error job. + referrer_.clear(); + std::string source("delegate"); + net_log_.AddEvent(NetLog::TYPE_CANCELLED, + NetLog::StringCallback("source", &source)); + RestartWithJob(new URLRequestErrorJob( + this, network_delegate_, ERR_BLOCKED_BY_CLIENT)); + return; + } } // Don't allow errors to be sent from within Start(). diff --git a/net/url_request/url_request_test_util.cc b/net/url_request/url_request_test_util.cc index 2d3f3aa..82d8579 100644 --- a/net/url_request/url_request_test_util.cc +++ b/net/url_request/url_request_test_util.cc @@ -320,7 +320,8 @@ TestNetworkDelegate::TestNetworkDelegate() has_load_timing_info_before_redirect_(false), has_load_timing_info_before_auth_(false), can_access_files_(true), - can_throttle_requests_(true) { + can_throttle_requests_(true), + cancel_request_with_policy_violating_referrer_(false) { } TestNetworkDelegate::~TestNetworkDelegate() { @@ -604,6 +605,13 @@ int TestNetworkDelegate::OnBeforeSocketStreamConnect( return OK; } +bool TestNetworkDelegate::OnCancelURLRequestWithPolicyViolatingReferrerHeader( + const URLRequest& request, + const GURL& target_url, + const GURL& referrer_url) const { + return cancel_request_with_policy_violating_referrer_; +} + // static std::string ScopedCustomUrlRequestTestHttpHost::value_("127.0.0.1"); diff --git a/net/url_request/url_request_test_util.h b/net/url_request/url_request_test_util.h index 0c342f4..cad472e 100644 --- a/net/url_request/url_request_test_util.h +++ b/net/url_request/url_request_test_util.h @@ -269,6 +269,10 @@ class TestNetworkDelegate : public NetworkDelegate { void set_can_throttle_requests(bool val) { can_throttle_requests_ = val; } bool can_throttle_requests() const { return can_throttle_requests_; } + void set_cancel_request_with_policy_violating_referrer(bool val) { + cancel_request_with_policy_violating_referrer_ = val; + } + int observed_before_proxy_headers_sent_callbacks() const { return observed_before_proxy_headers_sent_callbacks_; } @@ -324,6 +328,10 @@ class TestNetworkDelegate : public NetworkDelegate { virtual int OnBeforeSocketStreamConnect( SocketStream* stream, const CompletionCallback& callback) OVERRIDE; + virtual bool OnCancelURLRequestWithPolicyViolatingReferrerHeader( + const URLRequest& request, + const GURL& target_url, + const GURL& referrer_url) const OVERRIDE; void InitRequestStatesIfNew(int request_id); @@ -363,6 +371,7 @@ class TestNetworkDelegate : public NetworkDelegate { bool can_access_files_; // true by default bool can_throttle_requests_; // true by default + bool cancel_request_with_policy_violating_referrer_; // false by default }; // Overrides the host used by the LocalHttpTestServer in diff --git a/net/url_request/url_request_unittest.cc b/net/url_request/url_request_unittest.cc index 4efba54..06e05b9 100644 --- a/net/url_request/url_request_unittest.cc +++ b/net/url_request/url_request_unittest.cc @@ -1021,6 +1021,21 @@ TEST_F(URLRequestTest, InvalidUrlTest) { } } +TEST_F(URLRequestTest, InvalidReferrerTest) { + TestURLRequestContext context; + TestNetworkDelegate network_delegate; + network_delegate.set_cancel_request_with_policy_violating_referrer(true); + context.set_network_delegate(&network_delegate); + TestDelegate d; + scoped_ptr<URLRequest> req(context.CreateRequest( + GURL("http://localhost/"), DEFAULT_PRIORITY, &d, NULL)); + req->SetReferrer("https://somewhere.com/"); + + req->Start(); + base::RunLoop().Run(); + EXPECT_TRUE(d.request_failed()); +} + #if defined(OS_WIN) TEST_F(URLRequestTest, ResolveShortcutTest) { base::FilePath app_path; |