OS問わず、HTTPアクセスするネイティブアプリを作ろうとすると避けて通れないのがプロキシの設定です。
プロキシのために一体どんな設定項目を設けてどうプログラミングすべきかについて一応の答えをまとめましたのでご参考までに。
前提、プロキシ情報とは
プロキシ設定情報とはHTTPアクセスするときに使うプロキシのURL、ぐらいに思っていたこともありました。
しかしそう単純ではない。除外アドレスというものが必ずありますし、http:, https:, ftp:それぞれのプロトコルで別々のプロキシを使わないといけないかもしれない。
そういういろいろも含めると、プロキシ設定情報とはこうだと言えます—— アクセス先URLを受け取ってプロキシURLを返す関数 であると。
急に観念的な話をしたみたいで驚かせてしまったらすみません。しかし関数だってのは本当で、実際にJavascript で関数を記述してそれをプロキシ設定にだってできるんです。
ではまずはそれの話から。
PAC - Javascript関数定義によるプロキシ設定
JSでFindProxyForUrlという関数を記述したファイルを書くと、それはプロキシ設定として機能します。WindowsでもMacでもスマホOSでも。この設定形式をPAC(Proxy Auto-Config)と呼びます。
Windowsならインターネット オプションの画面から「自動構成スクリプト」として登録できます。
このダイアログだと上から二番目のところですね。PACファイルをURLで指定します。http:// も file:// も両方使えていいのですが、 file:// は推奨されていません。
WPAD - PACの配信
上述したPACファイル、通常はユーザーが自分でマシンに設定する機会はあまりありません。なぜなら、LAN内で配信して各マシンは自動取得するように構築できるので、そうすることが多いからです。この配信規格がWPAD(Web Proxy Autodiscovery)です。
詳しくは別途調べてもらうとして、
- DHCPでオプション情報としてPACアドレスを配る
- http://wpad.(組織内ドメイン)/wpad.dat というリソースを読みに行く
のどちらかの方法でPACを手に入れます。
Windows の場合だと「設定を自動的に検出する」にチェックを入れることで利用できるようになります。
つまりプロキシ設定の画面構成は
プロキシ設定を入力させるに当たって考慮点は以上のようなものがあるわけです。これに、単純なプロキシアドレス入力も含めるとどう整理できるか。
まず、判断のフローです。与えられたURLに対してプロキシが必要か、必要ならどこを使うかは、
- WPADは有効か。有効なら、PACファイルの取得に成功したか。 → 取得したPACに従って判断
- PACアドレスの直接指定はあるか。あるならそこからPACファイルの取得に成功したか。 → 取得したPACに従って判断
- プロキシURLと除外アドレスの直接指定はあるか。 → これらから判断
と、こういう判断を踏まないとなりません(以上を自分でプログラミングする必要があるとは限りません。Win32だとまとめてやってくれるAPIコールが用意されています)。
ともかくこれらの判断に必要な入力項目を組み上げると、こうなります。
- ☑プロキシの自動取得をする
- ☑プロキシ構成スクリプトを指定する【入力欄】
- ☑プロキシサーバを指定する【入力欄】 除外アドレス【入力欄】
結局のところ、OSの設定ダイアログとほぼ同じ構成になりました。
それに加えて、アプリの場合は「OSの設定に従う」という選択肢があるはずですね。それも加えると、こう。
- ☑OSのプロキシ設定に従う(ONだと以下3項目がグレーアウト)
- ☑プロキシの自動取得をする
- ☑プロキシ構成スクリプトを指定する【入力欄】
- ☑プロキシサーバを指定する【入力欄】 除外アドレス【入力欄】
簡易版、ユーザーにあまりプロキシについて難しいことを考えさせたくない場合などは
- ☑OSのプロキシ設定に従う(ONだと次項目がグレーアウト)
- ☑プロキシサーバを使用する【入力欄】
という風になりますか。OSのプロキシ設定に従う場合は、WPAD,PACも含めた正式な判断が走りますが手動設定だと使うか使わないかだけです。
プログラミング
Win32の場合、必要な入力項目を揃えればあとは次の2つのAPIですべきことが全部できます。
- WinHttpGetIEProxyConfigForCurrentUser 関数: OSのプロキシ設定を取得します
- WinHttpGetProxyForUrl 関数: プロキシの各種設定とアクセス対象URLを引数に、プロキシを使用するか・使用するならどれかを返します
最後に - 「プロキシを自動検出する」という言葉に気をつけて!
「プロキシを自動検出する」といった場合、
- OSからプロキシ設定を取得する
- LANからプロキシ設定を取得する
というレイヤーの違う別々の自動を意味する場合があります。自動検出と言われた場合、意味の確認をお忘れなく。