| 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 9699 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9710 | 9710 |
| 9711 alternative_service_vector = | 9711 alternative_service_vector = |
| 9712 http_server_properties.GetAlternativeServices(test_server); | 9712 http_server_properties.GetAlternativeServices(test_server); |
| 9713 ASSERT_EQ(1u, alternative_service_vector.size()); | 9713 ASSERT_EQ(1u, alternative_service_vector.size()); |
| 9714 EXPECT_EQ(AlternateProtocolFromNextProto(GetProtocol()), | 9714 EXPECT_EQ(AlternateProtocolFromNextProto(GetProtocol()), |
| 9715 alternative_service_vector[0].protocol); | 9715 alternative_service_vector[0].protocol); |
| 9716 EXPECT_EQ("www.example.org", alternative_service_vector[0].host); | 9716 EXPECT_EQ("www.example.org", alternative_service_vector[0].host); |
| 9717 EXPECT_EQ(443, alternative_service_vector[0].port); | 9717 EXPECT_EQ(443, alternative_service_vector[0].port); |
| 9718 } | 9718 } |
| 9719 | 9719 |
| 9720 // Regression test for https://crbug.com/615497. |
| 9721 TEST_P(HttpNetworkTransactionTest, |
| 9722 DoNotParseAlternativeServiceHeaderOnInsecureRequest) { |
| 9723 session_deps_.enable_alternative_service_for_insecure_origins = false; |
| 9724 |
| 9725 std::string alternative_service_http_header = |
| 9726 GetAlternativeServiceHttpHeader(); |
| 9727 |
| 9728 MockRead data_reads[] = { |
| 9729 MockRead("HTTP/1.1 200 OK\r\n"), |
| 9730 MockRead(alternative_service_http_header.c_str()), |
| 9731 MockRead("\r\n"), |
| 9732 MockRead("hello world"), |
| 9733 MockRead(SYNCHRONOUS, OK), |
| 9734 }; |
| 9735 |
| 9736 HttpRequestInfo request; |
| 9737 request.method = "GET"; |
| 9738 request.url = GURL("http://www.example.org/"); |
| 9739 request.load_flags = 0; |
| 9740 |
| 9741 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); |
| 9742 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 9743 |
| 9744 TestCompletionCallback callback; |
| 9745 |
| 9746 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
| 9747 std::unique_ptr<HttpTransaction> trans( |
| 9748 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
| 9749 |
| 9750 url::SchemeHostPort test_server(request.url); |
| 9751 HttpServerProperties& http_server_properties = |
| 9752 *session->http_server_properties(); |
| 9753 AlternativeServiceVector alternative_service_vector = |
| 9754 http_server_properties.GetAlternativeServices(test_server); |
| 9755 EXPECT_TRUE(alternative_service_vector.empty()); |
| 9756 |
| 9757 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
| 9758 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 9759 EXPECT_EQ(OK, callback.WaitForResult()); |
| 9760 |
| 9761 const HttpResponseInfo* response = trans->GetResponseInfo(); |
| 9762 ASSERT_TRUE(response); |
| 9763 ASSERT_TRUE(response->headers); |
| 9764 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
| 9765 EXPECT_FALSE(response->was_fetched_via_spdy); |
| 9766 EXPECT_FALSE(response->was_npn_negotiated); |
| 9767 |
| 9768 std::string response_data; |
| 9769 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); |
| 9770 EXPECT_EQ("hello world", response_data); |
| 9771 |
| 9772 alternative_service_vector = |
| 9773 http_server_properties.GetAlternativeServices(test_server); |
| 9774 EXPECT_TRUE(alternative_service_vector.empty()); |
| 9775 } |
| 9776 |
| 9720 // HTTP/2 Alternative Services should be disabled if alternative service | 9777 // HTTP/2 Alternative Services should be disabled if alternative service |
| 9721 // hostname is different from that of origin. | 9778 // hostname is different from that of origin. |
| 9722 // TODO(bnc): Remove when https://crbug.com/615413 is fixed. | 9779 // TODO(bnc): Remove when https://crbug.com/615413 is fixed. |
| 9723 TEST_P(HttpNetworkTransactionTest, | 9780 TEST_P(HttpNetworkTransactionTest, |
| 9724 DisableHTTP2AlternativeServicesWithDifferentHost) { | 9781 DisableHTTP2AlternativeServicesWithDifferentHost) { |
| 9725 session_deps_.enable_alternative_service_with_different_host = true; | 9782 session_deps_.enable_alternative_service_with_different_host = true; |
| 9726 | 9783 |
| 9727 HttpRequestInfo request; | 9784 HttpRequestInfo request; |
| 9728 request.method = "GET"; | 9785 request.method = "GET"; |
| 9729 request.url = GURL("http://www.example.org/"); | 9786 request.url = GURL("http://www.example.org/"); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 9755 | 9812 |
| 9756 std::unique_ptr<HttpTransaction> trans( | 9813 std::unique_ptr<HttpTransaction> trans( |
| 9757 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | 9814 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
| 9758 TestCompletionCallback callback; | 9815 TestCompletionCallback callback; |
| 9759 | 9816 |
| 9760 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | 9817 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
| 9761 // Alternative service is not used, request fails. | 9818 // Alternative service is not used, request fails. |
| 9762 EXPECT_EQ(ERR_CONNECTION_REFUSED, callback.GetResult(rv)); | 9819 EXPECT_EQ(ERR_CONNECTION_REFUSED, callback.GetResult(rv)); |
| 9763 } | 9820 } |
| 9764 | 9821 |
| 9822 // Regression test for https://crbug.com/615497: |
| 9823 // Alternative Services should be disabled for http origin. |
| 9824 TEST_P(HttpNetworkTransactionTest, |
| 9825 DisableAlternativeServicesForInsecureOrigin) { |
| 9826 session_deps_.enable_alternative_service_for_insecure_origins = false; |
| 9827 |
| 9828 HttpRequestInfo request; |
| 9829 request.method = "GET"; |
| 9830 request.url = GURL("http://www.example.org/"); |
| 9831 request.load_flags = 0; |
| 9832 |
| 9833 MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED); |
| 9834 StaticSocketDataProvider first_data; |
| 9835 first_data.set_connect_data(mock_connect); |
| 9836 session_deps_.socket_factory->AddSocketDataProvider(&first_data); |
| 9837 |
| 9838 MockRead data_reads[] = { |
| 9839 MockRead("HTTP/1.1 200 OK\r\n\r\n"), MockRead("hello world"), |
| 9840 MockRead(ASYNC, OK), |
| 9841 }; |
| 9842 StaticSocketDataProvider second_data(data_reads, arraysize(data_reads), NULL, |
| 9843 0); |
| 9844 session_deps_.socket_factory->AddSocketDataProvider(&second_data); |
| 9845 |
| 9846 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
| 9847 |
| 9848 base::WeakPtr<HttpServerProperties> http_server_properties = |
| 9849 session->http_server_properties(); |
| 9850 AlternativeService alternative_service( |
| 9851 AlternateProtocolFromNextProto(GetProtocol()), "", 444); |
| 9852 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); |
| 9853 http_server_properties->SetAlternativeService( |
| 9854 url::SchemeHostPort(request.url), alternative_service, expiration); |
| 9855 |
| 9856 std::unique_ptr<HttpTransaction> trans( |
| 9857 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
| 9858 TestCompletionCallback callback; |
| 9859 |
| 9860 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
| 9861 // Alternative service is not used, request fails. |
| 9862 EXPECT_EQ(ERR_CONNECTION_REFUSED, callback.GetResult(rv)); |
| 9863 } |
| 9864 |
| 9765 TEST_P(HttpNetworkTransactionTest, ClearAlternativeServices) { | 9865 TEST_P(HttpNetworkTransactionTest, ClearAlternativeServices) { |
| 9766 session_deps_.parse_alternative_services = true; | 9866 session_deps_.parse_alternative_services = true; |
| 9767 session_deps_.enable_alternative_service_with_different_host = false; | 9867 session_deps_.enable_alternative_service_with_different_host = false; |
| 9768 | 9868 |
| 9769 // Set an alternative service for origin. | 9869 // Set an alternative service for origin. |
| 9770 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 9870 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
| 9771 HttpServerProperties& http_server_properties = | 9871 HttpServerProperties& http_server_properties = |
| 9772 *session->http_server_properties(); | 9872 *session->http_server_properties(); |
| 9773 url::SchemeHostPort test_server("http", "www.example.org", 80); | 9873 url::SchemeHostPort test_server("http", "www.example.org", 80); |
| 9774 AlternativeService alternative_service(QUIC, "", 80); | 9874 AlternativeService alternative_service(QUIC, "", 80); |
| (...skipping 6242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 16017 base::MessageLoop::current()->RunUntilIdle(); | 16117 base::MessageLoop::current()->RunUntilIdle(); |
| 16018 | 16118 |
| 16019 EXPECT_TRUE(trans.GetResponseInfo()->was_fetched_via_spdy); | 16119 EXPECT_TRUE(trans.GetResponseInfo()->was_fetched_via_spdy); |
| 16020 HttpRequestHeaders headers; | 16120 HttpRequestHeaders headers; |
| 16021 ASSERT_TRUE(trans.GetFullRequestHeaders(&headers)); | 16121 ASSERT_TRUE(trans.GetFullRequestHeaders(&headers)); |
| 16022 EXPECT_TRUE(headers.HasHeader(HttpRequestHeaders::kTokenBinding)); | 16122 EXPECT_TRUE(headers.HasHeader(HttpRequestHeaders::kTokenBinding)); |
| 16023 } | 16123 } |
| 16024 #endif // !defined(OS_IOS) | 16124 #endif // !defined(OS_IOS) |
| 16025 | 16125 |
| 16026 } // namespace net | 16126 } // namespace net |
| OLD | NEW |