Libcurlを使用してインターネットからファイルをダウンロードするWindows用のコマンドラインツールを書いています。
明らかに、ユーザーがプロキシサーバーの背後にいる場合、プロキシを構成する必要があるため、ダウンロードは機能しません。ただし、ツールをできるだけシンプルに保ち、プロキシを構成する必要があることでユーザーに負担をかけないようにしたいです。私のツールには設定ファイルすらありません。そのため、ユーザーはすべてのコマンドでプロキシ設定を渡すか、環境変数などを設定する必要があります。面倒です。
ですから、私は、通常、すべてのブラウザがすでに適切に設定され、プロキシが構成されていると思いました。そうでなければ「彼らのインターネットは機能しない」ので、これは最も基本的なユーザーにも当てはまります。
ですから、IEのプロキシ設定を見れば、プロキシを使うかどうかがわかると思います。
どうすればこれを行うことができますか?すなわち:
人々が代替案を提案し始める前に:私は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
}
}
これは、C#のwinhttp.dll
ライブラリからWinHttpGetIEProxyConfigForCurrentUser
メソッドを呼び出す方法の完全なコードサンプルです。
[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);
}
}
もちろん、直接取得できるこれらの値のレジストリキーがあります。 .NETでも、それほど面倒なことなくこれを行うことができます。 WebClientオブジェクトは、現在の設定に基づいてプロキシ設定をネゴシエートすると思います。これは、C#では次のようになります。
using System.Net;
string url = "http://www.example.com";
WebClient client = new WebClient();
byte[] fileBuffer = client.DownloadFile(url);
またはそれに近い何か。
Firefox/Seamonkeyの場合、多くのプロファイルが存在するため、問題は少し厄介です。
プロファイルが1つだけであると想定したい場合は、prefs.jsを見つける必要があります。 network.proxy.typeを解析し、それを使用して、読み取る関連値を決定します。
私はmozillaのいくつかのドキュメントに取り組んでいるので、フォローアップの質問をここに入力してください(wikiボックスをチェックしてください)。必要な情報を提供しようとします。