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..88b6799855e18edf3a1f7fdd5f69ab76cff007c9 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,65 @@ 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/"}, |
+ {"ws://upgrade.test/", true, "wss://upgrade.test/"}, |
+ {"http://upgrade.test:123/", true, "https://upgrade.test:123/"}, |
+ {"ws://upgrade.test:123/", true, "wss://upgrade.test:123/"}, |
+ {"http://no-upgrade.test/", false, "http://no-upgrade.test/"}, |
+ {"ws://no-upgrade.test/", false, "ws://no-upgrade.test/"}, |
+ {"http://no-upgrade.test:123/", false, "http://no-upgrade.test:123/"}, |
+ {"ws://no-upgrade.test:123/", false, "ws://no-upgrade.test:123/"}, |
+ }; |
+ |
+ 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() {} |
@@ -944,6 +1007,22 @@ TEST_F(URLRequestHttpJobWebSocketTest, CreateHelperPassedThrough) { |
#endif // !defined(OS_IOS) |
+class URLRequestHttpJobInternalRedirectTest : public ::testing::Test { |
mmenke
2016/06/17 16:40:29
Remove this.
Mike West
2016/06/17 19:44:34
Ugh. Yes, thank you. :)
|
+ protected: |
+ URLRequestHttpJobInternalRedirectTest() |
+ : context_(new TestURLRequestContext(true)) { |
+ std::unique_ptr<HttpNetworkSession::Params> params( |
+ new HttpNetworkSession::Params); |
+ context_->set_enable_brotli(true); |
+ context_->set_http_network_session_params(std::move(params)); |
+ context_->set_client_socket_factory(&socket_factory_); |
+ context_->Init(); |
+ } |
+ |
+ MockClientSocketFactory socket_factory_; |
+ std::unique_ptr<TestURLRequestContext> context_; |
+}; |
+ |
} // namespace |
} // namespace net |