Skip to content

Instantly share code, notes, and snippets.

@gyuque
Created September 20, 2009 17:12
Show Gist options
  • Save gyuque/189848 to your computer and use it in GitHub Desktop.
Save gyuque/189848 to your computer and use it in GitHub Desktop.
# 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