# Copyright (c) 2015 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. import json import logging import os import re import webapp2 import uuid from . import trace_info from . import cloud_config import cloudstorage as gcs from google.appengine.api import datastore_errors default_retry_params = gcs.RetryParams(initial_delay=0.2, max_delay=5.0, backoff_factor=2, max_retry_period=15) gcs.set_default_retry_params(default_retry_params) class UploadPage(webapp2.RequestHandler): def get(self): self.response.out.write(""" <html><body> <head><title>Performance Insights - Trace Uploader</title></head> <form action="/upload" enctype="multipart/form-data" method="post"> <div><input type="file" name="trace"/></div> <div><input type="submit" value="Upload"></div> </form><hr> </body></html>""") def post(self): trace_uuid = str(uuid.uuid4()) gcs_path = '/%s/%s.gz' % ( cloud_config.Get().trace_upload_bucket, trace_uuid) gcs_file = gcs.open(gcs_path, 'w', content_type='application/octet-stream', options={}, retry_params=default_retry_params) gcs_file.write(self.request.get('trace')) gcs_file.close() trace_object = trace_info.TraceInfo(id=trace_uuid) trace_object.remote_addr = os.environ["REMOTE_ADDR"] for arg in self.request.arguments(): arg_key = arg.replace('-', '_').lower() if arg_key in trace_object._properties: try: setattr(trace_object, arg_key, self.request.get(arg)) except datastore_errors.BadValueError: pass scenario_config = self.request.get('config') if scenario_config: config_json = json.loads(scenario_config) if 'scenario_name' in config_json: trace_object.scenario_name = config_json['scenario_name'] tags_string = self.request.get('tags') if tags_string: # Tags are comma separated and should only include alphanumeric + '-'. if re.match('^[a-zA-Z0-9-,]+$', tags_string): trace_object.tags = tags_string.split(',') else: logging.warning('The provided tags string includes one or more invalid' ' characters and will be ignored') trace_object.ver = self.request.get('product-version') trace_object.put() self.response.write(trace_uuid) app = webapp2.WSGIApplication([('/upload', UploadPage)])