HTTP User-Agent によるエラー :-)
HTTPでUser-Agentって以外と重要な位置にあることに気付いた。本来、User-Agentというのはブラウザやプロキシサーバ・ロボット等のソフトウェア情報が付加されるヘッダだ。以下のような内容になる。
User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) ...(省略)
事実、RFC2616 section 14.43に以下のような既述もある。
エージェントやユーザエージェントの重要な付属製品を識別するためのコメントを含める事ができる
RFC2616 section 14.43(邦訳:Studying HTTP RFC2616)
だから、自作のプロキシサーバも慣例に従って、User-Agentにソフトウェア名を付加した。そうしたら第一のエラーが…。
第一のエラーはMacOSXのMail.appにインストールしたhotmailクライアントプラグイン。どうやらhotmailサーバはUser-AgentがEntourageで始まらないとエラーを返すようだ*1。このプラグインではそれを騙すためにEntourageを付けていたようである。それをプロキシで書き変えたから、エラーになってしまった。
先頭がEntrourageになれば良いのならば、と、User-Agentの最後にソフトウェア名を付加してみた。案の定、いつも通り動く。が、ここで第二のエラーが…。
第二のエラーはSourceForge.JPのログイン画面で起きる。ユーザ名とパスワードを入力して、送信ボタンを押すと失敗はしないのに、自分の名前が表示されない(つまり、ログイン出来ていない)。ただし、『ログイン後もSSLモードのままにする』をONにすると、正常に動作する(HTTPプロキシを介さないので当たり前)。これにかなりはまった。リクエスト/レスポンスヘッダを監視しても正常にクッキーの受け渡しが行なわれているし、他の問題も見えない。
めんどくさいから結論。 これもUser-Agentが問題だったようだ。もしかしたらSourceForgeのセッション管理にUser-Agentを使っているのかもしれない。次のような手順でログインの失敗を説明できる。
# なお、HTTPでは自作プロキシを通過するが、SSLでは通過しないことに注意。分かりにくくてすいません。
- HTTPでログインページへアクセス。
- 必要事項を記入後、『ログイン後もSSLモードにする』をOFFにする。
- このフォームはSSLで通信するので、プロキシを通らずに認証を行なう。プロキシを通らないので、User-Agentはブラウザの送信したものがそのまま使用される。
- ログインに成功したので、LocationヘッダでHTTPのページへ飛ばされる。
- 飛ばされる際はHTTPプロキシを通過するので、User-Agentにソフトウェア名を付加。
- 認証時(SSL時)とUser-Agentが違うので、ログインが失敗になる。
こんな感じだと思われる。実際、他のプロキシサーバでも同様の現象でログイン出来ないことを確認した。ただ、それでは常用できるソフトウェアとはいえないので、ヘッダは極力触らないで、ひっそりと稼動する方向に決定。
*1:もしかしたら含むだけでも良いのかもしれない。