Fiddlerでリクエストのホスト名を自動的に変換するプラグイン


HTTPリクエストのホスト名をさくっとスタブに切り替えたい

JavaScriptのXMLHttpRequestの呼び出し先を外部サーバから社内のスタブサーバに切り替えて試験を行う必要がありますが、リクエストのホスト名が他社から提供されたJavaScriptのソースにハードコーディングされており、こちらで修正ができなかったので、Fiddler(Proxy型の HTTPデバッガ)を使ってHTTPリクエストをインターセプトしてホスト名を自動的に変換します。
「FiddlerScript」という標準で用意された機能を用いればやりたいことは実現できますが、変換の「有効/無効」をかんたんに切り替えたかったので、プラグインとして開発します。

新規プロジェクトを作成する

今回、利用したIDEは「Visual Studio Community 2015」です。
以下の内容のプロジェクトを新規作成します。
・Visual C# クラスライブラリ
・NET Framework3.5
・AnyCPU(Fiddlerが64bitの場合)

その後、「参照の追加」でFiddler.exeを追加します。
なお、Fiddlerのバージョンは「2.6.2.0」を利用しています。

ユーザコントロールを作成する

今回のプラグインは、タブページとしてFiddlerに組み込むので、ユーザコントロールを作成します。
作成した画面は以下の通りです。

機能の「有効/無効」を制御するチェックボックスと、変更前、変更後のリクエストホスト名をテキストボックスで入力できるようにしています。
ログはデバッグ用なので、機能には関係ありません。
コードとしては、チェックボックス押下時に表示内容を切り替える程度の記述しかしていないので特筆することはありませんが、後述する別クラスからチェックボックス、テキストボックスのコンポーネントにアクセスできるように、Designer.csにコンポーネントのgetterを追記しました。

IAutoTamperを拡張したクラスを作成する

先ほど、参照を追加したFiddlerのアセンブリにIAutoTamperというインタフェースが用意されているので、それを拡張したクラスを作成します。以下、ソースコードです。

RequestHostEdit.cs
using System;
using System.Windows.Forms;
using Fiddler;

[assembly: Fiddler.RequiredVersion("2.6.2.0")]
namespace FiddlerExtend
{
    public class RequestHostEdit : IAutoTamper
    {
        private TabPage oPage;
        private RequestHostEditView oView;

        public void OnLoad()
        {
            this.oPage = new TabPage("ChangeHostName");
            this.oView = new RequestHostEditView();
            this.oPage.Controls.Add(this.oView);
            this.oView.Dock = DockStyle.Fill;
            FiddlerApplication.UI.tabsViews.TabPages.Add(this.oPage);

        }
        public void OnBeforeUnload() { }

        public void AutoTamperRequestBefore(Session oSession)
        {
            if (this.oView != null && this.oView.EnabledCheckBox.Checked)
            {
                this.oView.LogTextBox.Text = "START \r\n";
                this.oView.LogTextBox.Text += "【変更前】oSession.host : " + oSession.host + "\r\n";

                if (oSession.host == this.oView.BeforeRHostTextBox.Text)
                {
                    oSession.host = this.oView.AfterRHostTextBox.Text;
                    this.oView.LogTextBox.Text += "【変更後】oSession.host : " + oSession.host + "\r\n";
                }
                this.oView.LogTextBox.Text += "END \r\n";
            }
        }

        public void AutoTamperRequestAfter(Session oSession) { }
        public void AutoTamperResponseBefore(Session oSession) { }
        public void AutoTamperResponseAfter(Session oSession) { }
        public void OnBeforeReturningError(Session oSession) { }
    }
}

OnLoadメソッドは、Fiddlerの起動が完了し、UIにアクセス可能になった時点で呼ばれるようなので、このメソッド内でタブページ(oPage)を新規作成し、そのタブに先ほど作成したユーザコントロール(oView)を追加しています。
また、OnBeforeUnloadメソッドは、Fiddlerの起動が終了する際に呼ばれるそうです。後処理が必要な場合に拡張すればいいと思います。

AutoTamperRequestBeforeメソッドはユーザがFiddlerのInspectorsでリクエストを編集する前、AutoTamperRequestAfterメソッドはリクエストを編集した後、実際に送信される前に呼び出されるそうです。
今回はどちらでもよかったので、AutoTamperRequestBeforeメソッドにホスト名を変換する処理を記述しています。なお、この処理はUIとは別スレッドでバックグラウンドで動作し、OnLoadが完了する前に呼び出される可能性があるため「if (this.oView != null・・・」というnullチェックをしています。

なお、インタフェースのドキュメントはImplement Fiddler Interfacesで確認できます。

ビルドしたライブラリをFiddlerに組み込む

ビルドしたDLLファイルをFiddlerに組み込むため、Fiddlerのインストールディレクトリ内にあるScriptsディレクトリに配置します。
Create Fiddler Extension Projectで紹介されているように、ビルド後のイベントにcopyコマンドを記述したら楽だと思います。

完了

以上で、プラグインの開発は完了です。
Fiddlerを起動したら、タブページが追加され、リクエストのホスト名を自動的に変換できるようになりました。
#「stubhost:8080」なんてサーバはいないらしいので、画面例で502エラーになっているのはご愛嬌。

参考

Fiddler Documentation - Extend Fiddler with .NET Code