Charlesを快適に使うためにやっていること

Charles Web Debugging Proxy とても便利ですよね。

今でこそ、StethoFlipper などの、Androidアプリ側に仕込むライブラリでも事足りるようにもなってきましたが、通信内容の改ざんや特定のリクエストのみ他のサーバに転送したりなど、多岐にわたる機能がとても便利なため、どうしてもこれらのライブラリでは手が届かないところは、Charlesを使い続けています。

そもそも Charles って何なの?どう使うの?といった内容のブログは山程あるので、そういった方はそちらを見ていただくとして、私が紹介したいのは、Charlesをよりストレスフリーに使うためのテクニックをご紹介したいと思います。mitmproxy など、他のプロキシツールでも使えるテクニックです。

Charlesを使いながら面倒だなあと思うこと

Charlesを日常で使っていて面倒なことといえば、プロキシの設定じゃないでしょうか。AndroidWiFiのプロキシを設定しようと思った場合、設定アプリのWiFiの画面を表示して、いま接続しているWiFiのオプションを開き、プロキシを設定するモードにして、IPアドレスを設定して、ポート番号を指定して… となかなかステップ数が多く、モバイルの小さい画面でIPアドレスを打つのはなかなかストレスフルです。そもそもIPアドレスを設定するためには、プロキシサーバになる母艦のIPアドレスを知る必要があるので、ターミナルでifconfig とか打たないといけないですね*1

逆にプロキシを使いたくない時もまた面倒だなあと思うことがあります。プロキシの設定がされたままではAndroid側は通信をすることができないので、母艦でCharlesを立ち上げ続けておく必要があります。Charlesはそんなに軽いアプリケーションというわけでもなく、必要ないときには起動しておきたくないので、モバイル側のプロキシの設定を消す必要があります。 ここで消したら再び使いたいときに、また奥まった機能の小さな画面でIPアドレス打ったりしないといけません。

PAC

日々プロキシの設定をしたり消したりしているうちに、あるオプションに気づきました。

プロキシの自動設定
プロキシの自動設定

プロキシの種類を指定するところに「プロキシの自動設定」とあります。なんとも甘味な響きに胸を打たれ、なんなのかと調べました。 調べてみると、これはプロキシに関する設定を定義として配布できる仕組みだと分かりました。

ja.wikipedia.org

起源はNetscape時代から始まっており、なかなか歴史があるものなのですが、全然知りませんでした。 これを使えば小さい画面でポチポチプロキシの設定することから開放されそうです。

PACをどう書くのか

PACファイルはhttp(s) によってアクセスできる場所に置いておく必要があります。Amazon S3Google Cloud Storageが手軽で適当だと思いました。 そこに次のようなファイルを置くとプロキシが有効になります。

function FindProxyForURL(url, host) {
  if (isPlainHostName(host) || isInNet(host,"127.0.0.1", "255.255.255.255")) {
    return "DIRECT";
  } else {
    return "PROXY 192.168.10.2:8888; DIRECT";
  }
}

PACファイルはJavascriptで記述します。FindProxyForURL という関数によってプロキシを使うかどうかを判定します。 この記述内容であれば、「通信先がローカルホストでなければ 192.168.10.2:8888 をプロキシとして使う」という内容になっています。

逆にプロキシを使わない場合は、次のようなファイルにしておきます。

function FindProxyForURL(url, host) {
  return "DIRECT";
}

DIRECT という文字列を返すと、プロキシを使いません。

詳しい書式は割愛します。プロキシ自動設定ファイル - HTTP | MDN あたりが詳しいです。

あとは、このファイルにアクセスするためのURLをモバイル側のプロキシの設定として設定するだけです。

プロキシの設定
プロキシの設定

日常でPACを使うために

Amazon S3Google Cloud Storageなどにファイルを置くようにすればファイルの更新も容易ですが、IPアドレスを調べたり、ファイルを更新したりといった作業も面倒だと思い、ツールを作りました。

github.com

コマンド一つでPACファイルを通してプロキシの有効/無効を切り替えることができるツールです。 局所的にそこだけコマンドを紹介すると、次のようなコマンドになります。

$ pac enable # プロキシ有効化
$ pac disable # プロキシ無効化

詳しい pacコマンドの設定や使い方は次節に書きます。

pac コマンドの使い方

設定

pacコマンドを使うためには、まず設定をする必要があります。これは、pacファイルをどこに置いておくか、という設定なので、誰しもがやる必要があります。 例えば Amazon S3にファイルを置く場合は次のようになります。

---
s3:
  bucket: your-bucket-name
  path: /

だいたい読み取れるんじゃないかと思いますが、この内容で、 s3://your-bucket-name/yout-name.pac という場所にPACファイルができます*2。 自分の環境に合わせてバケット名やパスを設定できます。

プロキシの有効化

次のコマンドで有効になります。

$ pac enable

内部で aws コマンドを使っているため、あらかじめ認証が通るようにしておく必要があります。

プロキシの無効化

$ pac disable

補足

  • Google Cloud Storageのことも書きましたが、実はサポートしていません。自分が使う範囲で使えるなーと思ったので、公開しました。気が向いたらGCSを対応するかもしれませんが、PR貰えれば嬉しいです。
  • Androidを中心に例を挙げましたが、もちろんiOSでも使うことができます。

最後に

PACファイルという存在を知ってから、プロキシを設定しなくてはならない、解除しなくてはならない、といったシチュエーションでだいぶストレスが減りました。通信内容を確認したいと思ったときに手軽にそれを使うことができるのは、とてもよいものですね。気持ちよく開発をすることができます。

*1:毎回この設定をしなくてはならない、というわけではありません。DHCPによって概ね同じIPがわりふられるようになっているんじゃないかと思うので、設定しなくていいシチュエーションの方がほとんどです。

*2:yout-name.pac にはログインユーザーの名前が入ります