2008-10-14 2 views
24

Я пишу инструмент командной строки для Windows, который использует libcurl для загрузки файлов из Интернета.Как узнать настройки прокси-сервера браузера?

Очевидно, что загрузка не работает, когда пользователь находится за прокси-сервером, потому что необходимо настроить прокси-сервер. Я хочу, чтобы мой инструмент был как можно более простым, и не нужно обременять пользователя настройкой прокси-сервера. Мой инструмент даже не имеет конфигурационного файла, поэтому пользователю в противном случае пришлось бы передавать настройки прокси для каждой команды или устанавливать переменную окружения или слишком много - слишком много хлопот.

Так что я подумал, что каждый браузер, как правило, уже настроен правильно, настроен прокси и все такое. Это будет справедливо даже для самого элементарного пользователя, потому что иначе «их интернет не будет работать».

Итак, я считаю, что могу выяснить, использовать ли прокси-сервер, посмотрев настройки прокси-сервера IE.

Как это сделать? Более конкретно:

  • Есть один набор «настройки прокси-сервера» в Windows, используется всеми браузерами (IE, вероятно, в), или я должен писать различные процедуры для IE, Firefox, Opera и т.д.?
  • Я знаю, что, возможно, я могу читать значения непосредственно из соответствующих мест реестра, если они настроены вручную, но это также работает с «автоматически обнаруживать прокси-сервер?». Должен ли я даже беспокоиться об этом, или он (почти) никогда не использовался?

Прежде чем люди начнут предлагать альтернативы: я использую C, поэтому я ограничен Win32 API, и я действительно очень хочу использовать C и libcurl.

+1

[Найти код здесь, чтобы получить настройки прокси в IE.] Http://stackoverflow.com/a/12601449/ 559746 – 2012-09-26 12:21:20

ответ

33

Функция, которую вы ищете, это 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 
    } 
} 
1

Есть ключи реестра для этих значений, которые вы могли бы получить, конечно, конечно. Вы также можете сделать это в .NET без особых хлопот. Я считаю, что объект WebClient согласовывает настройки прокси-сервера для вас на основе текущих настроек. Это будет выглядеть так на C#:

using System.Net; 

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

Или что-то рядом с этим.

+0

Кстати, вы также можете использовать тот же класс для обнаружения прокси. Существует свойство Proxy с методом GetProxy(). – 2008-10-14 20:14:19

+0

Спасибо, но я использую C, так что это не о чем идет речь (и я не хочу прибегать к COM, если могу это избежать). Я отредактировал вопрос, чтобы уточнить. – rix0rrr 2008-10-14 21:03:24

0

Для Firefox/Seamonkey, проблема немного сложнее из-за существования многих профилей.

Если вы хотите предположить, что существует только один профиль, вам просто нужно найти prefs.js. Вы разбираете файл network.proxy.type, а затем используете его, чтобы решить, какие связанные значения следует читать.

Я работаю над некоторыми документами для mozilla, поэтому поставьте здесь свои последующие вопросы (проверили окно wiki), и я постараюсь предоставить вам необходимую вам информацию.

3

Вот полный пример кода, как позвонить WinHttpGetIEProxyConfigForCurrentUser метод из winhttp.dll библиотеки в 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); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^