• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env python
2#
3# Copyright 2014 The Chromium Authors. All rights reserved.
4# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
6from google.appengine.api import memcache
7from google.appengine.api import urlfetch
8import webapp2
9
10import base64
11
12"""A simple appengine app that hosts .html files in src/styleguide/c++ from
13chromium's git repo."""
14
15
16class MainHandler(webapp2.RequestHandler):
17    def get(self):
18        handler = GitilesMirrorHandler()
19        handler.initialize(self.request, self.response)
20        return handler.get("c++11.html")
21
22
23BASE = 'https://chromium.googlesource.com/chromium/src.git/' \
24       '+/master/styleguide/c++/%s?format=TEXT'
25class GitilesMirrorHandler(webapp2.RequestHandler):
26    def get(self, resource):
27        if '..' in resource:  # No path traversal.
28            self.response.write(':-(')
29            return
30
31        url = BASE % resource
32        contents = memcache.get(url)
33        if not contents or self.request.get('bust'):
34            result = urlfetch.fetch(url)
35            if result.status_code != 200:
36                self.response.set_status(result.status_code)
37                self.response.write('http error %d' % result.status_code)
38                return
39            contents = base64.b64decode(result.content)
40            memcache.set(url, contents, time=5*60)  # seconds
41
42        if resource.endswith('.css'):
43          self.response.headers['Content-Type'] = 'text/css'
44        self.response.write(contents)
45
46
47app = webapp2.WSGIApplication([
48    ('/', MainHandler),
49    ('/(\S+\.(?:css|html))', GitilesMirrorHandler),
50], debug=True)
51