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 c44905536c529543a2a4cd4be1012b02f6924a53..24c424eeb2274243aab753f0fb738bbc337221b1 100644 |
--- a/net/url_request/url_request_http_job_unittest.cc |
+++ b/net/url_request/url_request_http_job_unittest.cc |
@@ -751,6 +751,237 @@ TEST_F(URLRequestHttpJobTest, HSTSInternalRedirectTest) { |
} |
} |
+TEST_F(URLRequestHttpJobTest, UpgradeInsecureRequestRewritesTest) { |
+ const char* kHttpOrigin1 = "http://origin1.test/"; |
+ const char* kHttpOrigin1WithPort = "http://origin1.test:999/"; |
+ const char* kHttpOrigin2 = "http://origin2.test/"; |
+ const char* kHttpsOrigin1 = "https://origin1.test/"; |
+ const char* kHttpsOrigin1WithPort = "https://origin1.test:999/"; |
+ const char* kHttpsOrigin2 = "https://origin2.test/"; |
+ const char* kWsOrigin1 = "ws://origin1.test/"; |
+ const char* kWsOrigin1WithPort = "ws://origin1.test:999/"; |
+ const char* kWsOrigin2 = "ws://origin2.test/"; |
+ const char* kWssOrigin1 = "wss://origin1.test/"; |
+ const char* kWssOrigin1WithPort = "wss://origin1.test:999/"; |
+ const char* kWssOrigin2 = "wss://origin2.test/"; |
+ const char* kWeirdOrigin1 = "weird://origin1.test/"; |
+ |
+ struct TestCase { |
+ const char* url; |
+ const char* initiator; |
+ URLRequest::InsecureRequestPolicy policy; |
+ bool upgrade_expected; |
+ const char* upgraded_url; |
+ } cases[] = { |
+ // HTTP Requests |
+ // Secure origins are not upgraded: |
+ {kHttpsOrigin1, kHttpOrigin1, |
+ URLRequest::DO_NOT_UPGRADE_INSECURE_REQUESTS, false, ""}, |
+ {kHttpsOrigin1, kHttpOrigin1, |
+ URLRequest::UPGRADE_SAME_HOST_INSECURE_REQUESTS, false, ""}, |
+ {kHttpsOrigin1, kHttpOrigin1, URLRequest::UPGRADE_ALL_INSECURE_REQUESTS, |
+ false, ""}, |
+ {kHttpsOrigin1, kHttpOrigin2, |
+ URLRequest::DO_NOT_UPGRADE_INSECURE_REQUESTS, false, ""}, |
+ {kHttpsOrigin1, kHttpOrigin2, |
+ URLRequest::UPGRADE_SAME_HOST_INSECURE_REQUESTS, false, ""}, |
+ {kHttpsOrigin1, kHttpOrigin2, URLRequest::UPGRADE_ALL_INSECURE_REQUESTS, |
+ false, ""}, |
+ |
+ // DO_NOT_UPGRADE_INSECURE_REQUESTS doesn't upgrade insecure requests. |
+ {kHttpOrigin1, kHttpOrigin1, URLRequest::DO_NOT_UPGRADE_INSECURE_REQUESTS, |
+ false, ""}, |
+ {kHttpOrigin1, kHttpOrigin2, URLRequest::DO_NOT_UPGRADE_INSECURE_REQUESTS, |
+ false, ""}, |
+ {kHttpOrigin1, kHttpsOrigin1, |
+ URLRequest::DO_NOT_UPGRADE_INSECURE_REQUESTS, false, ""}, |
+ {kHttpOrigin1, kHttpsOrigin2, |
+ URLRequest::DO_NOT_UPGRADE_INSECURE_REQUESTS, false, ""}, |
+ |
+ // UPGRADE_ALL_INSECURE_REQUESTS does upgrade insecure requests. |
+ {kHttpOrigin1, kHttpOrigin1, URLRequest::UPGRADE_ALL_INSECURE_REQUESTS, |
+ true, kHttpsOrigin1}, |
+ {kHttpOrigin1, kHttpOrigin2, URLRequest::UPGRADE_ALL_INSECURE_REQUESTS, |
+ true, kHttpsOrigin1}, |
+ {kHttpOrigin1, kHttpsOrigin1, URLRequest::UPGRADE_ALL_INSECURE_REQUESTS, |
+ true, kHttpsOrigin1}, |
+ {kHttpOrigin1, kHttpsOrigin2, URLRequest::UPGRADE_ALL_INSECURE_REQUESTS, |
+ true, kHttpsOrigin1}, |
+ |
+ // UPGRADE_SAME_HOST_INSECURE_REQUESTS does upgrade insecure requests |
+ // when the url's and initiator's hosts match. |
+ {kHttpOrigin1, kHttpOrigin1, |
+ URLRequest::UPGRADE_SAME_HOST_INSECURE_REQUESTS, true, kHttpsOrigin1}, |
+ {kHttpOrigin1, kHttpOrigin2, |
+ URLRequest::UPGRADE_SAME_HOST_INSECURE_REQUESTS, false, ""}, |
+ {kHttpOrigin1, kHttpsOrigin1, |
+ URLRequest::UPGRADE_SAME_HOST_INSECURE_REQUESTS, true, kHttpsOrigin1}, |
+ {kHttpOrigin1, kHttpsOrigin2, |
+ URLRequest::UPGRADE_SAME_HOST_INSECURE_REQUESTS, false, ""}, |
+ |
+ // Upgrades do not affect ports: |
+ {kHttpOrigin1WithPort, kHttpOrigin1, |
+ URLRequest::UPGRADE_ALL_INSECURE_REQUESTS, true, kHttpsOrigin1WithPort}, |
+ {kHttpOrigin1WithPort, kHttpOrigin2, |
+ URLRequest::UPGRADE_ALL_INSECURE_REQUESTS, true, kHttpsOrigin1WithPort}, |
+ {kHttpOrigin1WithPort, kHttpOrigin1WithPort, |
+ URLRequest::UPGRADE_ALL_INSECURE_REQUESTS, true, kHttpsOrigin1WithPort}, |
+ {kHttpOrigin1WithPort, kHttpsOrigin1, |
+ URLRequest::UPGRADE_ALL_INSECURE_REQUESTS, true, kHttpsOrigin1WithPort}, |
+ {kHttpOrigin1WithPort, kHttpsOrigin2, |
+ URLRequest::UPGRADE_ALL_INSECURE_REQUESTS, true, kHttpsOrigin1WithPort}, |
+ {kHttpOrigin1WithPort, kHttpsOrigin1WithPort, |
+ URLRequest::UPGRADE_ALL_INSECURE_REQUESTS, true, kHttpsOrigin1WithPort}, |
+ |
+ // Ports do not affect same-hostness: |
+ {kHttpOrigin1WithPort, kHttpOrigin1, |
+ URLRequest::UPGRADE_SAME_HOST_INSECURE_REQUESTS, true, |
+ kHttpsOrigin1WithPort}, |
+ {kHttpOrigin1WithPort, kHttpOrigin2, |
+ URLRequest::UPGRADE_SAME_HOST_INSECURE_REQUESTS, false, ""}, |
+ {kHttpOrigin1WithPort, kHttpsOrigin1, |
+ URLRequest::UPGRADE_SAME_HOST_INSECURE_REQUESTS, true, |
+ kHttpsOrigin1WithPort}, |
+ {kHttpOrigin1WithPort, kHttpsOrigin2, |
+ URLRequest::UPGRADE_SAME_HOST_INSECURE_REQUESTS, false, ""}, |
+ |
+ // WebSocket Requests |
+ // Secure origins are not upgraded: |
+ {kWssOrigin1, kWsOrigin1, URLRequest::DO_NOT_UPGRADE_INSECURE_REQUESTS, |
+ false, ""}, |
+ {kWssOrigin1, kWsOrigin1, URLRequest::UPGRADE_SAME_HOST_INSECURE_REQUESTS, |
+ false, ""}, |
+ {kWssOrigin1, kWsOrigin1, URLRequest::UPGRADE_ALL_INSECURE_REQUESTS, |
+ false, ""}, |
+ {kWssOrigin1, kWsOrigin2, URLRequest::DO_NOT_UPGRADE_INSECURE_REQUESTS, |
+ false, ""}, |
+ {kWssOrigin1, kWsOrigin2, URLRequest::UPGRADE_SAME_HOST_INSECURE_REQUESTS, |
+ false, ""}, |
+ {kWssOrigin1, kWsOrigin2, URLRequest::UPGRADE_ALL_INSECURE_REQUESTS, |
+ false, ""}, |
+ |
+ // DO_NOT_UPGRADE_INSECURE_REQUESTS doesn't upgrade insecure requests. |
+ {kWsOrigin1, kWsOrigin1, URLRequest::DO_NOT_UPGRADE_INSECURE_REQUESTS, |
+ false, ""}, |
+ {kWsOrigin1, kWsOrigin2, URLRequest::DO_NOT_UPGRADE_INSECURE_REQUESTS, |
+ false, ""}, |
+ {kWsOrigin1, kWssOrigin1, URLRequest::DO_NOT_UPGRADE_INSECURE_REQUESTS, |
+ false, ""}, |
+ {kWsOrigin1, kWssOrigin2, URLRequest::DO_NOT_UPGRADE_INSECURE_REQUESTS, |
+ false, ""}, |
+ |
+ // UPGRADE_ALL_INSECURE_REQUESTS does upgrade insecure requests. |
+ {kWsOrigin1, kWsOrigin1, URLRequest::UPGRADE_ALL_INSECURE_REQUESTS, true, |
+ kWssOrigin1}, |
+ {kWsOrigin1, kWsOrigin2, URLRequest::UPGRADE_ALL_INSECURE_REQUESTS, true, |
+ kWssOrigin1}, |
+ {kWsOrigin1, kWssOrigin1, URLRequest::UPGRADE_ALL_INSECURE_REQUESTS, true, |
+ kWssOrigin1}, |
+ {kWsOrigin1, kWssOrigin2, URLRequest::UPGRADE_ALL_INSECURE_REQUESTS, true, |
+ kWssOrigin1}, |
+ |
+ // UPGRADE_SAME_HOST_INSECURE_REQUESTS does upgrade insecure requests |
+ // when the url's and initiator's hosts match. |
+ {kWsOrigin1, kWsOrigin1, URLRequest::UPGRADE_SAME_HOST_INSECURE_REQUESTS, |
+ true, kWssOrigin1}, |
+ {kWsOrigin1, kWsOrigin2, URLRequest::UPGRADE_SAME_HOST_INSECURE_REQUESTS, |
+ false, ""}, |
+ {kWsOrigin1, kWssOrigin1, URLRequest::UPGRADE_SAME_HOST_INSECURE_REQUESTS, |
+ true, kWssOrigin1}, |
+ {kWsOrigin1, kWssOrigin2, URLRequest::UPGRADE_SAME_HOST_INSECURE_REQUESTS, |
+ false, ""}, |
+ |
+ // Upgrades do not affect ports: |
+ {kWsOrigin1WithPort, kWsOrigin1, |
+ URLRequest::UPGRADE_ALL_INSECURE_REQUESTS, true, kWssOrigin1WithPort}, |
+ {kWsOrigin1WithPort, kWsOrigin2, |
+ URLRequest::UPGRADE_ALL_INSECURE_REQUESTS, true, kWssOrigin1WithPort}, |
+ {kWsOrigin1WithPort, kWsOrigin1WithPort, |
+ URLRequest::UPGRADE_ALL_INSECURE_REQUESTS, true, kWssOrigin1WithPort}, |
+ {kWsOrigin1WithPort, kWssOrigin1, |
+ URLRequest::UPGRADE_ALL_INSECURE_REQUESTS, true, kWssOrigin1WithPort}, |
+ {kWsOrigin1WithPort, kWssOrigin2, |
+ URLRequest::UPGRADE_ALL_INSECURE_REQUESTS, true, kWssOrigin1WithPort}, |
+ {kWsOrigin1WithPort, kWssOrigin1WithPort, |
+ URLRequest::UPGRADE_ALL_INSECURE_REQUESTS, true, kWssOrigin1WithPort}, |
+ |
+ // Ports do not affect same-hostness: |
+ {kWsOrigin1WithPort, kWsOrigin1, |
+ URLRequest::UPGRADE_SAME_HOST_INSECURE_REQUESTS, true, |
+ kWssOrigin1WithPort}, |
+ {kWsOrigin1WithPort, kWsOrigin2, |
+ URLRequest::UPGRADE_SAME_HOST_INSECURE_REQUESTS, false, ""}, |
+ {kWsOrigin1WithPort, kWssOrigin1, |
+ URLRequest::UPGRADE_SAME_HOST_INSECURE_REQUESTS, true, |
+ kWssOrigin1WithPort}, |
+ {kWsOrigin1WithPort, kWssOrigin2, |
+ URLRequest::UPGRADE_SAME_HOST_INSECURE_REQUESTS, false, ""}, |
+ |
+ // Weird Origins are not upgraded: |
+ {kWeirdOrigin1, kWeirdOrigin1, |
+ URLRequest::DO_NOT_UPGRADE_INSECURE_REQUESTS, false, ""}, |
+ {kWeirdOrigin1, kWeirdOrigin1, |
+ URLRequest::UPGRADE_SAME_HOST_INSECURE_REQUESTS, false, ""}, |
+ {kWeirdOrigin1, kWeirdOrigin1, URLRequest::UPGRADE_ALL_INSECURE_REQUESTS, |
+ false, ""}, |
+ {kWeirdOrigin1, kHttpOrigin1, |
+ URLRequest::DO_NOT_UPGRADE_INSECURE_REQUESTS, false, ""}, |
+ {kWeirdOrigin1, kHttpOrigin1, |
+ URLRequest::UPGRADE_SAME_HOST_INSECURE_REQUESTS, false, ""}, |
+ {kWeirdOrigin1, kHttpOrigin1, URLRequest::UPGRADE_ALL_INSECURE_REQUESTS, |
+ false, ""}, |
+ {kWeirdOrigin1, kHttpsOrigin1, |
+ URLRequest::DO_NOT_UPGRADE_INSECURE_REQUESTS, false, ""}, |
+ {kWeirdOrigin1, kHttpsOrigin1, |
+ URLRequest::UPGRADE_SAME_HOST_INSECURE_REQUESTS, false, ""}, |
+ {kWeirdOrigin1, kHttpsOrigin1, URLRequest::UPGRADE_ALL_INSECURE_REQUESTS, |
+ false, ""}, |
+ {kWeirdOrigin1, kWssOrigin1, URLRequest::DO_NOT_UPGRADE_INSECURE_REQUESTS, |
+ false, ""}, |
+ {kWeirdOrigin1, kWssOrigin1, |
+ URLRequest::UPGRADE_SAME_HOST_INSECURE_REQUESTS, false, ""}, |
+ {kWeirdOrigin1, kWssOrigin1, URLRequest::UPGRADE_ALL_INSECURE_REQUESTS, |
+ false, ""}, |
+ }; |
+ |
+ for (const auto& test : cases) { |
+ SCOPED_TRACE(testing::Message() << "URL: " << test.url |
+ << " Initiator: " << test.initiator |
+ << " Policy: " << test.policy); |
+ TestDelegate d; |
+ TestNetworkDelegate network_delegate; |
+ std::unique_ptr<URLRequest> r( |
+ context_.CreateRequest(GURL(test.url), DEFAULT_PRIORITY, &d)); |
+ r->set_insecure_request_policy(test.policy); |
+ r->set_initiator(url::Origin(GURL(test.initiator))); |
+ |
+ net_log_.Clear(); |
+ r->Start(); |
+ base::RunLoop().Run(); |
+ |
+ if (test.upgrade_expected) { |
+ net::TestNetLogEntry::List entries; |
+ net_log_.GetEntries(&entries); |
+ int rewrites = 0; |
+ for (const auto& entry : entries) { |
+ if (entry.type == net::NetLogEventType::URL_REQUEST_REWRITTEN) { |
+ rewrites++; |
+ std::string value; |
+ EXPECT_TRUE(entry.GetStringValue("reason", &value)); |
+ EXPECT_EQ("Upgrade-Insecure-Requests", value); |
+ } |
+ } |
+ EXPECT_EQ(0, d.received_redirect_count()); |
+ EXPECT_EQ(2u, r->url_chain().size()); |
+ EXPECT_EQ(GURL(test.upgraded_url), r->url()); |
+ } else { |
+ EXPECT_EQ(0, d.received_redirect_count()); |
+ EXPECT_EQ(1u, r->url_chain().size()); |
+ EXPECT_EQ(GURL(test.url), r->url()); |
+ } |
+ } |
+} |
+ |
class MockSdchObserver : public SdchObserver { |
public: |
MockSdchObserver() {} |