summaryrefslogtreecommitdiffstats
path: root/net/url_request
diff options
context:
space:
mode:
Diffstat (limited to 'net/url_request')
-rw-r--r--net/url_request/url_request.cc22
-rw-r--r--net/url_request/url_request_test_util.cc10
-rw-r--r--net/url_request/url_request_test_util.h9
-rw-r--r--net/url_request/url_request_unittest.cc15
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;