Index: net/url_request/url_request_http_job_unittest.cc |
diff --git a/net/url_request/url_request_http_job_unittest.cc b/net/url_request/url_request_http_job_unittest.cc |
index c12807f85b6605d6acaf3c7455e03493a7e1cd72..978fae639167e2dcd1cc9945a8ab10cfdde37391 100644 |
--- a/net/url_request/url_request_http_job_unittest.cc |
+++ b/net/url_request/url_request_http_job_unittest.cc |
@@ -21,6 +21,9 @@ |
#include "net/cookies/cookie_store_test_helpers.h" |
#include "net/http/http_transaction_factory.h" |
#include "net/http/http_transaction_test_util.h" |
+#include "net/log/test_net_log.h" |
+#include "net/log/test_net_log_entry.h" |
+#include "net/log/test_net_log_util.h" |
#include "net/socket/socket_test_util.h" |
#include "net/test/cert_test_util.h" |
#include "net/url_request/url_request.h" |
@@ -64,7 +67,7 @@ class URLRequestHttpJobTest : public ::testing::Test { |
EXPECT_TRUE(test_job_factory_.SetProtocolHandler( |
url::kHttpScheme, base::WrapUnique(test_job_interceptor_))); |
context_.set_job_factory(&test_job_factory_); |
- |
+ context_.set_net_log(&net_log_); |
context_.Init(); |
req_ = context_.CreateRequest(GURL("http://www.example.com"), |
@@ -110,6 +113,7 @@ class URLRequestHttpJobTest : public ::testing::Test { |
TestURLRequestContext context_; |
TestDelegate delegate_; |
+ TestNetLog net_log_; |
std::unique_ptr<URLRequest> req_; |
}; |
@@ -625,6 +629,69 @@ TEST_F(URLRequestHttpJobTest, SdchAdvertisementPost) { |
EXPECT_FALSE(TransactionAcceptsSdchEncoding()); |
} |
+TEST_F(URLRequestHttpJobTest, HSTSInternalRedirectTest) { |
+ // Setup HSTS state. |
+ context_.transport_security_state()->AddHSTS( |
+ "upgrade.test", base::Time::Now() + base::TimeDelta::FromSeconds(10), |
+ true); |
+ ASSERT_TRUE( |
+ context_.transport_security_state()->ShouldUpgradeToSSL("upgrade.test")); |
+ ASSERT_FALSE(context_.transport_security_state()->ShouldUpgradeToSSL( |
+ "no-upgrade.test")); |
+ |
+ struct TestCase { |
+ const char* url; |
+ bool upgrade_expected; |
+ const char* url_expected; |
+ } cases[] = { |
+ {"http://upgrade.test/", true, "https://upgrade.test/"}, |
+ {"http://upgrade.test:123/", true, "https://upgrade.test:123/"}, |
+ {"http://no-upgrade.test/", false, "http://no-upgrade.test/"}, |
+ {"http://no-upgrade.test:123/", false, "http://no-upgrade.test:123/"}, |
+// iOS doesn't support websockets; see the comments above |
+// URLRequestHttpJobWebSocketTest for detail. |
+#if !defined(OS_IOS) |
Mike West
2016/06/20 13:36:41
mmenke@: WebSockets aren't enabled on iOS. I'm dis
|
+ {"ws://upgrade.test/", true, "wss://upgrade.test/"}, |
+ {"ws://upgrade.test:123/", true, "wss://upgrade.test:123/"}, |
+ {"ws://no-upgrade.test/", false, "ws://no-upgrade.test/"}, |
+ {"ws://no-upgrade.test:123/", false, "ws://no-upgrade.test:123/"}, |
+#endif // !defined(OS_IOS) |
+ }; |
+ |
+ for (const auto& test : cases) { |
+ SCOPED_TRACE(test.url); |
+ TestDelegate d; |
+ TestNetworkDelegate network_delegate; |
+ std::unique_ptr<URLRequest> r( |
+ context_.CreateRequest(GURL(test.url), DEFAULT_PRIORITY, &d)); |
+ |
+ net_log_.Clear(); |
+ r->Start(); |
+ base::RunLoop().Run(); |
+ |
+ if (test.upgrade_expected) { |
+ net::TestNetLogEntry::List entries; |
+ net_log_.GetEntries(&entries); |
+ int redirects = 0; |
+ for (const auto& entry : entries) { |
+ if (entry.type == net::NetLog::TYPE_URL_REQUEST_REDIRECT_JOB) { |
+ redirects++; |
+ std::string value; |
+ EXPECT_TRUE(entry.GetStringValue("reason", &value)); |
+ EXPECT_EQ("HSTS", value); |
+ } |
+ } |
+ EXPECT_EQ(1, redirects); |
+ EXPECT_EQ(1, d.received_redirect_count()); |
+ EXPECT_EQ(2u, r->url_chain().size()); |
+ } else { |
+ EXPECT_EQ(0, d.received_redirect_count()); |
+ EXPECT_EQ(1u, r->url_chain().size()); |
+ } |
+ EXPECT_EQ(GURL(test.url_expected), r->url()); |
+ } |
+} |
+ |
class MockSdchObserver : public SdchObserver { |
public: |
MockSdchObserver() {} |