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 Array から System.Array への詰め替える方法
  • リクエストを Fiddler で折り返す方法

前者は JScript.NET 一般の話。後者は Fiddler 固有の話。