Created
September 20, 2009 17:12
-
-
Save gyuque/189848 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# coding: utf-8 | |
import re | |
import os | |
import cgi | |
import sys | |
import google.appengine.api.users | |
from google.appengine.ext.webapp.util import run_wsgi_app | |
from google.appengine.ext.webapp import template | |
from google.appengine.ext import webapp | |
from google.appengine.api import memcache | |
class RedirectService(webapp.RequestHandler): | |
re_legal_target = re.compile(u'^(([a-zA-Z]+\.itmedia\.co\.jp|[a-zA-Z0-9]+\.ameba\.jp|[-0-9a-zA-Z]+\.fc2\.com)[-_0-9a-zA-Z/]+[-_0-9a-zA-Z]+\.[efgijnp]+)$') | |
def get(self): | |
out = self.response.out | |
target = self.request.get('t') | |
m = RedirectService.re_legal_target.match(target) | |
self.response.headers['Content-Type'] = 'text/plain' | |
if not m: | |
self.error(400) | |
out.write("Bad Request") | |
return | |
self.error(302) | |
self.response.headers["Location"] = u"http://" + m.groups(1)[0]; | |
self.response.headers["Cache-Control"] = "public, max-age=1800"; | |
class ThroughService(webapp.RequestHandler): | |
@classmethod | |
def make_cache_key_pair(cls, url): | |
return ("<contenttype>" + url, "<body>" + url) | |
def get(self): | |
from google.appengine.api import urlfetch | |
from google.appengine.api import memcache | |
out = self.response.out | |
target = self.request.get('t') | |
m = RedirectService.re_legal_target.match(target) | |
self.response.headers['Content-Type'] = 'text/plain' | |
if not m: | |
self.error(400) | |
out.write("Bad Request") | |
return | |
target_url = u"http://" + m.groups(1)[0] | |
keys = ThroughService.make_cache_key_pair(target_url) | |
cached_t = memcache.get(keys[0]) | |
cached_b = memcache.get(keys[1]) | |
referer = '' | |
if target_url.find("itmedia.co.jp") >= 0: | |
referer = 'http://image.itmedia.co.jp/' | |
if not cached_t or not cached_b: | |
ures = urlfetch.fetch(url = target_url, headers={'Referer': referer}) | |
if ures.status_code >= 300: | |
self.error(500) | |
out.write("Internal Error(urlfetch)") | |
return | |
cached_t = ures.headers['Content-Type'] | |
cached_b = ures.content | |
memcache.set(keys[0], cached_t) | |
memcache.set(keys[1], cached_b) | |
self.response.headers['Content-Type'] = cached_t | |
self.response.headers["Cache-Control"] = "public, max-age=1800" | |
out.write(cached_b) | |
# ** entry point | |
def main(): | |
application = webapp.WSGIApplication([ | |
('/redirect', RedirectService ), | |
('/through', ThroughService ) | |
], | |
debug=True) | |
run_wsgi_app(application) | |
if __name__ == "__main__": | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment