26

libcurl を使用してインターネットからファイルをダウンロードする Windows 用のコマンドライン ツールを作成しています。

明らかに、プロキシを構成する必要があるため、ユーザーがプロキシ サーバーの背後にいる場合、ダウンロードは機能しません。ただし、ツールをできるだけシンプルに保ち、プロキシを構成する必要があることでユーザーに負担をかける必要はありません。私のツールには構成ファイルさえないので、そうでなければ、ユーザーはすべてのコマンドでプロキシ設定を渡すか、環境変数などを設定する必要があり、面倒です。

だから私は、誰もがブラウザを適切に設定し、プロキシを設定し、すべてを完了していると思っていました。これは、最も基本的なユーザーにも当てはまります。そうしないと、「インターネットが機能しない」からです。

プロキシを使用するかどうかは、IE のプロキシ設定を見ればわかると思います。

どうすればいいですか?すなわち:

  • Windows には、すべてのブラウザー (おそらく IE) で使用される「プロキシ設定」のセットがありますか、それとも IE、Firefox、Opera など用に別のルーチンを作成する必要がありますか?
  • 値が手動で構成されている場合、おそらく適切なレジストリの場所から値を直接読み取ることができることはわかっていますが、これは「プロキシ サーバーを自動的に検出する」でも機能しますか? そのオプションを気にする必要さえありますか、それとも(ほとんど)使用されていませんか?

人々が代替案を提案し始める前に: 私は C を使用しているため、Win32 API に制限されており、C と libcurl を引き続き使用したいと考えています。

4

4 に答える 4

36

探している関数は 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
    }
}
于 2008-10-14T22:01:13.930 に答える
4

C# でライブラリからメソッドを呼び出す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);
    }
}
于 2012-08-01T00:17:57.167 に答える
1

もちろん、直接取得できるこれらの値のレジストリキーがあります。.NETでも、それほど面倒なことなくこれを行うことができます。WebClientオブジェクトは、現在の設定に基づいてプロキシ設定をネゴシエートすると思います。これは、C#では次のようになります。

using System.Net;

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

またはそれに近い何か。

于 2008-10-14T20:11:46.570 に答える
0

Firefox/Seamonkey の場合、多くのプロファイルが存在するため、問題はもう少し厄介です。

プロファイルが 1 つしかないと仮定したい場合は、prefs.js を見つけるだけです。network.proxy.type を解析し、それを使用して、どの関連値を読み取るかを決定します。

私は mozilla のいくつかのドキュメントに取り組んでいるので、フォローアップの質問をここに入力してください (wiki ボックスにチェックを入れてください)。必要な情報を提供できるように努めます。

于 2008-10-23T05:48:30.940 に答える