1*6dbdd20aSAndroid Build Coastguard Worker# Copyright (C) 2021 The Android Open Source Project 2*6dbdd20aSAndroid Build Coastguard Worker# 3*6dbdd20aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 4*6dbdd20aSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 5*6dbdd20aSAndroid Build Coastguard Worker# You may obtain a copy of the License at 6*6dbdd20aSAndroid Build Coastguard Worker# 7*6dbdd20aSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 8*6dbdd20aSAndroid Build Coastguard Worker# 9*6dbdd20aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*6dbdd20aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 11*6dbdd20aSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*6dbdd20aSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 13*6dbdd20aSAndroid Build Coastguard Worker# limitations under the License. 14*6dbdd20aSAndroid Build Coastguard Worker 15*6dbdd20aSAndroid Build Coastguard Workerimport flask 16*6dbdd20aSAndroid Build Coastguard Workerimport requests 17*6dbdd20aSAndroid Build Coastguard Worker 18*6dbdd20aSAndroid Build Coastguard WorkerBUCKET_NAME = 'ui.perfetto.dev' 19*6dbdd20aSAndroid Build Coastguard Worker 20*6dbdd20aSAndroid Build Coastguard WorkerREQ_HEADERS = [ 21*6dbdd20aSAndroid Build Coastguard Worker 'Accept', 22*6dbdd20aSAndroid Build Coastguard Worker # TODO(primiano): re-enable once the gzip handling outage fixed. 23*6dbdd20aSAndroid Build Coastguard Worker # 'Accept-Encoding', 24*6dbdd20aSAndroid Build Coastguard Worker # 'Cache-Control', 25*6dbdd20aSAndroid Build Coastguard Worker] 26*6dbdd20aSAndroid Build Coastguard Worker 27*6dbdd20aSAndroid Build Coastguard WorkerRESP_HEADERS = [ 28*6dbdd20aSAndroid Build Coastguard Worker 'Content-Type', 29*6dbdd20aSAndroid Build Coastguard Worker 'Content-Encoding', 30*6dbdd20aSAndroid Build Coastguard Worker 'Content-Length', 31*6dbdd20aSAndroid Build Coastguard Worker 'Cache-Control', 32*6dbdd20aSAndroid Build Coastguard Worker 'Date', 33*6dbdd20aSAndroid Build Coastguard Worker 'Expires', 34*6dbdd20aSAndroid Build Coastguard Worker] 35*6dbdd20aSAndroid Build Coastguard Worker 36*6dbdd20aSAndroid Build Coastguard Workerapp = flask.Flask(__name__) 37*6dbdd20aSAndroid Build Coastguard Worker 38*6dbdd20aSAndroid Build Coastguard Worker 39*6dbdd20aSAndroid Build Coastguard Worker# Redirect v1.2.3 to v.1.2.3/ 40*6dbdd20aSAndroid Build Coastguard Worker@app.route('/v<int:x>.<int:y>.<int:z>') 41*6dbdd20aSAndroid Build Coastguard Workerdef version_redirect(x, y, z): 42*6dbdd20aSAndroid Build Coastguard Worker return flask.redirect('/v%d.%d.%d/' % (x, y, z), code=302) 43*6dbdd20aSAndroid Build Coastguard Worker 44*6dbdd20aSAndroid Build Coastguard Worker 45*6dbdd20aSAndroid Build Coastguard Worker# Serve the requests from the GCS bucket. 46*6dbdd20aSAndroid Build Coastguard Worker@app.route('/', methods=['GET']) 47*6dbdd20aSAndroid Build Coastguard Worker@app.route('/<path:path>', methods=['GET']) 48*6dbdd20aSAndroid Build Coastguard Workerdef main(path=''): 49*6dbdd20aSAndroid Build Coastguard Worker path = '/' + path 50*6dbdd20aSAndroid Build Coastguard Worker path += 'index.html' if path.endswith('/') else '' 51*6dbdd20aSAndroid Build Coastguard Worker req_headers = {} 52*6dbdd20aSAndroid Build Coastguard Worker for key in set(flask.request.headers.keys()).intersection(REQ_HEADERS): 53*6dbdd20aSAndroid Build Coastguard Worker req_headers[key] = flask.request.headers.get(key) 54*6dbdd20aSAndroid Build Coastguard Worker url = 'https://commondatastorage.googleapis.com/' + BUCKET_NAME + path 55*6dbdd20aSAndroid Build Coastguard Worker req = requests.get(url, headers=req_headers) 56*6dbdd20aSAndroid Build Coastguard Worker if (req.status_code != 200): 57*6dbdd20aSAndroid Build Coastguard Worker return flask.abort(req.status_code) 58*6dbdd20aSAndroid Build Coastguard Worker resp = flask.Response(req.content) 59*6dbdd20aSAndroid Build Coastguard Worker for key in set(req.headers.keys()).intersection(RESP_HEADERS): 60*6dbdd20aSAndroid Build Coastguard Worker resp.headers[key] = req.headers.get(key) 61*6dbdd20aSAndroid Build Coastguard Worker return resp 62*6dbdd20aSAndroid Build Coastguard Worker 63*6dbdd20aSAndroid Build Coastguard Worker 64*6dbdd20aSAndroid Build Coastguard Workerif __name__ == '__main__': 65*6dbdd20aSAndroid Build Coastguard Worker # This is used when running locally only. 66*6dbdd20aSAndroid Build Coastguard Worker app.run(host='127.0.0.1', port=10000, debug=True) 67