OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/http/http_network_transaction.h" | 5 #include "net/http/http_network_transaction.h" |
6 | 6 |
7 #include <math.h> // ceil | 7 #include <math.h> // ceil |
8 #include <stdarg.h> | 8 #include <stdarg.h> |
9 #include <stdint.h> | 9 #include <stdint.h> |
10 | 10 |
(...skipping 9691 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9702 | 9702 |
9703 alternative_service_vector = | 9703 alternative_service_vector = |
9704 http_server_properties.GetAlternativeServices(test_server); | 9704 http_server_properties.GetAlternativeServices(test_server); |
9705 ASSERT_EQ(1u, alternative_service_vector.size()); | 9705 ASSERT_EQ(1u, alternative_service_vector.size()); |
9706 EXPECT_EQ(AlternateProtocolFromNextProto(GetProtocol()), | 9706 EXPECT_EQ(AlternateProtocolFromNextProto(GetProtocol()), |
9707 alternative_service_vector[0].protocol); | 9707 alternative_service_vector[0].protocol); |
9708 EXPECT_EQ("www.example.org", alternative_service_vector[0].host); | 9708 EXPECT_EQ("www.example.org", alternative_service_vector[0].host); |
9709 EXPECT_EQ(443, alternative_service_vector[0].port); | 9709 EXPECT_EQ(443, alternative_service_vector[0].port); |
9710 } | 9710 } |
9711 | 9711 |
| 9712 // Regression test for https://crbug.com/615497. |
| 9713 TEST_P(HttpNetworkTransactionTest, |
| 9714 DoNotParseAlternativeServiceHeaderOnInsecureRequest) { |
| 9715 session_deps_.enable_alternative_service_for_insecure_origins = false; |
| 9716 |
| 9717 std::string alternative_service_http_header = |
| 9718 GetAlternativeServiceHttpHeader(); |
| 9719 |
| 9720 MockRead data_reads[] = { |
| 9721 MockRead("HTTP/1.1 200 OK\r\n"), |
| 9722 MockRead(alternative_service_http_header.c_str()), |
| 9723 MockRead("\r\n"), |
| 9724 MockRead("hello world"), |
| 9725 MockRead(SYNCHRONOUS, OK), |
| 9726 }; |
| 9727 |
| 9728 HttpRequestInfo request; |
| 9729 request.method = "GET"; |
| 9730 request.url = GURL("http://www.example.org/"); |
| 9731 request.load_flags = 0; |
| 9732 |
| 9733 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); |
| 9734 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 9735 |
| 9736 TestCompletionCallback callback; |
| 9737 |
| 9738 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
| 9739 std::unique_ptr<HttpTransaction> trans( |
| 9740 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
| 9741 |
| 9742 url::SchemeHostPort test_server(request.url); |
| 9743 HttpServerProperties& http_server_properties = |
| 9744 *session->http_server_properties(); |
| 9745 AlternativeServiceVector alternative_service_vector = |
| 9746 http_server_properties.GetAlternativeServices(test_server); |
| 9747 EXPECT_TRUE(alternative_service_vector.empty()); |
| 9748 |
| 9749 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
| 9750 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 9751 EXPECT_EQ(OK, callback.WaitForResult()); |
| 9752 |
| 9753 const HttpResponseInfo* response = trans->GetResponseInfo(); |
| 9754 ASSERT_TRUE(response); |
| 9755 ASSERT_TRUE(response->headers); |
| 9756 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
| 9757 EXPECT_FALSE(response->was_fetched_via_spdy); |
| 9758 EXPECT_FALSE(response->was_npn_negotiated); |
| 9759 |
| 9760 std::string response_data; |
| 9761 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); |
| 9762 EXPECT_EQ("hello world", response_data); |
| 9763 |
| 9764 alternative_service_vector = |
| 9765 http_server_properties.GetAlternativeServices(test_server); |
| 9766 EXPECT_TRUE(alternative_service_vector.empty()); |
| 9767 } |
| 9768 |
9712 // HTTP/2 Alternative Services should be disabled if alternative service | 9769 // HTTP/2 Alternative Services should be disabled if alternative service |
9713 // hostname is different from that of origin. | 9770 // hostname is different from that of origin. |
9714 // TODO(bnc): Remove when https://crbug.com/615413 is fixed. | 9771 // TODO(bnc): Remove when https://crbug.com/615413 is fixed. |
9715 TEST_P(HttpNetworkTransactionTest, | 9772 TEST_P(HttpNetworkTransactionTest, |
9716 DisableHTTP2AlternativeServicesWithDifferentHost) { | 9773 DisableHTTP2AlternativeServicesWithDifferentHost) { |
9717 session_deps_.enable_alternative_service_with_different_host = true; | 9774 session_deps_.enable_alternative_service_with_different_host = true; |
9718 | 9775 |
9719 HttpRequestInfo request; | 9776 HttpRequestInfo request; |
9720 request.method = "GET"; | 9777 request.method = "GET"; |
9721 request.url = GURL("http://www.example.org/"); | 9778 request.url = GURL("http://www.example.org/"); |
(...skipping 25 matching lines...) Expand all Loading... |
9747 | 9804 |
9748 std::unique_ptr<HttpTransaction> trans( | 9805 std::unique_ptr<HttpTransaction> trans( |
9749 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 9806 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
9750 TestCompletionCallback callback; | 9807 TestCompletionCallback callback; |
9751 | 9808 |
9752 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 9809 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
9753 // Alternative service is not used, request fails. | 9810 // Alternative service is not used, request fails. |
9754 EXPECT_EQ(ERR_CONNECTION_REFUSED, callback.GetResult(rv)); | 9811 EXPECT_EQ(ERR_CONNECTION_REFUSED, callback.GetResult(rv)); |
9755 } | 9812 } |
9756 | 9813 |
| 9814 // Regression test for https://crbug.com/615497: |
| 9815 // Alternative Services should be disabled for http origin. |
| 9816 TEST_P(HttpNetworkTransactionTest, |
| 9817 DisableAlternativeServicesForInsecureOrigin) { |
| 9818 session_deps_.enable_alternative_service_for_insecure_origins = false; |
| 9819 |
| 9820 HttpRequestInfo request; |
| 9821 request.method = "GET"; |
| 9822 request.url = GURL("http://www.example.org/"); |
| 9823 request.load_flags = 0; |
| 9824 |
| 9825 MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED); |
| 9826 StaticSocketDataProvider first_data; |
| 9827 first_data.set_connect_data(mock_connect); |
| 9828 session_deps_.socket_factory->AddSocketDataProvider(&first_data); |
| 9829 |
| 9830 MockRead data_reads[] = { |
| 9831 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"), |
| 9832 MockRead(ASYNC, OK), |
| 9833 }; |
| 9834 StaticSocketDataProvider second_data(data_reads, arraysize(data_reads), NULL, |
| 9835 0); |
| 9836 session_deps_.socket_factory->AddSocketDataProvider(&second_data); |
| 9837 |
| 9838 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
| 9839 |
| 9840 base::WeakPtr<HttpServerProperties> http_server_properties = |
| 9841 session->http_server_properties(); |
| 9842 AlternativeService alternative_service( |
| 9843 AlternateProtocolFromNextProto(GetProtocol()), "", 444); |
| 9844 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); |
| 9845 http_server_properties->SetAlternativeService( |
| 9846 url::SchemeHostPort(request.url), alternative_service, expiration); |
| 9847 |
| 9848 std::unique_ptr<HttpTransaction> trans( |
| 9849 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
| 9850 TestCompletionCallback callback; |
| 9851 |
| 9852 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
| 9853 // Alternative service is not used, request fails. |
| 9854 EXPECT_EQ(ERR_CONNECTION_REFUSED, callback.GetResult(rv)); |
| 9855 } |
| 9856 |
9757 TEST_P(HttpNetworkTransactionTest, ClearAlternativeServices) { | 9857 TEST_P(HttpNetworkTransactionTest, ClearAlternativeServices) { |
9758 session_deps_.enable_alternative_service_with_different_host = false; | 9858 session_deps_.enable_alternative_service_with_different_host = false; |
9759 | 9859 |
9760 // Set an alternative service for origin. | 9860 // Set an alternative service for origin. |
9761 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 9861 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
9762 HttpServerProperties& http_server_properties = | 9862 HttpServerProperties& http_server_properties = |
9763 *session->http_server_properties(); | 9863 *session->http_server_properties(); |
9764 url::SchemeHostPort test_server("http", "www.example.org", 80); | 9864 url::SchemeHostPort test_server("http", "www.example.org", 80); |
9765 AlternativeService alternative_service(QUIC, "", 80); | 9865 AlternativeService alternative_service(QUIC, "", 80); |
9766 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); | 9866 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); |
(...skipping 5966 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15733 base::MessageLoop::current()->RunUntilIdle(); | 15833 base::MessageLoop::current()->RunUntilIdle(); |
15734 | 15834 |
15735 EXPECT_TRUE(trans.GetResponseInfo()->was_fetched_via_spdy); | 15835 EXPECT_TRUE(trans.GetResponseInfo()->was_fetched_via_spdy); |
15736 HttpRequestHeaders headers; | 15836 HttpRequestHeaders headers; |
15737 ASSERT_TRUE(trans.GetFullRequestHeaders(&headers)); | 15837 ASSERT_TRUE(trans.GetFullRequestHeaders(&headers)); |
15738 EXPECT_TRUE(headers.HasHeader(HttpRequestHeaders::kTokenBinding)); | 15838 EXPECT_TRUE(headers.HasHeader(HttpRequestHeaders::kTokenBinding)); |
15739 } | 15839 } |
15740 #endif // !defined(OS_IOS) | 15840 #endif // !defined(OS_IOS) |
15741 | 15841 |
15742 } // namespace net | 15842 } // namespace net |
OLD | NEW |