Lazy Diary @ Hatena Blog

PowerShell / Java / miscellaneous things about software development, Tips & Gochas. CC BY-SA 4.0/Apache License 2.0

続・ WEBrick で広告ブロッカー

WEBrick で広告ブロッカーを作成して、使ってたまではよかったんだけど、

  • 大きいファイルをダウンロードすると、ルータにしているノートPCが落ちる
  • YouTube とかの動画の再生が始まるまでが長い

ということに気がついた。

これは

  • どのサイトのページでも、どんな content-type のファイルでも、必ず一度 proxy のプロセスを通る(ように設定している)
  • WEBrick がファイルの内容を全部受けとってからブラウザ側に流している(らしい)

のが原因みたい。

ということで、「アクセス先やファイルの種類によっては proxy を通さずアクセスする」という方法を、 proxy.pac (自動プロキシ設定ファイル)を作成して実現。

ファイルは基本的には JavaScript ファイルで、内容はこんな感じ(コメントは追加)。
自作 proxy は、 192.168.0.1 で 8080 を listen してます。

function FindProxyForURL(url, host) {
  if ( shExpMatch(url, "http://*") ) {
  // HTTP にのみ注目、それ以外のプロトコルは素通りにする

    if ( isInNet(host, "10.0.0.1"     , "255.0.0.0"  )
      || isInNet(host, "127.0.0.0"    , "255.0.0.0"  )
      || isInNet(host, "192.168.0.0"  , "255.255.0.0"  ) ) {
      // private network へのアクセスはスルー

      return "DIRECT";

    } else if ( shExpMatch(host, "*youtube*")
           || shExpMatch(host, "*stage6*") ) {
      // YouTube, stage6 はアクセス速度低下に繋がるため
      // スルー

      return "DIRECT";

    } else if ( shExpMatch(url, "*.zip*")
             || shExpMatch(url, "*.exe*")
             || shExpMatch(url, "*.cab*")
             || shExpMatch(url, "*.gz*")
             || shExpMatch(url, "*.lzh*")
             || shExpMatch(url, "*.bz2*")
  
             || shExpMatch(url, "*.flv*")
             || shExpMatch(url, "*.swf*")
             || shExpMatch(url, "*.divx*")
  
             || shExpMatch(url, "*.js*")
  
             || shExpMatch(url, "*.jpg")
             || shExpMatch(url, "*.png")
             || shExpMatch(url, "*.css")
             || shExpMatch(url, "*.gif")
      ) {
      // 上記のファイルは見ても仕方がないのでスルー
      // (.html だけを対象に見ればいいかというと、 cgi やら
      //   php やら何やかんやがあるのでホワイトリスト方式に)

      return "DIRECT";

    } else {
      // 上で除外したもの以外は proxy を通す

      return "PROXY 192.168.0.1:8080";

    }
  } else {
    return "DIRECT";
  }
}


このへんのページを参考にしました。
http://ash.jp/freebsd/proxy_auto.htm
http://homepage1.nifty.com/yito/anhttpd/faq/autoproxy.html
http://wp.netscape.com/eng/mozilla/2.0/relnotes/demo/proxy-live.html