Index: net/http/http_network_transaction_unittest.cc |
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc |
index 6e5b38e3f0e75d6d80ab84cc7e41514cfcb3bf53..e9dde2532a7fef7990fd234f0afe4f36757385a4 100644 |
--- a/net/http/http_network_transaction_unittest.cc |
+++ b/net/http/http_network_transaction_unittest.cc |
@@ -9709,6 +9709,63 @@ TEST_P(HttpNetworkTransactionTest, HonorAlternativeServiceHeader) { |
EXPECT_EQ(443, alternative_service_vector[0].port); |
} |
+// Regression test for https://crbug.com/615497. |
+TEST_P(HttpNetworkTransactionTest, |
+ DoNotParseAlternativeServiceHeaderOnInsecureRequest) { |
+ session_deps_.enable_alternative_service_for_insecure_origins = false; |
+ |
+ std::string alternative_service_http_header = |
+ GetAlternativeServiceHttpHeader(); |
+ |
+ MockRead data_reads[] = { |
+ MockRead("HTTP/1.1 200 OK\r\n"), |
+ MockRead(alternative_service_http_header.c_str()), |
+ MockRead("\r\n"), |
+ MockRead("hello world"), |
+ MockRead(SYNCHRONOUS, OK), |
+ }; |
+ |
+ HttpRequestInfo request; |
+ request.method = "GET"; |
+ request.url = GURL("http://www.example.org/"); |
+ request.load_flags = 0; |
+ |
+ StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); |
+ session_deps_.socket_factory->AddSocketDataProvider(&data); |
+ |
+ TestCompletionCallback callback; |
+ |
+ std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
+ std::unique_ptr<HttpTransaction> trans( |
+ new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
+ |
+ url::SchemeHostPort test_server(request.url); |
+ HttpServerProperties& http_server_properties = |
+ *session->http_server_properties(); |
+ AlternativeServiceVector alternative_service_vector = |
+ http_server_properties.GetAlternativeServices(test_server); |
+ EXPECT_TRUE(alternative_service_vector.empty()); |
+ |
+ int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
+ EXPECT_EQ(ERR_IO_PENDING, rv); |
+ EXPECT_EQ(OK, callback.WaitForResult()); |
+ |
+ const HttpResponseInfo* response = trans->GetResponseInfo(); |
+ ASSERT_TRUE(response); |
+ ASSERT_TRUE(response->headers); |
+ EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
+ EXPECT_FALSE(response->was_fetched_via_spdy); |
+ EXPECT_FALSE(response->was_npn_negotiated); |
+ |
+ std::string response_data; |
+ ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); |
+ EXPECT_EQ("hello world", response_data); |
+ |
+ alternative_service_vector = |
+ http_server_properties.GetAlternativeServices(test_server); |
+ EXPECT_TRUE(alternative_service_vector.empty()); |
+} |
+ |
// HTTP/2 Alternative Services should be disabled if alternative service |
// hostname is different from that of origin. |
// TODO(bnc): Remove when https://crbug.com/615413 is fixed. |
@@ -9754,6 +9811,49 @@ TEST_P(HttpNetworkTransactionTest, |
EXPECT_EQ(ERR_CONNECTION_REFUSED, callback.GetResult(rv)); |
} |
+// Regression test for https://crbug.com/615497: |
+// Alternative Services should be disabled for http origin. |
+TEST_P(HttpNetworkTransactionTest, |
+ DisableAlternativeServicesForInsecureOrigin) { |
+ session_deps_.enable_alternative_service_for_insecure_origins = false; |
+ |
+ HttpRequestInfo request; |
+ request.method = "GET"; |
+ request.url = GURL("http://www.example.org/"); |
+ request.load_flags = 0; |
+ |
+ MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED); |
+ StaticSocketDataProvider first_data; |
+ first_data.set_connect_data(mock_connect); |
+ session_deps_.socket_factory->AddSocketDataProvider(&first_data); |
+ |
+ MockRead data_reads[] = { |
+ MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"), |
+ MockRead(ASYNC, OK), |
+ }; |
+ StaticSocketDataProvider second_data(data_reads, arraysize(data_reads), NULL, |
+ 0); |
+ session_deps_.socket_factory->AddSocketDataProvider(&second_data); |
+ |
+ std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
+ |
+ base::WeakPtr<HttpServerProperties> http_server_properties = |
+ session->http_server_properties(); |
+ AlternativeService alternative_service( |
+ AlternateProtocolFromNextProto(GetProtocol()), "", 444); |
+ base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); |
+ http_server_properties->SetAlternativeService( |
+ url::SchemeHostPort(request.url), alternative_service, expiration); |
+ |
+ std::unique_ptr<HttpTransaction> trans( |
+ new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
+ TestCompletionCallback callback; |
+ |
+ int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
+ // Alternative service is not used, request fails. |
+ EXPECT_EQ(ERR_CONNECTION_REFUSED, callback.GetResult(rv)); |
+} |
+ |
TEST_P(HttpNetworkTransactionTest, ClearAlternativeServices) { |
session_deps_.enable_alternative_service_with_different_host = false; |