OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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_stream_factory_impl.h" | 5 #include "net/http/http_stream_factory_impl.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 #include <string> | 8 #include <string> |
9 #include <utility> | 9 #include <utility> |
10 #include <vector> | 10 #include <vector> |
11 | 11 |
12 #include "base/compiler_specific.h" | 12 #include "base/compiler_specific.h" |
13 #include "base/macros.h" | 13 #include "base/macros.h" |
14 #include "base/run_loop.h" | 14 #include "base/run_loop.h" |
15 #include "net/base/port_util.h" | 15 #include "net/base/port_util.h" |
16 #include "net/base/test_completion_callback.h" | 16 #include "net/base/test_completion_callback.h" |
| 17 #include "net/base/test_proxy_delegate.h" |
17 #include "net/cert/ct_policy_enforcer.h" | 18 #include "net/cert/ct_policy_enforcer.h" |
18 #include "net/cert/mock_cert_verifier.h" | 19 #include "net/cert/mock_cert_verifier.h" |
19 #include "net/cert/multi_log_ct_verifier.h" | 20 #include "net/cert/multi_log_ct_verifier.h" |
20 #include "net/dns/mock_host_resolver.h" | 21 #include "net/dns/mock_host_resolver.h" |
21 #include "net/http/bidirectional_stream_impl.h" | 22 #include "net/http/bidirectional_stream_impl.h" |
22 #include "net/http/bidirectional_stream_request_info.h" | 23 #include "net/http/bidirectional_stream_request_info.h" |
23 #include "net/http/http_auth_handler_factory.h" | 24 #include "net/http/http_auth_handler_factory.h" |
24 #include "net/http/http_network_session.h" | 25 #include "net/http/http_network_session.h" |
25 #include "net/http/http_network_session_peer.h" | 26 #include "net/http/http_network_session_peer.h" |
26 #include "net/http/http_network_transaction.h" | 27 #include "net/http/http_network_transaction.h" |
(...skipping 650 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
677 waiter.WaitForStream(); | 678 waiter.WaitForStream(); |
678 | 679 |
679 // The proxy that failed should now be known to the proxy_service as bad. | 680 // The proxy that failed should now be known to the proxy_service as bad. |
680 const ProxyRetryInfoMap& retry_info = | 681 const ProxyRetryInfoMap& retry_info = |
681 session->proxy_service()->proxy_retry_info(); | 682 session->proxy_service()->proxy_retry_info(); |
682 EXPECT_EQ(1u, retry_info.size()); | 683 EXPECT_EQ(1u, retry_info.size()); |
683 ProxyRetryInfoMap::const_iterator iter = retry_info.find("bad:99"); | 684 ProxyRetryInfoMap::const_iterator iter = retry_info.find("bad:99"); |
684 EXPECT_TRUE(iter != retry_info.end()); | 685 EXPECT_TRUE(iter != retry_info.end()); |
685 } | 686 } |
686 | 687 |
687 TEST_F(HttpStreamFactoryTest, UnreachableQuicProxyMarkedAsBad) { | 688 // List of errors that are used in the tests related to QUIC proxy. |
688 const int mock_error[] = {ERR_PROXY_CONNECTION_FAILED, | 689 const int quic_proxy_test_mock_errors[] = { |
689 ERR_NAME_NOT_RESOLVED, | 690 ERR_PROXY_CONNECTION_FAILED, |
690 ERR_INTERNET_DISCONNECTED, | 691 ERR_NAME_NOT_RESOLVED, |
691 ERR_ADDRESS_UNREACHABLE, | 692 ERR_INTERNET_DISCONNECTED, |
692 ERR_CONNECTION_CLOSED, | 693 ERR_ADDRESS_UNREACHABLE, |
693 ERR_CONNECTION_TIMED_OUT, | 694 ERR_CONNECTION_CLOSED, |
694 ERR_CONNECTION_RESET, | 695 ERR_CONNECTION_TIMED_OUT, |
695 ERR_CONNECTION_REFUSED, | 696 ERR_CONNECTION_RESET, |
696 ERR_CONNECTION_ABORTED, | 697 ERR_CONNECTION_REFUSED, |
697 ERR_TIMED_OUT, | 698 ERR_CONNECTION_ABORTED, |
698 ERR_TUNNEL_CONNECTION_FAILED, | 699 ERR_TIMED_OUT, |
699 ERR_SOCKS_CONNECTION_FAILED, | 700 ERR_TUNNEL_CONNECTION_FAILED, |
700 ERR_PROXY_CERTIFICATE_INVALID, | 701 ERR_SOCKS_CONNECTION_FAILED, |
701 ERR_QUIC_PROTOCOL_ERROR, | 702 ERR_PROXY_CERTIFICATE_INVALID, |
702 ERR_QUIC_HANDSHAKE_FAILED, | 703 ERR_QUIC_PROTOCOL_ERROR, |
703 ERR_SSL_PROTOCOL_ERROR, | 704 ERR_QUIC_HANDSHAKE_FAILED, |
704 ERR_MSG_TOO_BIG}; | 705 ERR_SSL_PROTOCOL_ERROR, |
705 for (size_t i = 0; i < arraysize(mock_error); ++i) { | 706 ERR_MSG_TOO_BIG, |
| 707 }; |
| 708 |
| 709 // Tests that a bad QUIC proxy is added to the list of bad proxies. |
| 710 TEST_F(HttpStreamFactoryTest, QuicProxyMarkedAsBad) { |
| 711 for (size_t i = 0; i < arraysize(quic_proxy_test_mock_errors); ++i) { |
706 std::unique_ptr<ProxyService> proxy_service; | 712 std::unique_ptr<ProxyService> proxy_service; |
707 proxy_service = | 713 proxy_service = |
708 ProxyService::CreateFixedFromPacResult("QUIC bad:99; DIRECT"); | 714 ProxyService::CreateFixedFromPacResult("QUIC bad:99; DIRECT"); |
709 | 715 |
710 HttpNetworkSession::Params params; | 716 HttpNetworkSession::Params params; |
711 params.enable_quic = true; | 717 params.enable_quic = true; |
712 params.quic_disable_preconnect_if_0rtt = false; | 718 params.quic_disable_preconnect_if_0rtt = false; |
713 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service( | 719 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service( |
714 new SSLConfigServiceDefaults); | 720 new SSLConfigServiceDefaults); |
715 HttpServerPropertiesImpl http_server_properties; | 721 HttpServerPropertiesImpl http_server_properties; |
(...skipping 10 matching lines...) Expand all Loading... |
726 CTPolicyEnforcer ct_policy_enforcer; | 732 CTPolicyEnforcer ct_policy_enforcer; |
727 params.ct_policy_enforcer = &ct_policy_enforcer; | 733 params.ct_policy_enforcer = &ct_policy_enforcer; |
728 params.proxy_service = proxy_service.get(); | 734 params.proxy_service = proxy_service.get(); |
729 params.ssl_config_service = ssl_config_service.get(); | 735 params.ssl_config_service = ssl_config_service.get(); |
730 params.http_server_properties = &http_server_properties; | 736 params.http_server_properties = &http_server_properties; |
731 | 737 |
732 std::unique_ptr<HttpNetworkSession> session(new HttpNetworkSession(params)); | 738 std::unique_ptr<HttpNetworkSession> session(new HttpNetworkSession(params)); |
733 session->quic_stream_factory()->set_require_confirmation(false); | 739 session->quic_stream_factory()->set_require_confirmation(false); |
734 | 740 |
735 StaticSocketDataProvider socket_data1; | 741 StaticSocketDataProvider socket_data1; |
736 socket_data1.set_connect_data(MockConnect(ASYNC, mock_error[i])); | 742 socket_data1.set_connect_data( |
| 743 MockConnect(ASYNC, quic_proxy_test_mock_errors[i])); |
737 socket_factory.AddSocketDataProvider(&socket_data1); | 744 socket_factory.AddSocketDataProvider(&socket_data1); |
738 | 745 |
739 // Second connection attempt succeeds. | 746 // Second connection attempt succeeds. |
740 StaticSocketDataProvider socket_data2; | 747 StaticSocketDataProvider socket_data2; |
741 socket_data2.set_connect_data(MockConnect(ASYNC, OK)); | 748 socket_data2.set_connect_data(MockConnect(ASYNC, OK)); |
742 socket_factory.AddSocketDataProvider(&socket_data2); | 749 socket_factory.AddSocketDataProvider(&socket_data2); |
743 | 750 |
744 // Now request a stream. It should succeed using the second proxy in the | 751 // Now request a stream. It should succeed using the second proxy in the |
745 // list. | 752 // list. |
746 HttpRequestInfo request_info; | 753 HttpRequestInfo request_info; |
747 request_info.method = "GET"; | 754 request_info.method = "GET"; |
748 request_info.url = GURL("http://www.google.com"); | 755 request_info.url = GURL("http://www.google.com"); |
749 | 756 |
750 SSLConfig ssl_config; | 757 SSLConfig ssl_config; |
751 StreamRequestWaiter waiter; | 758 StreamRequestWaiter waiter; |
752 std::unique_ptr<HttpStreamRequest> request( | 759 std::unique_ptr<HttpStreamRequest> request( |
753 session->http_stream_factory()->RequestStream( | 760 session->http_stream_factory()->RequestStream( |
754 request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, &waiter, | 761 request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, &waiter, |
755 BoundNetLog())); | 762 BoundNetLog())); |
756 waiter.WaitForStream(); | 763 waiter.WaitForStream(); |
757 | 764 |
758 // The proxy that failed should now be known to the proxy_service as bad. | 765 // The proxy that failed should now be known to the proxy_service as bad. |
759 const ProxyRetryInfoMap& retry_info = | 766 const ProxyRetryInfoMap& retry_info = |
760 session->proxy_service()->proxy_retry_info(); | 767 session->proxy_service()->proxy_retry_info(); |
761 EXPECT_EQ(1u, retry_info.size()) << mock_error[i]; | 768 EXPECT_EQ(1u, retry_info.size()) << quic_proxy_test_mock_errors[i]; |
762 EXPECT_TRUE(waiter.used_proxy_info().is_direct()); | 769 EXPECT_TRUE(waiter.used_proxy_info().is_direct()); |
763 | 770 |
764 ProxyRetryInfoMap::const_iterator iter = retry_info.find("quic://bad:99"); | 771 ProxyRetryInfoMap::const_iterator iter = retry_info.find("quic://bad:99"); |
765 EXPECT_TRUE(iter != retry_info.end()) << mock_error[i]; | 772 EXPECT_TRUE(iter != retry_info.end()) << quic_proxy_test_mock_errors[i]; |
766 } | 773 } |
767 } | 774 } |
768 | 775 |
769 // BidirectionalStreamImpl::Delegate to wait until response headers are | 776 // BidirectionalStreamImpl::Delegate to wait until response headers are |
770 // received. | 777 // received. |
771 class TestBidirectionalDelegate : public BidirectionalStreamImpl::Delegate { | 778 class TestBidirectionalDelegate : public BidirectionalStreamImpl::Delegate { |
772 public: | 779 public: |
773 void WaitUntilDone() { loop_.Run(); } | 780 void WaitUntilDone() { loop_.Run(); } |
774 | 781 |
775 const SpdyHeaderBlock& response_headers() const { return response_headers_; } | 782 const SpdyHeaderBlock& response_headers() const { return response_headers_; } |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
823 } | 830 } |
824 | 831 |
825 private: | 832 private: |
826 std::vector<QuicEncryptedPacket*> packets_; | 833 std::vector<QuicEncryptedPacket*> packets_; |
827 std::vector<MockWrite> writes_; | 834 std::vector<MockWrite> writes_; |
828 std::vector<MockRead> reads_; | 835 std::vector<MockRead> reads_; |
829 size_t packet_number_; | 836 size_t packet_number_; |
830 std::unique_ptr<SequencedSocketData> socket_data_; | 837 std::unique_ptr<SequencedSocketData> socket_data_; |
831 }; | 838 }; |
832 | 839 |
| 840 void SetupForQuicAlternativeProxyTest( |
| 841 HttpNetworkSession::Params* params, |
| 842 MockClientSocketFactory* socket_factory, |
| 843 ProxyService* proxy_service, |
| 844 TestProxyDelegate* test_proxy_delegate, |
| 845 HttpServerPropertiesImpl* http_server_properties, |
| 846 MockCertVerifier* cert_verifier, |
| 847 CTPolicyEnforcer* ct_policy_enforcer, |
| 848 MultiLogCTVerifier* ct_verifier, |
| 849 SSLConfigServiceDefaults* ssl_config_service, |
| 850 MockHostResolver* host_resolver, |
| 851 TransportSecurityState* transport_security_state, |
| 852 bool set_alternative_proxy_server) { |
| 853 params->enable_quic = true; |
| 854 params->quic_disable_preconnect_if_0rtt = false; |
| 855 params->client_socket_factory = socket_factory; |
| 856 params->host_resolver = host_resolver; |
| 857 params->transport_security_state = transport_security_state; |
| 858 params->proxy_service = proxy_service; |
| 859 params->ssl_config_service = ssl_config_service; |
| 860 params->http_server_properties = http_server_properties; |
| 861 params->cert_verifier = cert_verifier; |
| 862 params->ct_policy_enforcer = ct_policy_enforcer; |
| 863 params->cert_transparency_verifier = ct_verifier; |
| 864 |
| 865 if (set_alternative_proxy_server) { |
| 866 test_proxy_delegate->SetAlternativeProxy( |
| 867 ProxyServer::FromPacString("QUIC badproxy:99")); |
| 868 } |
| 869 params->proxy_delegate = test_proxy_delegate; |
| 870 } |
| 871 |
833 } // namespace | 872 } // namespace |
834 | 873 |
| 874 // Tests that a HTTPS proxy that supports QUIC alternative proxy server is |
| 875 // marked as bad if connecting to both the default proxy and the alternative |
| 876 // proxy is unsuccessful. |
| 877 TEST_F(HttpStreamFactoryTest, WithQUICAlternativeProxyMarkedAsBad) { |
| 878 const bool set_alternative_proxy_server_values[] = { |
| 879 false, true, |
| 880 }; |
| 881 |
| 882 for (auto mock_error : quic_proxy_test_mock_errors) { |
| 883 for (auto set_alternative_proxy_server : |
| 884 set_alternative_proxy_server_values) { |
| 885 HttpNetworkSession::Params params; |
| 886 MockClientSocketFactory socket_factory; |
| 887 std::unique_ptr<ProxyService> proxy_service = |
| 888 ProxyService::CreateFixedFromPacResult( |
| 889 "HTTPS badproxy:99; HTTPS badfallbackproxy:98; DIRECT"); |
| 890 TestProxyDelegate test_proxy_delegate; |
| 891 HttpServerPropertiesImpl http_server_properties; |
| 892 MockCertVerifier cert_verifier; |
| 893 CTPolicyEnforcer ct_policy_enforcer; |
| 894 MultiLogCTVerifier ct_verifier; |
| 895 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service( |
| 896 new SSLConfigServiceDefaults); |
| 897 MockHostResolver host_resolver; |
| 898 TransportSecurityState transport_security_state; |
| 899 SetupForQuicAlternativeProxyTest( |
| 900 ¶ms, &socket_factory, proxy_service.get(), &test_proxy_delegate, |
| 901 &http_server_properties, &cert_verifier, &ct_policy_enforcer, |
| 902 &ct_verifier, ssl_config_service.get(), &host_resolver, |
| 903 &transport_security_state, set_alternative_proxy_server); |
| 904 |
| 905 std::unique_ptr<HttpNetworkSession> session( |
| 906 new HttpNetworkSession(params)); |
| 907 |
| 908 // Before starting the test, verify that there are no proxies marked as |
| 909 // bad. |
| 910 ASSERT_TRUE(session->proxy_service()->proxy_retry_info().empty()) |
| 911 << mock_error; |
| 912 |
| 913 StaticSocketDataProvider socket_data_proxy_main_job; |
| 914 socket_data_proxy_main_job.set_connect_data( |
| 915 MockConnect(ASYNC, mock_error)); |
| 916 socket_factory.AddSocketDataProvider(&socket_data_proxy_main_job); |
| 917 |
| 918 StaticSocketDataProvider socket_data_proxy_alternate_job; |
| 919 if (set_alternative_proxy_server) { |
| 920 // Mock socket used by the QUIC job. |
| 921 socket_data_proxy_alternate_job.set_connect_data( |
| 922 MockConnect(ASYNC, mock_error)); |
| 923 socket_factory.AddSocketDataProvider(&socket_data_proxy_alternate_job); |
| 924 } |
| 925 |
| 926 // When retrying the job using the second proxy (badFallback:98), |
| 927 // alternative job must not be created. So, socket data for only the |
| 928 // main job is needed. |
| 929 StaticSocketDataProvider socket_data_proxy_main_job_2; |
| 930 socket_data_proxy_main_job_2.set_connect_data( |
| 931 MockConnect(ASYNC, mock_error)); |
| 932 socket_factory.AddSocketDataProvider(&socket_data_proxy_main_job_2); |
| 933 |
| 934 // First request would use DIRECT, and succeed. |
| 935 StaticSocketDataProvider socket_data_direct_first_request; |
| 936 socket_data_direct_first_request.set_connect_data(MockConnect(ASYNC, OK)); |
| 937 socket_factory.AddSocketDataProvider(&socket_data_direct_first_request); |
| 938 |
| 939 // Second request would use DIRECT, and succeed. |
| 940 StaticSocketDataProvider socket_data_direct_second_request; |
| 941 socket_data_direct_second_request.set_connect_data( |
| 942 MockConnect(ASYNC, OK)); |
| 943 socket_factory.AddSocketDataProvider(&socket_data_direct_second_request); |
| 944 |
| 945 // Now request a stream. It should succeed using the DIRECT. |
| 946 HttpRequestInfo request_info; |
| 947 request_info.method = "GET"; |
| 948 request_info.url = GURL("http://www.google.com"); |
| 949 |
| 950 SSLConfig ssl_config; |
| 951 StreamRequestWaiter waiter; |
| 952 |
| 953 EXPECT_EQ(set_alternative_proxy_server, |
| 954 test_proxy_delegate.alternative_proxy_server().is_quic()); |
| 955 |
| 956 // Start two requests. The first request should consume data from |
| 957 // |socket_data_proxy_main_job|, |
| 958 // |socket_data_proxy_alternate_job| and |
| 959 // |socket_data_direct_first_request|. The second request should consume |
| 960 // data from |socket_data_direct_second_request|. |
| 961 for (size_t i = 0; i < 2; ++i) { |
| 962 std::unique_ptr<HttpStreamRequest> request( |
| 963 session->http_stream_factory()->RequestStream( |
| 964 request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, &waiter, |
| 965 BoundNetLog())); |
| 966 waiter.WaitForStream(); |
| 967 |
| 968 // The proxy that failed should now be known to the proxy_service as |
| 969 // bad. |
| 970 const ProxyRetryInfoMap retry_info = |
| 971 session->proxy_service()->proxy_retry_info(); |
| 972 EXPECT_EQ(2u, retry_info.size()) << mock_error; |
| 973 |
| 974 // Verify that request was fetched without proxy. |
| 975 EXPECT_TRUE(waiter.used_proxy_info().is_direct()); |
| 976 |
| 977 EXPECT_NE(retry_info.end(), retry_info.find("https://badproxy:99")); |
| 978 EXPECT_NE(retry_info.end(), |
| 979 retry_info.find("https://badfallbackproxy:98")); |
| 980 |
| 981 // If alternative proxy server was specified, it should have been marked |
| 982 // as invalid so that it is not used for subsequent requests. |
| 983 EXPECT_FALSE(test_proxy_delegate.alternative_proxy_server().is_valid()); |
| 984 } |
| 985 } |
| 986 } |
| 987 } |
| 988 |
| 989 // Tests that a HTTPS proxy that supports QUIC alternative proxy server is |
| 990 // not marked as bad if only the alternative proxy server job fails. |
| 991 TEST_F(HttpStreamFactoryTest, WithQUICAlternativeProxyNotMarkedAsBad) { |
| 992 for (auto mock_error : quic_proxy_test_mock_errors) { |
| 993 HttpNetworkSession::Params params; |
| 994 MockClientSocketFactory socket_factory; |
| 995 std::unique_ptr<ProxyService> proxy_service = |
| 996 ProxyService::CreateFixedFromPacResult("HTTPS badproxy:99; DIRECT"); |
| 997 TestProxyDelegate test_proxy_delegate; |
| 998 HttpServerPropertiesImpl http_server_properties; |
| 999 MockCertVerifier cert_verifier; |
| 1000 CTPolicyEnforcer ct_policy_enforcer; |
| 1001 MultiLogCTVerifier ct_verifier; |
| 1002 |
| 1003 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service( |
| 1004 new SSLConfigServiceDefaults); |
| 1005 MockHostResolver host_resolver; |
| 1006 TransportSecurityState transport_security_state; |
| 1007 |
| 1008 SetupForQuicAlternativeProxyTest( |
| 1009 ¶ms, &socket_factory, proxy_service.get(), &test_proxy_delegate, |
| 1010 &http_server_properties, &cert_verifier, &ct_policy_enforcer, |
| 1011 &ct_verifier, ssl_config_service.get(), &host_resolver, |
| 1012 &transport_security_state, true); |
| 1013 |
| 1014 HostPortPair host_port_pair("badproxy", 99); |
| 1015 std::unique_ptr<HttpNetworkSession> session(new HttpNetworkSession(params)); |
| 1016 |
| 1017 // Before starting the test, verify that there are no proxies marked as |
| 1018 // bad. |
| 1019 ASSERT_TRUE(session->proxy_service()->proxy_retry_info().empty()) |
| 1020 << mock_error; |
| 1021 |
| 1022 StaticSocketDataProvider socket_data_proxy_main_job; |
| 1023 socket_data_proxy_main_job.set_connect_data(MockConnect(ASYNC, mock_error)); |
| 1024 socket_factory.AddSocketDataProvider(&socket_data_proxy_main_job); |
| 1025 |
| 1026 SSLSocketDataProvider ssl_data(ASYNC, OK); |
| 1027 |
| 1028 // Next connection attempt would use HTTPS proxy, and succeed. |
| 1029 StaticSocketDataProvider socket_data_https_first; |
| 1030 socket_data_https_first.set_connect_data(MockConnect(ASYNC, OK)); |
| 1031 socket_factory.AddSocketDataProvider(&socket_data_https_first); |
| 1032 socket_factory.AddSSLSocketDataProvider(&ssl_data); |
| 1033 |
| 1034 // Next connection attempt would use HTTPS proxy, and succeed. |
| 1035 StaticSocketDataProvider socket_data_https_second; |
| 1036 socket_data_https_second.set_connect_data(MockConnect(ASYNC, OK)); |
| 1037 socket_factory.AddSocketDataProvider(&socket_data_https_second); |
| 1038 socket_factory.AddSSLSocketDataProvider(&ssl_data); |
| 1039 |
| 1040 // Now request a stream. It should succeed using the second proxy in the |
| 1041 // list. |
| 1042 HttpRequestInfo request_info; |
| 1043 request_info.method = "GET"; |
| 1044 request_info.url = GURL("http://www.google.com"); |
| 1045 |
| 1046 SSLConfig ssl_config; |
| 1047 StreamRequestWaiter waiter; |
| 1048 |
| 1049 EXPECT_TRUE(test_proxy_delegate.alternative_proxy_server().is_quic()); |
| 1050 |
| 1051 // Start two requests. The first request should consume data from |
| 1052 // |socket_data_proxy_main_job| and |socket_data_https_first|. |
| 1053 // The second request should consume data from |socket_data_https_second|. |
| 1054 for (size_t i = 0; i < 2; ++i) { |
| 1055 std::unique_ptr<HttpStreamRequest> request( |
| 1056 session->http_stream_factory()->RequestStream( |
| 1057 request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, &waiter, |
| 1058 BoundNetLog())); |
| 1059 waiter.WaitForStream(); |
| 1060 |
| 1061 // The proxy that failed should now be known to the proxy_service as |
| 1062 // bad. |
| 1063 const ProxyRetryInfoMap retry_info = |
| 1064 session->proxy_service()->proxy_retry_info(); |
| 1065 // Proxy should not be marked as bad. |
| 1066 EXPECT_EQ(0u, retry_info.size()) << mock_error; |
| 1067 // Verify that request was fetched using proxy. |
| 1068 EXPECT_TRUE(waiter.used_proxy_info().is_https()); |
| 1069 EXPECT_TRUE(host_port_pair.Equals( |
| 1070 waiter.used_proxy_info().proxy_server().host_port_pair())); |
| 1071 net::ProxyServer proxy_server; |
| 1072 |
| 1073 // Alternative proxy server should be marked as invalid so that it is |
| 1074 // not used for subsequent requests. |
| 1075 EXPECT_FALSE(test_proxy_delegate.alternative_proxy_server().is_quic()); |
| 1076 } |
| 1077 } |
| 1078 } |
| 1079 |
835 TEST_F(HttpStreamFactoryTest, QuicLossyProxyMarkedAsBad) { | 1080 TEST_F(HttpStreamFactoryTest, QuicLossyProxyMarkedAsBad) { |
836 // Checks if a | 1081 // Checks if a |
837 std::unique_ptr<ProxyService> proxy_service; | 1082 std::unique_ptr<ProxyService> proxy_service; |
838 proxy_service = ProxyService::CreateFixedFromPacResult("QUIC bad:99; DIRECT"); | 1083 proxy_service = ProxyService::CreateFixedFromPacResult("QUIC bad:99; DIRECT"); |
839 | 1084 |
840 HttpNetworkSession::Params params; | 1085 HttpNetworkSession::Params params; |
841 params.enable_quic = true; | 1086 params.enable_quic = true; |
842 params.quic_disable_preconnect_if_0rtt = false; | 1087 params.quic_disable_preconnect_if_0rtt = false; |
843 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service( | 1088 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service( |
844 new SSLConfigServiceDefaults); | 1089 new SSLConfigServiceDefaults); |
(...skipping 1211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2056 session->GetTransportSocketPool( | 2301 session->GetTransportSocketPool( |
2057 HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); | 2302 HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); |
2058 EXPECT_EQ(1, GetSocketPoolGroupCount( | 2303 EXPECT_EQ(1, GetSocketPoolGroupCount( |
2059 session->GetSSLSocketPool(HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); | 2304 session->GetSSLSocketPool(HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); |
2060 EXPECT_TRUE(waiter.used_proxy_info().is_direct()); | 2305 EXPECT_TRUE(waiter.used_proxy_info().is_direct()); |
2061 } | 2306 } |
2062 | 2307 |
2063 } // namespace | 2308 } // namespace |
2064 | 2309 |
2065 } // namespace net | 2310 } // namespace net |
OLD | NEW |