How do I find out the browser's proxy settings?
The function you're looking for is WinHttpGetIEProxyConfigForCurrentUser(), which is documented at http://msdn.microsoft.com/en-us/library/aa384096(VS.85).aspx. This function is used by Firefox and Opera to get their proxy settings by default, although you can override them per-browser. Don't do that, though. The right thing to do (which is what everybody else does) is to just get the IE settings and assume that they're correct, since they almost always are.
Here's a sample of the relevant logic, which you should adapt for your needs:
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 }}
Here is a complete code sample how to call WinHttpGetIEProxyConfigForCurrentUser
method from winhttp.dll
library in 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); }}
There are registry keys for these values that you could get to directly of course. You could also do this in .NET without much hassle at all. I believe the WebClient object negotiates the proxy settings for you based on the current settings. This would look like this in C#:
using System.Net;string url = "http://www.example.com";WebClient client = new WebClient();byte[] fileBuffer = client.DownloadFile(url);
Or something close to that.