概要
本記事では Web デバッグ用のプロキシツールの Fiddler Classic の AutoResponder 機能を使って、ある URL へのリクエスト結果を Fiddler がインターセプトして、別の URL へのリクエスト結果としてのレスポンスを、あたかも通常のレスポンスかのように、代わりにクライアント側に返す方法をご紹介します。
(かなり雑なイメージを伝えると、ある URL へのリクエストを別の URL へのリクエストにクライアント側に気づかれないように Fiddler 側で書き換えるようなイメージです)
具体的には、AutoResponder の Rule Editor の Regular Expression Replacement Group expressions in the Action (アクションで利用できる正規表現置換グループ表現) という機能を使って、例えば http://aaa.com/bbbbb/~~~ のリクエストが来たら、http://ccc.com/~~~ のように前方一部だけを書き換え、他の URL からの代わりのレスポンスをクライアント側に返します。
例えば、検証のために、あるクライアントアプリから Fiddler 経由で、同じ FQDN や途中まで同じパスの URL へのリクエスト群を Fiddler プロキシで、一時的に検証用の URL リンクに捻じ曲げてそちらからレスポンス結果を返すようにしたいというときに AutoResponder は利用できます。
もちろん地道に 1 個 1 個登録してもいいですが、いくつも書き換えパターンが同じものを登録するのは非効率なので、正規表現と Regular Expression Replacement Group expressions (正規表現置換グループ表現) を利用して、出来る限り少ないルールでそれを設定します。
前書き : Fiddler Classic
Fiddler Classic は HTTP および HTTPS トラフィックをログ記録できる Web Debugging Proxy ツールです。HTTPS の復号にも対応している点 (要設定) も便利です。Fiddler Classic のセットアップやシンプルなキャプチャの方法は以前の記事の以下を参照ください。
AutoResponder 機能
また、Fiddler Classic には通常のプロキシ/キャプチャ機能に加えて、Fiddler の AutoResponder という機能があります。
AutoResponder という機能は、あるリクエストをサーバーにプロキシとして転送する代わりに、例えばローカル ディスクのファイルや別の URL のリクエスト結果のレスポンスを、あたかも通常のレスポンスのようにクライアントに返すことができます。
以下を見て頂くとイメージがわくかもしれません。
既に上記に大枠の手順や説明等は纏まっているので、この記事では、深く追求しませんが、AutoResponder のルールを有効化し設定した上で Fiddler がキャプチャ中であれば、例えば、以下のように http://aaa.com/bbb というリクエストが来たら、 http://ccc.com/bbb のレスポンスを代わりにクライアント側に返すということが可能です。
<Rule Editor>
マッチ条件 : EXACT:http://aaa.com/bbb
アクション : http://ccc.com/bbb
<イメージ画像>
AutoResponder の高機能 : 正規表現と Regular Expression Replacement Group expressions を使って部分一致の結果をアクション側でも利用する
それでは、例えば、前方からある部分まで部分一致のリクエストをした場合に、その前の一致部分だけを書き換えて、後方のパスはそのまま維持してレスポンスを代わりに返す URL を書き換えたいといった場合にはどうすればよいのでしょうか? 例えば、http://aaa.com/bbb/~~~ のリクエストが来たら、http://ccc.com/~~~ のように一部を書き換えたいという要件です。
実は Fiddler Classic の Rule Editor では正規表現を使えることに加えて、Regular Expression Replacement Group expressions というものがあります。これは、その正規表現の任意の一致部分に任意のグループ名を付与することができます。さらに、そのグループ名を Rule Editor のアクション (Action) に利用することができます。
具体的には、以下の例のようにマッチするルールと、アクションを設定することができます。
ルールを正規表現で case-sensitivity で定義する場合は先頭に regex:(?insx) とし、さらに本題の達成のためには、部分一致で名前付けしたい箇所に、'変数名' としておきます。それをアクション側で ${変数名} として利用することができます。
以下の例では path という変数名を付けて、アクション側でそれを利用しています。
<Rule Editor>
regex:(?insx)http://aaa.com/bbb/(?'path'.*)
http://ccc.com/${path}
これにより、この例では、http://aaa.com/bbb/~~~ のリクエストが Fiddler プロキシに来たら、http://ccc.com/~~~ のように一部だけを書き換え、一部のパスはそのままに、他の URL からのレスポンス結果を代わりにクライアント側に返すことが可能です。
本記事は以上です。本記事では一部のみの機能を紹介していますが、以下にも他の例なども載っているのでぜひ興味があれば閲覧いただければと思います。