如何找出浏览器的代理设置?

我正在为Windows编写一个命令行工具,它使用libcurl从互联网上下载文件。

显然,当用户在代理服务器后面时,下载不起作用,因为代理需要configuration。 然而,我想保持我的工具尽可能简单,而不必为用户configuration代理而负担。 我的工具甚至没有configuration文件,所以用户不得不在每个命令中传递代理设置,或者设置一个环境variables或者太多的麻烦。

所以我想,每个人的浏览器通常都会被正确设置,代理configuration和一切。 即使是最基本的用户也是如此,否则“他们的互联网将无法工作”。

所以我想我可以通过查看IE的代理设置来找出是否使用代理。

我如何去做这件事? 进一步来说:

  • 在Windows中是否有一组“代理设置”,所有浏览器(可能是IE浏览器)都使用这种设置?还是我必须为IE,Firefox,Opera等编写不同的例程?
  • 我知道我可以直接从相应的registry位置读取值,如果它们是手动configuration的,但是这也适用于“自动检测代理服务器?”。 我甚至不得不用这个选项来打扰,还是(几乎)不用?

在人们开始build议替代scheme之前,我使用C,所以我仅限于Win32 API,我真的很想继续使用C和libcurl。

Solutions Collecting From Web of "如何找出浏览器的代理设置?"

您正在寻找的功能是WinHttpGetIEProxyConfigForCurrentUser(),这是记录在http://msdn.microsoft.com/en-us/library/aa384096(VS.85).aspx 。 Firefox和Opera使用此功能默认获取其代理设置,尽管您可以通过浏览器覆盖它们。 不过,不要那样做。 正确的做法(这是其他人所做的)只是获取IE设置,并假定它们是正确的,因为它们几乎总是这样。

以下是相关逻辑的示例,您应该根据自己的需求进行调整:

if( WinHttpGetIEProxyConfigForCurrentUser( &ieProxyConfig ) ) { if( ieProxyConfig.fAutoDetect ) { fAutoProxy = TRUE; } if( ieProxyConfig.lpszAutoConfigUrl != NULL ) { fAutoProxy = TRUE; autoProxyOptions.lpszAutoConfigUrl = ieProxyConfig.lpszAutoConfigUrl; } } else { // use autoproxy fAutoProxy = TRUE; } if( fAutoProxy ) { if ( autoProxyOptions.lpszAutoConfigUrl != NULL ) { autoProxyOptions.dwFlags = WINHTTP_AUTOPROXY_CONFIG_URL; } else { autoProxyOptions.dwFlags = WINHTTP_AUTOPROXY_AUTO_DETECT; autoProxyOptions.dwAutoDetectFlags = WINHTTP_AUTO_DETECT_TYPE_DHCP | WINHTTP_AUTO_DETECT_TYPE_DNS_A; } // basic flags you almost always want autoProxyOptions.fAutoLogonIfChallenged = TRUE; // here we reset fAutoProxy in case an auto-proxy isn't actually // configured for this url fAutoProxy = WinHttpGetProxyForUrl( hiOpen, pwszUrl, &autoProxyOptions, &autoProxyInfo ); } if ( fAutoProxy ) { // set proxy options for libcurl based on autoProxyInfo } else { if( ieProxyConfig.lpszProxy != NULL ) { // IE has an explicit proxy. set proxy options for libcurl here // based on ieProxyConfig // // note that sometimes IE gives just a single or double colon // for proxy or bypass list, which means "no proxy" } else { // there is no auto proxy and no manually configured proxy } } 

这里是一个完整的代码示例如何从winhttp.dll库中调用WinHttpGetIEProxyConfigForCurrentUser方法在C#

 [TestClass] public class UnitTest1 { [StructLayout(LayoutKind.Sequential)] public struct WinhttpCurrentUserIeProxyConfig { [MarshalAs(UnmanagedType.Bool)] public bool AutoDetect; [MarshalAs(UnmanagedType.LPWStr)] public string AutoConfigUrl; [MarshalAs(UnmanagedType.LPWStr)] public string Proxy; [MarshalAs(UnmanagedType.LPWStr)] public string ProxyBypass; } [DllImport("winhttp.dll", SetLastError = true)] static extern bool WinHttpGetIEProxyConfigForCurrentUser(ref WinhttpCurrentUserIeProxyConfig pProxyConfig); [TestMethod] public void TestMethod1() { var config = new WinhttpCurrentUserIeProxyConfig(); WinHttpGetIEProxyConfigForCurrentUser(ref config); Console.WriteLine(config.Proxy); Console.WriteLine(config.AutoConfigUrl); Console.WriteLine(config.AutoDetect); Console.WriteLine(config.ProxyBypass); } } 

有这些值的注册表键,当然你可以直接得到。 你也可以在.NET中做到这一点,没有什么麻烦。 我相信WebClient对象根据当前设置为您协商代理设置。 这看起来像这样在C#中:

 using System.Net; string url = "http://www.example.com"; WebClient client = new WebClient(); byte[] fileBuffer = client.DownloadFile(url); 

或者接近于此。

对于Firefox / Seamonkey,由于存在许多配置文件,所以问题稍微棘手。

如果你想假设只有一个配置文件,那么你只需要找到prefs.js。 你解析network.proxy.type,然后用它来决定读取哪些相关的值。

我正在为mozilla编写一些文档,所以把你的后续问题放在这里(检查wiki框),我会尽量给你你需要的信息。