Wed, September 23, 2009
GAEとAppletの組み合わせ、Appletのセキュリティ制限を回避するために urlfetch を使って...
Appletはセキュリティ上の制約から、 配信元ホスト以外とはネットワーク接続を確立できないため、Appletから外部のサーバにあるリソース (たとえば画像)をロードしようとしても失敗する。
そこで、この制約を回避するための一つの方法は、 配信元ホストを経由して外部サーバのリソースを取得すること。
GoogleAppEngine上で作動させていた場合に、GoogleAppEngineに 外部サーバリソース取得させて結果をそのままAppletに転送するコードを書くにはどうしたらいいか、という話。
コード
urlfetch を使えば簡単に実現できた。 (とりあえず画像リソースを転送するだけならば)
urlfetchの概要 や urlfetchして得られたオブジェクトの内容 についてはGoogleAppEngineのそれぞれのページを参照のこと。
from google.appengine.ext import webapp
class TransferPage(webapp.RequestHandler):
def get(self):
url = cgi.escape(self.request.get('url'))
if url :
r=urlfetch.fetch(url)
self.response.headers['Content-Type'] = r.headers['Content-Type']
self.response.out.write( r.content )
#print r.headers.keys()
#print 'Content-Type: '+ r.headers['Content-Type']
#print r.content
application = webapp.WSGIApplication([('/transfer', TransferPage)],debug=True)
def main():
run_wsgi_app(application)
if __name__ == "__main__":
main()
作動テスト
テスト環境では、ブラウザのURL欄に以下を入力して試す。
http://localhost:8080/transfer?url=http://foobar.net/foobar.png