英語で読もう
GAE(Google App Engine)上のTwitterクライアント、一つ放置してた問題に対応。それはsearch apiの回数制限。他のAPIはユーザベースでrate limitされているのでログインしていればAPI制限に引っかかる事はまずないんだけど、search apiだけはTwitter側でリクエスト元のIPアドレスベースでrate limitしている・・・のでGAEのインスタンス共有している他ユーザーがsearch api叩きまくってるとすぐにlimitにひかっかる。ちょっとネットを彷徨った感じsearch apiだけは別鯖へproxyしろっていうのがgoogle様のお告げの様でその様に。
とはいえ別鯖ってOpenProxy使うって訳にも行かないのでVPSに飛ばしてと思ってたら…という所で本題。
VPS上(つまりこのサーバ)ではapacheが上がってます。apacheのmod_proxy辺りでGAEから受けてsearch.twitter.comへ転送しても良いんだけどmod_proxyは一般的かつ便利なだけにまじめに設定しないと穴になることも多く…と避けて単純にstoneで転送させる方針で=つまりapacheの80番ポートとは別ポートで。と思ったらGAEのurlfetchのドキュメントに以下書かれてます。
URL は、HTTP(80)および HTTPS(443)の標準ポートを使用しなければなりません。ポートはスキーマによって決まりますが、ポートがスキーマの標準である限り、URL で指定することもできます(https://...:443/)。アプリケーションはリモート ホストの任意のポートに接続することはできません。また、スキーマの非標準ポートを使用することもできません。
うーん、と思って早半年(笑)ふと思い立って英語のドキュメントを見ると。
An app can fetch a URL using HTTP (normal) or HTTPS (secure). The URL specifies the scheme to use: http://... or https://...
The URL to be fetched can use any port number in the following ranges: 80-90, 440-450, 1024-65535. If the port is not mentioned in the URL, the port is implied by the scheme: http://... is port 80, https://... is port 443.
なんじゃそりゃー。という事でtweepyのsearch apiの投げ先をここにしてstoneをほにゃっ※1て無事search復活。長い半年でしたwwwww
意欲的に翻訳されてて日本語ドキュメントが存在するのは良いことなんだけど旬なものは更新早いから?と思ったら英語版ドキュメントを確認すべしっていうのは個人的には鉄則なんだけどGAEのドキュメントってAccept-Languageみて自動的に日本語へリダイレクトされちゃうのが難。今は日本語ドキュメントからURL書き換えて飛んでいます。
日:http://code.google.com/intl/ja/appengine/docs/python/urlfetch/overview.html
英:http://code.google.com/intl/en/appengine/docs/python/urlfetch/overview.html
※1 twitter側でHTTPヘッダのHost:フィールド参照しているのでその書換えが必要。書き換えないと301食らいます。これもGAEの制限で飛ばし先とHost:フィールドは必ず一致する仕様なので(Host:フィールドは変更できない)仕方なし。stoneは標準でヘッダ追加は対応していますが書換えは対応していないのでほにゃっとコードでっち上げて…