diff options
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/browser/net/chrome_url_request_context.cc | 64 | ||||
-rw-r--r-- | chrome/browser/net/chrome_url_request_context.h | 8 | ||||
-rw-r--r-- | chrome/browser/net/chrome_url_request_context_unittest.cc | 181 | ||||
-rw-r--r-- | chrome/chrome.gyp | 2 | ||||
-rw-r--r-- | chrome/chrome.sln | 3 | ||||
-rw-r--r-- | chrome/common/chrome_switches.cc | 18 | ||||
-rw-r--r-- | chrome/common/chrome_switches.h | 4 | ||||
-rw-r--r-- | chrome/test/unit/unittests.vcproj | 4 |
8 files changed, 272 insertions, 12 deletions
diff --git a/chrome/browser/net/chrome_url_request_context.cc b/chrome/browser/net/chrome_url_request_context.cc index b15db26..85a33c9 100644 --- a/chrome/browser/net/chrome_url_request_context.cc +++ b/chrome/browser/net/chrome_url_request_context.cc @@ -23,26 +23,68 @@ #include "net/proxy/proxy_service.h" #include "webkit/glue/webkit_glue.h" -// Sets up proxy info if overrides were specified on the command line. -// Otherwise returns NULL (meaning we should use the system defaults). -// The caller is responsible for deleting returned pointer. -static net::ProxyInfo* CreateProxyInfo(const CommandLine& command_line) { - net::ProxyInfo* proxy_info = NULL; +net::ProxyConfig* CreateProxyConfig(const CommandLine& command_line) { + // Scan for all "enable" type proxy switches. + static const wchar_t* proxy_switches[] = { + switches::kProxyServer, + switches::kProxyServerPacUrl, + switches::kProxyServerAutoDetect, + switches::kProxyServerBypassUrls + }; + + bool found_enable_proxy_switch = false; + for (size_t i = 0; i < arraysize(proxy_switches); i++) { + if (command_line.HasSwitch(proxy_switches[i])) { + found_enable_proxy_switch = true; + break; + } + } + + if (!found_enable_proxy_switch && + !command_line.HasSwitch(switches::kNoProxyServer)) { + return NULL; + } + + net::ProxyConfig* proxy_config = new net::ProxyConfig(); + if (command_line.HasSwitch(switches::kNoProxyServer)) { + // Ignore (and warn about) all the other proxy config switches we get if + // the no-proxy-server command line argument is present. + if (found_enable_proxy_switch) { + LOG(WARNING) << "Additional command line proxy switches found when --" + << switches::kNoProxyServer << " was specified."; + } + return proxy_config; + } if (command_line.HasSwitch(switches::kProxyServer)) { - proxy_info = new net::ProxyInfo(); const std::wstring& proxy_server = command_line.GetSwitchValue(switches::kProxyServer); - proxy_info->UseNamedProxy(WideToASCII(proxy_server)); + proxy_config->proxy_rules.ParseFromString(WideToASCII(proxy_server)); + } + + if (command_line.HasSwitch(switches::kProxyServerPacUrl)) { + proxy_config->pac_url = + GURL(WideToASCII(command_line.GetSwitchValue( + switches::kProxyServerPacUrl))); + } + + if (command_line.HasSwitch(switches::kProxyServerAutoDetect)) { + proxy_config->auto_detect = true; + } + + if (command_line.HasSwitch(switches::kProxyServerBypassUrls)) { + proxy_config->ParseNoProxyList( + WideToASCII(command_line.GetSwitchValue( + switches::kProxyServerBypassUrls))); } - return proxy_info; + return proxy_config; } // Create a proxy service according to the options on command line. static net::ProxyService* CreateProxyService(URLRequestContext* context, const CommandLine& command_line) { - scoped_ptr<net::ProxyInfo> proxy_info(CreateProxyInfo(command_line)); + scoped_ptr<net::ProxyConfig> proxy_config(CreateProxyConfig(command_line)); bool use_v8 = !command_line.HasSwitch(switches::kWinHttpProxyResolver); if (use_v8 && command_line.HasSwitch(switches::kSingleProcess)) { @@ -53,8 +95,8 @@ static net::ProxyService* CreateProxyService(URLRequestContext* context, } return use_v8 ? - net::ProxyService::CreateUsingV8Resolver(proxy_info.get(), context) : - net::ProxyService::Create(proxy_info.get()); + net::ProxyService::CreateUsingV8Resolver(proxy_config.get(), context) : + net::ProxyService::Create(proxy_config.get()); } // static diff --git a/chrome/browser/net/chrome_url_request_context.h b/chrome/browser/net/chrome_url_request_context.h index 34b3d97..6f392a7 100644 --- a/chrome/browser/net/chrome_url_request_context.h +++ b/chrome/browser/net/chrome_url_request_context.h @@ -9,6 +9,10 @@ #include "net/url_request/url_request_context.h" class Profile; +class CommandLine; +namespace net { +class ProxyConfig; +} // A URLRequestContext subclass used by the browser. This can be used to store // extra information about requests, beyond what is supported by the base @@ -96,3 +100,7 @@ class ChromeURLRequestContext : public URLRequestContext, bool is_media_; bool is_off_the_record_; }; + +// Creates a proxy configuration using the overrides specified on the command +// line. Returns NULL if the system defaults should be used instead. +net::ProxyConfig* CreateProxyConfig(const CommandLine& command_line); diff --git a/chrome/browser/net/chrome_url_request_context_unittest.cc b/chrome/browser/net/chrome_url_request_context_unittest.cc new file mode 100644 index 0000000..e74e7a8 --- /dev/null +++ b/chrome/browser/net/chrome_url_request_context_unittest.cc @@ -0,0 +1,181 @@ +// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/command_line.h" +#include "chrome/browser/net/chrome_url_request_context.h" +#include "chrome/common/chrome_switches.h" +#include "net/proxy/proxy_config.h" +#include "net/proxy/proxy_config_service_common_unittest.h" + +#include "testing/gtest/include/gtest/gtest.h" + +// Builds an identifier for each test in an array. +#define TEST_DESC(desc) StringPrintf("at line %d <%s>", __LINE__, desc) + +TEST(ChromeUrlRequestContextTest, CreateProxyConfigTest) { + // Build the input command lines here. + CommandLine empty(L"foo.exe"); + CommandLine no_proxy(L"foo.exe"); + no_proxy.AppendSwitch(switches::kNoProxyServer); + CommandLine no_proxy_extra_params(L"foo.exe"); + no_proxy_extra_params.AppendSwitch(switches::kNoProxyServer); + no_proxy_extra_params.AppendSwitchWithValue(switches::kProxyServer, + L"http://proxy:8888"); + CommandLine single_proxy(L"foo.exe"); + single_proxy.AppendSwitchWithValue(switches::kProxyServer, + L"http://proxy:8888"); + CommandLine per_scheme_proxy(L"foo.exe"); + per_scheme_proxy.AppendSwitchWithValue(switches::kProxyServer, + L"http=httpproxy:8888;ftp=ftpproxy:8889"); + CommandLine per_scheme_proxy_bypass(L"foo.exe"); + per_scheme_proxy_bypass.AppendSwitchWithValue(switches::kProxyServer, + L"http=httpproxy:8888;ftp=ftpproxy:8889"); + per_scheme_proxy_bypass.AppendSwitchWithValue( + switches::kProxyServerBypassUrls, + L".google.com, foo.com:99, 1.2.3.4:22, 127.0.0.1/8"); + CommandLine with_pac_url(L"foo.exe"); + with_pac_url.AppendSwitchWithValue(switches::kProxyServerPacUrl, + L"http://wpad/wpad.dat"); + with_pac_url.AppendSwitchWithValue( + switches::kProxyServerBypassUrls, + L".google.com, foo.com:99, 1.2.3.4:22, 127.0.0.1/8"); + CommandLine with_auto_detect(L"foo.exe"); + with_auto_detect.AppendSwitch(switches::kProxyServerAutoDetect); + + // Inspired from proxy_config_service_win_unittest.cc. + const struct { + // Short description to identify the test + std::string description; + + // The command line to build a ProxyConfig from. + const CommandLine& command_line; + + // Expected outputs (fields of the ProxyConfig). + bool is_null; + bool auto_detect; + GURL pac_url; + net::ProxyConfig::ProxyRules proxy_rules; + const char* proxy_bypass_list; // newline separated + bool bypass_local_names; + } tests[] = { + { + TEST_DESC("Empty command line"), + // Input + empty, + // Expected result + true, // is_null + false, // auto_detect + GURL(), // pac_url + net::ProxyConfig::ProxyRules(), // proxy_rules + "", // proxy_bypass_list + false // bypass_local_names + }, + { + TEST_DESC("No proxy"), + // Input + no_proxy, + // Expected result + false, // is_null + false, // auto_detect + GURL(), // pac_url + net::ProxyConfig::ProxyRules(), // proxy_rules + "", // proxy_bypass_list + false // bypass_local_names + }, + { + TEST_DESC("No proxy with extra parameters."), + // Input + no_proxy_extra_params, + // Expected result + false, // is_null + false, // auto_detect + GURL(), // pac_url + net::ProxyConfig::ProxyRules(), // proxy_rules + "", // proxy_bypass_list + false // bypass_local_names + }, + { + TEST_DESC("Single proxy."), + // Input + single_proxy, + // Expected result + false, // is_null + false, // auto_detect + GURL(), // pac_url + net::MakeSingleProxyRules("http://proxy:8888"), // proxy_rules + "", // proxy_bypass_list + false // bypass_local_names + }, + { + TEST_DESC("Per scheme proxy."), + // Input + per_scheme_proxy, + // Expected result + false, // is_null + false, // auto_detect + GURL(), // pac_url + net::MakeProxyPerSchemeRules("httpproxy:8888", + "", + "ftpproxy:8889"), // proxy_rules + "", // proxy_bypass_list + false // bypass_local_names + }, + { + TEST_DESC("Per scheme proxy with bypass URLs."), + // Input + per_scheme_proxy_bypass, + // Expected result + false, // is_null + false, // auto_detect + GURL(), // pac_url + net::MakeProxyPerSchemeRules("httpproxy:8888", + "", + "ftpproxy:8889"), // proxy_rules + "*.google.com\n*foo.com:99\n1.2.3.4:22\n127.0.0.1/8\n", + false // bypass_local_names + }, + { + TEST_DESC("Pac URL with proxy bypass URLs"), + // Input + with_pac_url, + // Expected result + false, // is_null + false, // auto_detect + GURL("http://wpad/wpad.dat"), // pac_url + net::ProxyConfig::ProxyRules(), // proxy_rules + "*.google.com\n*foo.com:99\n1.2.3.4:22\n127.0.0.1/8\n", + false // bypass_local_names + }, + { + TEST_DESC("Autodetect"), + // Input + with_auto_detect, + // Expected result + false, // is_null + true, // auto_detect + GURL(), // pac_url + net::ProxyConfig::ProxyRules(), // proxy_rules + "", // proxy_bypass_list + false // bypass_local_names + } + }; + + for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); i++) { + SCOPED_TRACE(StringPrintf("Test[%d] %s", i, tests[i].description.c_str())); + scoped_ptr<net::ProxyConfig> config(CreateProxyConfig( + CommandLine(tests[i].command_line))); + + if (tests[i].is_null) { + EXPECT_TRUE(config == NULL); + } else { + EXPECT_TRUE(config != NULL); + EXPECT_EQ(tests[i].auto_detect, config->auto_detect); + EXPECT_EQ(tests[i].pac_url, config->pac_url); + EXPECT_EQ(tests[i].proxy_bypass_list, + net::FlattenProxyBypass(config->proxy_bypass)); + EXPECT_EQ(tests[i].bypass_local_names, config->proxy_bypass_local_names); + EXPECT_EQ(tests[i].proxy_rules, config->proxy_rules); + } + } +} diff --git a/chrome/chrome.gyp b/chrome/chrome.gyp index 2bb811b..79d9be2 100644 --- a/chrome/chrome.gyp +++ b/chrome/chrome.gyp @@ -2584,6 +2584,7 @@ 'chrome_resources', 'chrome_strings', 'test_support_unit', + '../net/net.gyp:net_test_support', '../printing/printing.gyp:printing', '../webkit/webkit.gyp:webkit', '../skia/skia.gyp:skia', @@ -2685,6 +2686,7 @@ 'browser/metrics/metrics_response_unittest.cc', 'browser/navigation_controller_unittest.cc', 'browser/navigation_entry_unittest.cc', + 'browser/net/chrome_url_request_context_unittest.cc', 'browser/net/dns_host_info_unittest.cc', 'browser/net/dns_master_unittest.cc', 'browser/net/resolve_proxy_msg_helper_unittest.cc', diff --git a/chrome/chrome.sln b/chrome/chrome.sln index ce4d621..ca346ed 100644 --- a/chrome/chrome.sln +++ b/chrome/chrome.sln @@ -304,7 +304,9 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit_tests", "test\unit\uni {CD9CA56E-4E94-444C-87D4-58CA1E6F300D} = {CD9CA56E-4E94-444C-87D4-58CA1E6F300D} {D5E8DCB2-9C61-446F-8BEE-B18CA0E0936E} = {D5E8DCB2-9C61-446F-8BEE-B18CA0E0936E} {D9DDAF60-663F-49CC-90DC-3D08CC3D1B28} = {D9DDAF60-663F-49CC-90DC-3D08CC3D1B28} + {E99DA267-BE90-4F45-88A1-6919DB2C7567} = {E99DA267-BE90-4F45-88A1-6919DB2C7567} {EC8B7909-62AF-470D-A75D-E1D89C837142} = {EC8B7909-62AF-470D-A75D-E1D89C837142} + {ED19720A-8F14-D3FC-9C6D-EEB5AE4D5BD7} = {ED19720A-8F14-D3FC-9C6D-EEB5AE4D5BD7} {EF5E94AB-B646-4E5B-A058-52EF07B8351C} = {EF5E94AB-B646-4E5B-A058-52EF07B8351C} {EFBB1436-A63F-4CD8-9E99-B89226E782EC} = {EFBB1436-A63F-4CD8-9E99-B89226E782EC} {F4F4BCAA-EA59-445C-A119-3E6C29647A51} = {F4F4BCAA-EA59-445C-A119-3E6C29647A51} @@ -1223,6 +1225,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "memory_test", "test\memory_ {BFE8E2A7-3B3B-43B0-A994-3058B852DB8B} = {BFE8E2A7-3B3B-43B0-A994-3058B852DB8B} {C564F145-9172-42C3-BFCB-6014CA97DBCD} = {C564F145-9172-42C3-BFCB-6014CA97DBCD} {CD9CA56E-4E94-444C-87D4-58CA1E6F300D} = {CD9CA56E-4E94-444C-87D4-58CA1E6F300D} + {ED19720A-8F14-D3FC-9C6D-EEB5AE4D5BD7} = {ED19720A-8F14-D3FC-9C6D-EEB5AE4D5BD7} {EF5E94AB-B646-4E5B-A058-52EF07B8351C} = {EF5E94AB-B646-4E5B-A058-52EF07B8351C} {FA537565-7B03-4FFC-AF15-F7A979B72E22} = {FA537565-7B03-4FFC-AF15-F7A979B72E22} EndProjectSection diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc index ff0522a..3e1a7d1 100644 --- a/chrome/common/chrome_switches.cc +++ b/chrome/common/chrome_switches.cc @@ -233,9 +233,25 @@ const wchar_t kMakeDefaultBrowser[] = L"make-default-browser"; // affects HTTP and HTTPS requests. const wchar_t kProxyServer[] = L"proxy-server"; +// Don't use a proxy server, always make direct connections. Overrides any +// other proxy server flags that are passed. +const wchar_t kNoProxyServer[] = L"no-proxy-server"; + +// Specify a list of URLs for whom we bypass proxy settings and use direct +// connections. Ignored if proxy-server-auto-detect or no-proxy-server are +// also specified. +// TODO(robertshield): Specify URL format. +const wchar_t kProxyServerBypassUrls[] = L"proxy-server-bypass-urls"; + +// Force proxy auto-detection. +const wchar_t kProxyServerAutoDetect[] = L"proxy-server-auto-detect"; + +// Use the pac script at the given URL +const wchar_t kProxyServerPacUrl[] = L"proxy-server-pac-url"; + // Use WinHTTP to fetch and evaluate PAC scripts. Otherwise the default is // to use Chromium's network stack to fetch, and V8 to evaluate. -const wchar_t kWinHttpProxyResolver[] = L"winhttp-proxy-resolver"; +const wchar_t kWinHttpProxyResolver[] = L"winhttp-proxy-resolver"; // Chrome will support prefetching of DNS information. Until this becomes // the default, we'll provide a command line switch. diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h index 83682d0..e1d0243 100644 --- a/chrome/common/chrome_switches.h +++ b/chrome/common/chrome_switches.h @@ -77,6 +77,10 @@ extern const wchar_t kShowIcons[]; extern const wchar_t kMakeDefaultBrowser[]; extern const wchar_t kProxyServer[]; +extern const wchar_t kNoProxyServer[]; +extern const wchar_t kProxyServerBypassUrls[]; +extern const wchar_t kProxyServerAutoDetect[]; +extern const wchar_t kProxyServerPacUrl[]; extern const wchar_t kWinHttpProxyResolver[]; extern const wchar_t kDebugPrint[]; diff --git a/chrome/test/unit/unittests.vcproj b/chrome/test/unit/unittests.vcproj index f36c673..b3fa491 100644 --- a/chrome/test/unit/unittests.vcproj +++ b/chrome/test/unit/unittests.vcproj @@ -456,6 +456,10 @@ > </File> <File + RelativePath="..\..\browser\net\chrome_url_request_context_unittest.cc" + > + </File> + <File RelativePath="..\..\browser\safe_browsing\chunk_range_unittest.cc" > </File> |