2009年5月19日火曜日

reverse proxy on GAE

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
本体をローカルで動かしてなぜGAE上でアプリを作らないのは、PILが使えないとか、いろいろ。注意点はurllib.urlopenがsocketを使うので、GAE上では使えない。そのため、urlfetchを使う。あとは、ハンドラで.*を指定してリクエストを全部持ってくること。

普通のproxyもつくれるね。もう作った人がいるだろうけど。
#!/usr/bin/python

import urlparse
import wsgiref.handlers

from google.appengine.ext import webapp
from google.appengine.api import urlfetch

cache_related = ('if_match', 'if_modified_since', 'if_none_match', 'if_range', 'if_unmodified_since')

NETLOC = 'image.backgammonbase.com'
SCHEME = 'http'

debug = False

class ReverseProxyHandler(webapp.RequestHandler):
def get(self):
scheme, netloc, path, query, fragment = urlparse.urlsplit(self.request.url)
t = urlparse.urlunsplit((SCHEME, NETLOC, path, query, fragment))
if debug:
self.response.out.write(t)
else:
response = urlfetch.fetch(t)
self.response.headers['Content-Type'] = response.headers['Content-Type']
self.response.out.write(response.content)

def main():
application = webapp.WSGIApplication([('.*', ReverseProxyHandler)],
debug=True)
wsgiref.handlers.CGIHandler().run(application)

if __name__ == '__main__':
main()

0 件のコメント: