HttpListenerを使ってFiddlerCoreを代替してみた

今年の春先にFiddlerCore艦これの専ブラに使うのはライセンス的にダメなんちゃうって話が出たので、KCBrで使っていた部分だけを代替するものを.NET Frameworkが持ってるHttpListenerを使ってさくっと作って取っ替えました。

最初はTcpListnerでも少し書いてたけど、既に十分検証されていて使用可能なコードがあるのに自分で書くのは馬鹿すぎるので止めました。

およその流れ

コードの殆どはこの記事から持ってきました。d.hatena.ne.jp

というわけで、この記事で書くのは自分で作った部分だけ。

ちなみにソースコード700行もいかないシンプルなものなので、gistに貼ってあります

WebRequestの自動リダイレクト処理を殺す

HttpWebRequest.AllowAutoRedirect の規定値がtrueなので、このままだとOpenSocialのログインシーケンス中にあるリダイレクトを勝手にHttpWebRequestが処理してブラウザ側のログイン処理が途中で止まってしまいます。

BeforeRequestとAfterSessionCompletedイベントを作る

Webサーバへリクエストを投げる前に呼ばれるBeforeRequestと、Webサーバからのレスポンスを返し終わった後に呼ばれるAfterSessionCompletedを実装しました。

イベントに渡すセッションオブジェクトを作る

あんまりまじめに作ってませんが、前述のイベントに渡し、内部で処理するために最低限必要なセッション情報をハンドルするクラスを作りました。

使い方は(難しくないので)省略。

IEプロキシの設定

コードやHttpListenerの説明を読めばわかりますが、あくまでhttpプロキシであってhttpsはハンドルしていません。なので、単純にInternetSetOptionへ渡すとhttpsリクエストが飛んだ段階で処理が止まります。艦これのログイン時はDMMのhttpsサーバを叩くのでこれはまずい。

まずいので、WinINetのドキュメントにあるようにプロトコルごとに使うプロキシを変えるよう設定します。

To list a proxy for a specific protocol, the string must follow the format ""<protocol><protocol>://<proxy_name>"".

最初の一文何故かプロトコル名とホスト名の間にある"="が消えてますが、要するに「http=http://localhost:8823」って書けばhttpのときだけプロキシを使ってくれます。空白で区切って複数定義できると書いてあるので、上流にプロキシがある場合は「http=http://localhost:8823 https=https://proxy_host:8823」とでも書けば良さそう。