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

标签 windows internet-explorer firefox proxy browser

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

显然,当用户在代理服务器后面时,下载不起作用,因为需要配置代理。然而,我想让我的工具尽可能简单,而不必让用户因为必须配置代理而增加负担。我的工具甚至没有配置文件,因此用户必须在每个命令中传递代理设置,或者设置环境变量或类似的东西——太麻烦了。

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

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

我该怎么做?更具体地说:

  • Windows 中是否有一套“代理设置”供所有浏览器(可能是 IE)使用,或者我是否必须为 IE、Firefox、Opera 等编写不同的例程?
  • 我知道如果手动配置它们,我可能可以直接从适当的注册表位置读取值,但这是否也适用于“自动检测代理服务器”?我是否需要为该选项费心,或者它(几乎)从未使用过?

在人们开始建议替代方案之前:我使用的是 C,所以我只能使用 Win32 API,而且我真的很想继续使用 C 和 libcurl。

最佳答案

您要查找的函数是 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
    }
}

关于windows - 如何找出浏览器的代理设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/202547/

相关文章:

Windows 上的 PHP : How to use web services with the logged on user's identity?

windows - 在 Linux 和 Windows 计算机之间同步 Eclipse 项目

html - IE 中使用边距和表格的 CSS 问题

windows - WebBrowser ActiveX 控件在 2022 年 6 月之后会继续工作吗?

javascript - 将客户端生成的数据分块保存为 JavaScript 中的文件

html - 有没有办法设置表格中整列的文本对齐方式?

python - 使用多个版本的 Python

ios - 钛加速器 : iPhone Development without a Mac (like PhoneGap)

javascript - "Interner Explore has stop working"在 IE 11 中出现问题当用户在 html 数字输入上进行选项卡时

firefox - 如何允许 Firefox(或 Chrome)读取 PC 的主机名或其他可分配 ID?