Macにdolipoを導入してついでにPACファイルを作ってみた

Macでプロキシとして動作して、webページの読み込みを体感出来るくらい早くするらしいdolipoを*1入れてみました。まぁpolipoについてはMacのネット環境高速化「dolipo」はナゼこんなに速いのか | Creazy!とかhttp://blog.motoraji.com/766/とか。

PACファイル

dolipoはプロキシなわけで、プロキシとして設定しないと使えないわけだけど、設定しようとしたらPACファイルを使って設定してみたくなりました。PACファイルはproxy auto configuration fileで、自動プロキシのための設定ファイルです。Windowsでも、なんて書いてあったか覚えてないけど自動プロキシ的な設定項目があったと思うけど、基本同じものだそう。

proxy.pac
function FindProxyForURL(url, host){                                                                
var proxy_on = 'PROXY 127.0.0.1:8123';
var proxy_off  = 'DIRECT';

    if (isPlainHostName(host)) return proxy_off;
    if (url.substring(0, 4) == 'ftp:') return proxy_off;
    if (dnsDomainIs(host, '2ch.net')) return proxy_off;
    if (localHostOrDomainIs(host, 'idisk.mac.com')) return proxy_off;
    if (isInNet(host, '10.0.0.0', '255.0.0.0') ||
        isInNet(host, '127.0.0.0', '255.0.0.0') ||
        isInNet(host, '169.254.0.0', '255.255.0.0') ||
        isInNet(host, '192.168.0.0', '255.255.0.0')
      ) { return proxy_off; }

    return proxy_on;
}

探してみたらpolipo(dolipo)向けproxy.pac - otsune's SnakeOil - subtechがあったので、ほぼそのままです。不要そうなのを消したり、多少好みの書き方に変えたりはしました。どうやらPACファイルはJavaScriptで書くものらしいですが、使われている関数について、あまり情報がないです。なので、とりあえず自動プロキシが働く状態を目指して、あまり変えずに使わせてもらいました。動く状態になっていれば、動きを変えたくなったときに試してみやすいかなという事で。

リファレンス
JavaScript関数
  • ホスト名関連関数
    • isPlainHostName()
    • dnsDomainIs()
    • localHostOrDomainIs()
    • isResolvable()
    • isInNet()
  • ユーティリティ関数
    • dnsResolve()
    • myIpAddress()
    • dnsDomainLevels()
  • URL/ホスト名関連関数
    • shExpMatch()
  • 時刻関連関数
    • weekdayRange()
    • dateRange()
    • timeRange()
Netscape Proxy autoconfig

あまり良い情報源が無かったけど、ここが見やすかった。どんな動きをするのかちょっとつかみきれないけど、一応関数は全部*2載ってるし、他の情報源はこのエントリと同様かいつまみっぽいので。

補足

PACファイルってデバッグどうすれば良いんだろう?console.log()は当然使えないだろうしなぁ。hosturlに何が入ってるのか見てみたい。

あと、PACファイルを編集したら、Network.prefPanelで適用しなおさないと反映されません。シンタックスエラーは試さなかったけど、間違えてるとプロキシと押さずにブラウジング出きるだけなので、間違いに気が付きにくいです。dolipoを落としておいて、プロキシにアクセス出来ないって書いてあるエラーページが出るならちゃんと書けてると判断する方が分かりやすかった。

環境

Mac Mac OS X 10.5.8(Leopard
dolipo 1.0.8.3

*1:dolipoはpolipoのフロントエンドですが

*2:だと思う