合理的なアルゴリズムは次のようになります。
ユーザーの現在のプロキシ設定 (IE が使用するもの) を使用して接続を試みます。これらは、機能している可能性が最も高いものです。WinHttpGetIEProxyConfigForCurrentUser()
これらの設定を取得するには、MSDN を参照するかINTERNET_OPEN_TYPE_PRECONFIG
、WinINet を参照してください。
それが失敗した場合は、直接接続を試してください。
それが失敗した場合は、 WinHttpGetProxyForUrlを使用して WPAD 自動検出を試してください。( WPADは、クライアントがネットワーク (通常は企業ネットワーク) 上のProxy Auto-Config (PAC)ファイルを自動的に検索できる方法です。) プロキシ ファイルの DHCP と DNS の両方をチェックするオプションを選択する必要があります。WinHTTP AutoProxy Functions
MSDN の には、この API を使用したコード サンプルと多くのサポート情報が含まれています。これが成功すると、HTTP ダウンロード コードにプラグインできるプロキシ情報が返されます。私の知る限り、新しい WPAD 検出を自動的に行う同等の WinINet オプションはありません。WinHTTP のみです。
次に、Firefox のプロキシ設定を探すことができます。 This SO answerは、これらの設定の場所と形式に関する詳細情報であるため、プログラムでアクセスできます。
それでも失敗する場合は、(UI で) ユーザーにインターネット接続が実際に接続されていることを確認するように依頼します。実際には、上記のすべてのプロキシ検出手順が失敗するよりも、ユーザーが切断される方がはるかに一般的です。インターネット サイトにアクセスできることを確認するためにブラウザを開くようユーザーに依頼します。上記の手順が失敗した場合、ブラウザで Web を表示できない可能性があります。ユーザーが接続していると主張したら、手順 1~3 を繰り返します。
上記のすべてが失敗した場合、ユーザーにプロキシ情報を手動で指定するように依頼する以外に選択肢はほとんどありません。おそらく、IE または Firefox のプロキシ UI を複製し、それらの UI 設定を適切なパラメーターに変換して、そのファイルをダウンロードするときにプロキシ オプションを構成することをお勧めします。
プロキシ検出に魔法はないことに注意してください。選択肢は、ユーザーの設定を使用するか、デフォルトのコンピューター設定を使用するか、直接接続を使用するか、WPAD を使用して PAC ファイルを検索するか、またはユーザーに尋ねることです。残念ながら、「プロキシを気にせずに HTTP 接続を確立する」方法はありません。
ところで、WinHTTP をプロキシ検出にのみ使用し、WinINet を使用してファイルをフェッチすることもできますが、両方の部分に WinHTTP を使用することをお勧めします。HTTP インタラクションに対して最大限の柔軟性と制御が必要な場合 (および WinINet よりも優れた安定性) が必要な場合は、WinHTTP をお勧めします。
更新 2:
JJ は上で良い考えを持っていました - 私は Firefox のプロキシ設定をチェックするためのステップを追加しました。奇妙なプロキシは一般に企業環境 (IE で標準化される傾向がある) で見られるため、これが役立つ可能性はやや低くなりますが、試してみる価値はあります。
更新: Francis の正しいコメントに応えて、上記のセクションを編集しました: WinHTTP は厳密な意味で WinINet の「後継者」ではありません (WinINet の機能の 100% が WinHTTP で利用可能であることを意味します)。むしろ、WinHTTP は、データ交換に HTTP を使用し、Interet Explorer のキャッシュ、Cookie、ダイヤルアップ UI などとの統合を気にしないアプリ向けに設計されています。
サーバー アプリは間違いなくこのカテゴリに分類されます (WinINet とは異なり、WinHTTP はサーバー アプリで使用しても安全です) が、多くのクライアント ソフトウェアもこれを使用します。たとえば、最新のすべての PC の Windows Update クライアントです。一般に、WinHTTP は、HTTP 経由でファイルをダウンロードする必要があり、ネットワークをより細かく制御する必要があり、独自の UI を制御したいクライアント アプリに適しています。
WinHTTP はより実践的です (たとえば、プロキシ情報を取得するために 1 つの API 呼び出しを行い、そのプロキシ情報を使用するために別の API 呼び出しを行う必要があります)。ユーザーのプロキシ設定を無視して、新しい WPAD 検出を試みます。