Fiddler の Action を HTTP クライアントから実行する*2
HTTP クライアントから Fiddler をいじってみる。
Fiddler2 に付属の ExecAction.exe を使うと、Fiddler の Action を外部から実行することができる。これはコマンドラインアプリから Fiddler をいじることができるわけだが、同様に HTTP クライアントから Fiddler をいじってみる。これによって、たとえば Selenium などのブラウザ主導のテストケース中に、Fiddler の操作も含ませることができる。そうすると Fiddler で HTTP リクエストをいじくれるので、ブラウザ単体では実現できないテストを実現できる。
HTTP リクエストの URL が特定の文字列で始まっていたら、それはプロキシとして中継すべきものではなく、Fiddler に Action を実行する指示だと判断させるようにしてみる。特定の文字列をたとえば “/f/exec/” とする。
まず、CustomRules.js の Handler クラスの定数定義が固まっている (Main() メソッドの下) あたりに、次の行を追加する。
static var gs_ExecPattern: String = "/f/exec/";
この URL にマッチするアクセスがあったときの処理を OnBeforeRequest() メソッドに追加する。実際にリクエストを中継する処理より前にあるほうがいいので、通常は関数の先頭に挿入すればよいと思われる。
var idx = -1; idx = oSession.url.indexOf(gs_ExecPattern); // Case sensitive if (idx>-1){ var sParamString : String = oSession.url.substr(idx + gs_ExecPattern.Length); var sParamsJS = sParamString.split('/'); // JScript Array から System.Array への詰め替え var sParams : String[] = new String[sParamsJS.length]; idx = 0; for (var key in sParamsJS) { sParams[idx] = sParamsJS[key]; idx++; } OnExecAction(sParams); //addStringToCustomColumn(oSession, "->f[" + sParamString + "]"); oSession.oRequest.FailSession(200, "Blocked", "->f[" + sParamString + "]"); }
URL を “/” で split し、QuickExec や ExecAction でも使われている OnExecAction() を呼び出す。そして、HTTP リクエストを実際にサーバに中継せず、Fiddler で折り返すために FailSession() メソッドを利用している。
このような CustomRules.js を書いて、Proxy として Fiddler を指定したブラウザから http://fiddler.site21.net/f/exec/bpu/test にアクセスすると、QuickExec で bpu test とやったのと同じ効果が得られる。
とりあえずやりたことはできているが、次の点はもっとスマートな方法があると思われる。
前者は JScript.NET 一般の話。後者は Fiddler 固有の話。