| 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/proxy/proxy_service.h" | 5 #include "net/proxy/proxy_service.h" |
| 6 | 6 |
| 7 #include <cstdarg> | 7 #include <cstdarg> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include "base/format_macros.h" | 11 #include "base/format_macros.h" |
| 12 #include "base/logging.h" | 12 #include "base/logging.h" |
| 13 #include "base/macros.h" | 13 #include "base/macros.h" |
| 14 #include "base/memory/ptr_util.h" | 14 #include "base/memory/ptr_util.h" |
| 15 #include "base/run_loop.h" |
| 15 #include "base/strings/string_util.h" | 16 #include "base/strings/string_util.h" |
| 16 #include "base/strings/utf_string_conversions.h" | 17 #include "base/strings/utf_string_conversions.h" |
| 17 #include "net/base/load_flags.h" | 18 #include "net/base/load_flags.h" |
| 18 #include "net/base/net_errors.h" | 19 #include "net/base/net_errors.h" |
| 19 #include "net/base/proxy_delegate.h" | 20 #include "net/base/proxy_delegate.h" |
| 20 #include "net/base/test_completion_callback.h" | 21 #include "net/base/test_completion_callback.h" |
| 21 #include "net/log/net_log.h" | 22 #include "net/log/net_log.h" |
| 22 #include "net/log/test_net_log.h" | 23 #include "net/log/test_net_log.h" |
| 23 #include "net/log/test_net_log_entry.h" | 24 #include "net/log/test_net_log_entry.h" |
| 24 #include "net/log/test_net_log_util.h" | 25 #include "net/log/test_net_log_util.h" |
| (...skipping 2747 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2772 resolver.pending_requests()[0]->CompleteNow(OK); | 2773 resolver.pending_requests()[0]->CompleteNow(OK); |
| 2773 | 2774 |
| 2774 // Wait for completion callback, and verify that the request ran as expected. | 2775 // Wait for completion callback, and verify that the request ran as expected. |
| 2775 EXPECT_EQ(OK, callback1.WaitForResult()); | 2776 EXPECT_EQ(OK, callback1.WaitForResult()); |
| 2776 EXPECT_EQ("request1:80", info1.proxy_server().ToURI()); | 2777 EXPECT_EQ("request1:80", info1.proxy_server().ToURI()); |
| 2777 | 2778 |
| 2778 // Now simluate a change in the network. The ProxyConfigService is still | 2779 // Now simluate a change in the network. The ProxyConfigService is still |
| 2779 // going to return the same PAC URL as before, but this URL needs to be | 2780 // going to return the same PAC URL as before, but this URL needs to be |
| 2780 // refetched on the new network. | 2781 // refetched on the new network. |
| 2781 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); | 2782 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); |
| 2782 base::MessageLoop::current()->RunUntilIdle(); // Notification happens async. | 2783 base::RunLoop().RunUntilIdle(); // Notification happens async. |
| 2783 | 2784 |
| 2784 // Start a second request. | 2785 // Start a second request. |
| 2785 ProxyInfo info2; | 2786 ProxyInfo info2; |
| 2786 TestCompletionCallback callback2; | 2787 TestCompletionCallback callback2; |
| 2787 rv = service.ResolveProxy(GURL("http://request2"), std::string(), LOAD_NORMAL, | 2788 rv = service.ResolveProxy(GURL("http://request2"), std::string(), LOAD_NORMAL, |
| 2788 &info2, callback2.callback(), nullptr, nullptr, | 2789 &info2, callback2.callback(), nullptr, nullptr, |
| 2789 BoundNetLog()); | 2790 BoundNetLog()); |
| 2790 EXPECT_EQ(ERR_IO_PENDING, rv); | 2791 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 2791 | 2792 |
| 2792 // This second request should have triggered the re-download of the PAC | 2793 // This second request should have triggered the re-download of the PAC |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2897 | 2898 |
| 2898 ASSERT_TRUE(factory->pending_requests().empty()); | 2899 ASSERT_TRUE(factory->pending_requests().empty()); |
| 2899 | 2900 |
| 2900 // Make sure that our background checker is trying to download the expected | 2901 // Make sure that our background checker is trying to download the expected |
| 2901 // PAC script (same one as before). This time we will simulate a successful | 2902 // PAC script (same one as before). This time we will simulate a successful |
| 2902 // download of the script. | 2903 // download of the script. |
| 2903 EXPECT_TRUE(fetcher->has_pending_request()); | 2904 EXPECT_TRUE(fetcher->has_pending_request()); |
| 2904 EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url()); | 2905 EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url()); |
| 2905 fetcher->NotifyFetchCompletion(OK, kValidPacScript1); | 2906 fetcher->NotifyFetchCompletion(OK, kValidPacScript1); |
| 2906 | 2907 |
| 2907 base::MessageLoop::current()->RunUntilIdle(); | 2908 base::RunLoop().RunUntilIdle(); |
| 2908 | 2909 |
| 2909 // Now that the PAC script is downloaded, it should be used to initialize the | 2910 // Now that the PAC script is downloaded, it should be used to initialize the |
| 2910 // ProxyResolver. Simulate a successful parse. | 2911 // ProxyResolver. Simulate a successful parse. |
| 2911 EXPECT_EQ(ASCIIToUTF16(kValidPacScript1), | 2912 EXPECT_EQ(ASCIIToUTF16(kValidPacScript1), |
| 2912 factory->pending_requests()[0]->script_data()->utf16()); | 2913 factory->pending_requests()[0]->script_data()->utf16()); |
| 2913 factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver); | 2914 factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver); |
| 2914 | 2915 |
| 2915 // At this point the ProxyService should have re-configured itself to use the | 2916 // At this point the ProxyService should have re-configured itself to use the |
| 2916 // PAC script (thereby recovering from the initial fetch failure). We will | 2917 // PAC script (thereby recovering from the initial fetch failure). We will |
| 2917 // verify that the next Resolve request uses the resolver rather than | 2918 // verify that the next Resolve request uses the resolver rather than |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3012 ASSERT_TRUE(factory->pending_requests().empty()); | 3013 ASSERT_TRUE(factory->pending_requests().empty()); |
| 3013 ASSERT_TRUE(resolver.pending_requests().empty()); | 3014 ASSERT_TRUE(resolver.pending_requests().empty()); |
| 3014 | 3015 |
| 3015 // Make sure that our background checker is trying to download the expected | 3016 // Make sure that our background checker is trying to download the expected |
| 3016 // PAC script (same one as before). This time we will simulate a successful | 3017 // PAC script (same one as before). This time we will simulate a successful |
| 3017 // download of a DIFFERENT script. | 3018 // download of a DIFFERENT script. |
| 3018 EXPECT_TRUE(fetcher->has_pending_request()); | 3019 EXPECT_TRUE(fetcher->has_pending_request()); |
| 3019 EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url()); | 3020 EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url()); |
| 3020 fetcher->NotifyFetchCompletion(OK, kValidPacScript2); | 3021 fetcher->NotifyFetchCompletion(OK, kValidPacScript2); |
| 3021 | 3022 |
| 3022 base::MessageLoop::current()->RunUntilIdle(); | 3023 base::RunLoop().RunUntilIdle(); |
| 3023 | 3024 |
| 3024 // Now that the PAC script is downloaded, it should be used to initialize the | 3025 // Now that the PAC script is downloaded, it should be used to initialize the |
| 3025 // ProxyResolver. Simulate a successful parse. | 3026 // ProxyResolver. Simulate a successful parse. |
| 3026 EXPECT_EQ(ASCIIToUTF16(kValidPacScript2), | 3027 EXPECT_EQ(ASCIIToUTF16(kValidPacScript2), |
| 3027 factory->pending_requests()[0]->script_data()->utf16()); | 3028 factory->pending_requests()[0]->script_data()->utf16()); |
| 3028 factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver); | 3029 factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver); |
| 3029 | 3030 |
| 3030 // At this point the ProxyService should have re-configured itself to use the | 3031 // At this point the ProxyService should have re-configured itself to use the |
| 3031 // new PAC script. | 3032 // new PAC script. |
| 3032 | 3033 |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3125 ASSERT_TRUE(factory->pending_requests().empty()); | 3126 ASSERT_TRUE(factory->pending_requests().empty()); |
| 3126 ASSERT_TRUE(resolver.pending_requests().empty()); | 3127 ASSERT_TRUE(resolver.pending_requests().empty()); |
| 3127 | 3128 |
| 3128 // Make sure that our background checker is trying to download the expected | 3129 // Make sure that our background checker is trying to download the expected |
| 3129 // PAC script (same one as before). We will simulate the same response as | 3130 // PAC script (same one as before). We will simulate the same response as |
| 3130 // last time (i.e. the script is unchanged). | 3131 // last time (i.e. the script is unchanged). |
| 3131 EXPECT_TRUE(fetcher->has_pending_request()); | 3132 EXPECT_TRUE(fetcher->has_pending_request()); |
| 3132 EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url()); | 3133 EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url()); |
| 3133 fetcher->NotifyFetchCompletion(OK, kValidPacScript1); | 3134 fetcher->NotifyFetchCompletion(OK, kValidPacScript1); |
| 3134 | 3135 |
| 3135 base::MessageLoop::current()->RunUntilIdle(); | 3136 base::RunLoop().RunUntilIdle(); |
| 3136 | 3137 |
| 3137 ASSERT_TRUE(factory->pending_requests().empty()); | 3138 ASSERT_TRUE(factory->pending_requests().empty()); |
| 3138 ASSERT_TRUE(resolver.pending_requests().empty()); | 3139 ASSERT_TRUE(resolver.pending_requests().empty()); |
| 3139 | 3140 |
| 3140 // At this point the ProxyService is still running the same PAC script as | 3141 // At this point the ProxyService is still running the same PAC script as |
| 3141 // before. | 3142 // before. |
| 3142 | 3143 |
| 3143 // Start a second request. | 3144 // Start a second request. |
| 3144 ProxyInfo info2; | 3145 ProxyInfo info2; |
| 3145 TestCompletionCallback callback2; | 3146 TestCompletionCallback callback2; |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3235 ASSERT_TRUE(factory->pending_requests().empty()); | 3236 ASSERT_TRUE(factory->pending_requests().empty()); |
| 3236 ASSERT_TRUE(resolver.pending_requests().empty()); | 3237 ASSERT_TRUE(resolver.pending_requests().empty()); |
| 3237 | 3238 |
| 3238 // Make sure that our background checker is trying to download the expected | 3239 // Make sure that our background checker is trying to download the expected |
| 3239 // PAC script (same one as before). This time we will simulate a failure | 3240 // PAC script (same one as before). This time we will simulate a failure |
| 3240 // to download the script. | 3241 // to download the script. |
| 3241 EXPECT_TRUE(fetcher->has_pending_request()); | 3242 EXPECT_TRUE(fetcher->has_pending_request()); |
| 3242 EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url()); | 3243 EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url()); |
| 3243 fetcher->NotifyFetchCompletion(ERR_FAILED, std::string()); | 3244 fetcher->NotifyFetchCompletion(ERR_FAILED, std::string()); |
| 3244 | 3245 |
| 3245 base::MessageLoop::current()->RunUntilIdle(); | 3246 base::RunLoop().RunUntilIdle(); |
| 3246 | 3247 |
| 3247 // At this point the ProxyService should have re-configured itself to use | 3248 // At this point the ProxyService should have re-configured itself to use |
| 3248 // DIRECT connections rather than the given proxy resolver. | 3249 // DIRECT connections rather than the given proxy resolver. |
| 3249 | 3250 |
| 3250 // Start a second request. | 3251 // Start a second request. |
| 3251 ProxyInfo info2; | 3252 ProxyInfo info2; |
| 3252 TestCompletionCallback callback2; | 3253 TestCompletionCallback callback2; |
| 3253 rv = service.ResolveProxy(GURL("http://request2"), std::string(), LOAD_NORMAL, | 3254 rv = service.ResolveProxy(GURL("http://request2"), std::string(), LOAD_NORMAL, |
| 3254 &info2, callback2.callback(), nullptr, nullptr, | 3255 &info2, callback2.callback(), nullptr, nullptr, |
| 3255 BoundNetLog()); | 3256 BoundNetLog()); |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3407 // started the next poll, and made it as far as to request the download. | 3408 // started the next poll, and made it as far as to request the download. |
| 3408 | 3409 |
| 3409 EXPECT_TRUE(fetcher->has_pending_request()); | 3410 EXPECT_TRUE(fetcher->has_pending_request()); |
| 3410 EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url()); | 3411 EXPECT_EQ(GURL("http://foopy/proxy.pac"), fetcher->pending_request_url()); |
| 3411 | 3412 |
| 3412 // This time we will fail the download, to simulate a PAC script change. | 3413 // This time we will fail the download, to simulate a PAC script change. |
| 3413 fetcher->NotifyFetchCompletion(ERR_FAILED, std::string()); | 3414 fetcher->NotifyFetchCompletion(ERR_FAILED, std::string()); |
| 3414 | 3415 |
| 3415 // Drain the message loop, so ProxyService is notified of the change | 3416 // Drain the message loop, so ProxyService is notified of the change |
| 3416 // and has a chance to re-configure itself. | 3417 // and has a chance to re-configure itself. |
| 3417 base::MessageLoop::current()->RunUntilIdle(); | 3418 base::RunLoop().RunUntilIdle(); |
| 3418 | 3419 |
| 3419 // Start a third request -- this time we expect to get a direct connection | 3420 // Start a third request -- this time we expect to get a direct connection |
| 3420 // since the PAC script poller experienced a failure. | 3421 // since the PAC script poller experienced a failure. |
| 3421 ProxyInfo info3; | 3422 ProxyInfo info3; |
| 3422 TestCompletionCallback callback3; | 3423 TestCompletionCallback callback3; |
| 3423 rv = service.ResolveProxy(GURL("http://request3"), std::string(), LOAD_NORMAL, | 3424 rv = service.ResolveProxy(GURL("http://request3"), std::string(), LOAD_NORMAL, |
| 3424 &info3, callback3.callback(), nullptr, nullptr, | 3425 &info3, callback3.callback(), nullptr, nullptr, |
| 3425 BoundNetLog()); | 3426 BoundNetLog()); |
| 3426 EXPECT_EQ(OK, rv); | 3427 EXPECT_EQ(OK, rv); |
| 3427 EXPECT_TRUE(info3.is_direct()); | 3428 EXPECT_TRUE(info3.is_direct()); |
| (...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3694 GURL(test.sanitized_url_unstripped), | 3695 GURL(test.sanitized_url_unstripped), |
| 3695 helper.SanitizeUrl(raw_url, ProxyService::SanitizeUrlPolicy::UNSAFE)); | 3696 helper.SanitizeUrl(raw_url, ProxyService::SanitizeUrlPolicy::UNSAFE)); |
| 3696 | 3697 |
| 3697 EXPECT_EQ( | 3698 EXPECT_EQ( |
| 3698 GURL(test.sanitized_url), | 3699 GURL(test.sanitized_url), |
| 3699 helper.SanitizeUrl(raw_url, ProxyService::SanitizeUrlPolicy::SAFE)); | 3700 helper.SanitizeUrl(raw_url, ProxyService::SanitizeUrlPolicy::SAFE)); |
| 3700 } | 3701 } |
| 3701 } | 3702 } |
| 3702 | 3703 |
| 3703 } // namespace net | 3704 } // namespace net |
| OLD | NEW |