Как узнать настройки прокси-сервера браузера?
Я пишу инструмент командной строки для Windows, который использует libcurl для загрузки файлов из Интернета.
Очевидно, что загрузка не работает, когда пользователь находится за прокси-сервером, потому что необходимо настроить прокси-сервер. Я хочу, чтобы мой инструмент был как можно более простым, и не нужно обременять пользователя настройкой прокси-сервера. Мой инструмент даже не имеет конфигурационного файла, поэтому пользователю в противном случае пришлось бы передавать настройки прокси-сервера для каждой команды или устанавливать переменную окружения или что-то слишком сложное.
Итак, я думал, что каждый браузер, как правило, уже настроен правильно, настроен прокси и все такое. Это будет справедливо даже для самого элементарного пользователя, потому что иначе "их интернет не будет работать".
Итак, я полагаю, что могу узнать, использовать ли прокси-сервер, посмотрев настройки прокси-сервера IE.
Как мне это сделать? Более конкретно:
- Есть ли один набор "настроек прокси" в Windows, используемый всеми браузерами (возможно, IE), или мне придется писать разные подпрограммы для IE, Firefox, Opera и т.д.
- Я знаю, что я могу, вероятно, прочитать значения непосредственно из соответствующих мест реестра, если они настроены вручную, но это также работает с "автоматически определять прокси-сервер?". Должен ли я даже беспокоиться об этом, или он (почти) никогда не использовался?
Прежде чем люди начнут предлагать альтернативы: я использую C, поэтому я ограничен Win32 API, и я действительно очень хочу продолжать использовать C и libcurl.
Ответы
Ответ 1
Функция, которую вы ищете, - это 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
}
}
Ответ 2
Вот полный пример кода, как вызвать метод WinHttpGetIEProxyConfigForCurrentUser
из библиотеки winhttp.dll
в С#
[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);
}
}
Ответ 3
Есть ключи реестра для этих значений, которые вы можете получить, конечно, конечно. Вы также можете сделать это в .NET без особых хлопот. Я считаю, что объект WebClient согласовывает настройки прокси-сервера для вас на основе текущих настроек. Это было бы похоже на С#:
using System.Net;
string url = "http://www.example.com";
WebClient client = new WebClient();
byte[] fileBuffer = client.DownloadFile(url);
Или что-то близкое к этому.
Ответ 4
Для Firefox/Seamonkey проблема немного сложнее из-за существования множества профилей.
Если вы хотите предположить, что существует только один профиль, вам просто нужно найти prefs.js. Вы проанализируете файл network.proxy.type, а затем используйте его, чтобы решить, какие связанные значения следует читать.
Я работаю над некоторыми документами для mozilla, поэтому поставьте ваши последующие вопросы здесь (проверили окно wiki), и я постараюсь предоставить вам необходимую вам информацию.