2012年3月10日土曜日

GAEでプロキシを作ってみよう

…としたけれど、試行錯誤の結果、不可能なことが判明。残念。

まあ、十分下調べもせずに(しかもPython本も全部オフィスに忘れきてるし)ビール飲みながら何となく始めたので、仕方ないというか、それほどがっかりしているわけでもないんだけど、まあ、やっぱり残念といえば残念。

まず、どんなものを作ろうとしていたかというと、GoogleAppEngineでは、誰でも無料でサーバ証明書の恩恵にあずかることができるので、
[ブラウザ] ← (HTTPS) → [プロキシ on GAE] ← (HTTP) → [任意のWebサーバ]
という俺専用プロキシが実装できるんじゃないか、と。
ローカルネットワークが監視されてたりする環境だと、(やましいことをしていなくても)なんか気分良くないじゃないですか。そんな時に、ね。

それで、どんな狸の皮算用だったかというと…

  1. まず、最初にフォームのPOSTで行き先URLを指定してGAEアプリに渡す。
  2. GAEの対応する入口アプリが、そのPOSTデータを元に、"http://<GAEアプリのベースURL>/proxy?<http://行き先URL>"に変換する。その際、うまく行き先URLをエスケープしてやる必要有り。
  3. GAEの"/proxy"に定義されたProxyアプリが、リクエストURLのクエリ部分で示された行き先URL(なんか文章にするとややこしいな)に、リクエストを投げる。
  4. Proxyアプリは、オリジンサーバからのレスポンスを、ブラウザに返す。ただし、コンテンツがHTMLドキュメントの場合は、ドキュメント中のURL(相対URLも)を"http://<GAEアプリのベースURL>/proxy?<http://絶対URL>"に変換してやる。画像ファイルなんかも含めて全て。完璧にやろうとすると結構大変。間違いない。
  5. その後、HTMLドキュメントに含まれる画像などをブラウザが勝手に取りに行くので、3〜4が繰り返されることになる。

ところが、以下のような制限により、レスポンスのContent-Typeを自由に設定できない("text/html"には勝手に"charset=utf-8"が追加されちゃうし)など、致命的な問題があり、上記の目論みは海の泡と消えたのでした。
http://code.google.com/intl/en/appengine/docs/python/tools/webapp/responseclass.html

ちなみに、もっと低レイヤーでのコントロールはもちろん(GAE上では)できない。


面白そうだと思ったんだけどな〜。

0 件のコメント:

コメントを投稿