|  | #!/usr/bin/env python | 
|  | # | 
|  | # Copyright 2014 The Chromium Authors. All rights reserved. | 
|  | # Use of this source code is governed by a BSD-style license that can be | 
|  | # found in the LICENSE file. | 
|  | from google.appengine.api import memcache | 
|  | from google.appengine.api import urlfetch | 
|  | import webapp2 | 
|  |  | 
|  | import base64 | 
|  |  | 
|  | """A simple appengine app that hosts .html files in src/styleguide/c++ from | 
|  | chromium's git repo.""" | 
|  |  | 
|  |  | 
|  | class MainHandler(webapp2.RequestHandler): | 
|  | def get(self): | 
|  | handler = GitilesMirrorHandler() | 
|  | handler.initialize(self.request, self.response) | 
|  | return handler.get("c++11.html") | 
|  |  | 
|  |  | 
|  | BASE = 'https://chromium.googlesource.com/chromium/src.git/' \ | 
|  | '+/master/styleguide/c++/%s?format=TEXT' | 
|  | class GitilesMirrorHandler(webapp2.RequestHandler): | 
|  | def get(self, resource): | 
|  | if '..' in resource:  # No path traversal. | 
|  | self.response.write(':-(') | 
|  | return | 
|  |  | 
|  | url = BASE % resource | 
|  | contents = memcache.get(url) | 
|  | if not contents or self.request.get('bust'): | 
|  | result = urlfetch.fetch(url) | 
|  | if result.status_code != 200: | 
|  | self.response.set_status(result.status_code) | 
|  | self.response.write('http error %d' % result.status_code) | 
|  | return | 
|  | contents = base64.b64decode(result.content) | 
|  | memcache.set(url, contents, time=5*60)  # seconds | 
|  |  | 
|  | if resource.endswith('.css'): | 
|  | self.response.headers['Content-Type'] = 'text/css' | 
|  | self.response.write(contents) | 
|  |  | 
|  |  | 
|  | app = webapp2.WSGIApplication([ | 
|  | ('/', MainHandler), | 
|  | ('/(\S+\.(?:css|html))', GitilesMirrorHandler), | 
|  | ], debug=True) |