gyuque (owner)

Revisions

gist: 189848 Download_button fork
public
Public Clone URL: git://gist.github.com/189848.git
Embed All Files: show embed
Python #
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# 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()