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..809e38273299467dc058985d4c08103f90546f80 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" |
@@ -625,6 +628,68 @@ 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")); |
+ |
+ net::TestNetLog net_log; |
+ context_.set_net_log(&net_log); |
mmenke
2016/06/17 15:06:18
Could you move this into the test fixture, just be
Mike West
2016/06/17 16:35:17
Sure! Done.
|
+ |
+ 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/"}, |
mmenke
2016/06/17 15:06:18
Hrm...Websocket requests generally aren't made thr
Mike West
2016/06/17 16:35:17
I look forward to exploring the crazy in the other
|
+ }; |
+ |
+ 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)); |
+ std::unique_ptr<URLRequestJob> job(URLRequestHttpJob::Factory( |
+ r.get(), &network_delegate, url::kHttpScheme)); |
mmenke
2016/06/17 15:06:18
This object isn't being used anywhere, please dele
Mike West
2016/06/17 16:35:17
Done.
|
+ |
+ 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()); |
mmenke
2016/06/17 15:06:18
Suggest checking r->url_chain()'s length as well,
Mike West
2016/06/17 16:35:17
Added.
|
+ } else { |
+ EXPECT_EQ(0, d.received_redirect_count()); |
+ } |
+ EXPECT_EQ(GURL(test.url_expected), r->url()); |
+ } |
+} |
+ |
class MockSdchObserver : public SdchObserver { |
public: |
MockSdchObserver() {} |
@@ -944,6 +1009,22 @@ TEST_F(URLRequestHttpJobWebSocketTest, CreateHelperPassedThrough) { |
#endif // !defined(OS_IOS) |
+class URLRequestHttpJobInternalRedirectTest : public ::testing::Test { |
+ 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 |