# Copyright (C) 2018 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from google.appengine.api import memcache from google.appengine.api import urlfetch import re import webapp2 MEMCACHE_TTL_SEC= 60 * 60 * 24 BASE = 'https://catapult-project.github.io/perfetto/%s' HEADERS = {'last-modified', 'content-type', 'content-length', 'content-encoding', 'etag'} class MainHandler(webapp2.RequestHandler): def get(self): handler = GithubMirrorHandler() handler.initialize(self.request, self.response) return handler.get("index.html") class GithubMirrorHandler(webapp2.RequestHandler): def get(self, resource): if not re.match('^[a-zA-Z0-9-_./]*$', resource): self.response.set_status(403) return url = BASE % resource cache = memcache.get(url) if not cache or self.request.get('reload'): result = urlfetch.fetch(url) if result.status_code != 200: memcache.delete(url) self.response.set_status(result.status_code) self.response.write(result.content) return cache = {'content-type': 'text/html'} for k, v in result.headers.iteritems(): k = k.lower() if k in HEADERS: cache[k] = v cache['content'] = result.content memcache.set(url, cache, time=MEMCACHE_TTL_SEC) for k, v in cache.iteritems(): if k != 'content': self.response.headers[k] = v self.response.headers['cache-control'] = 'public,max-age=600' self.response.write(cache['content']) app = webapp2.WSGIApplication([ ('/', MainHandler), ('/(.+)', GithubMirrorHandler), ], debug=True)