1# Copyright 2013 The Chromium Authors. All rights reserved. 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5import logging 6 7from appengine_wrappers import webapp2 8from handler import Handler 9from servlet import Request 10 11 12class AppEngineHandler(webapp2.RequestHandler): 13 '''Top-level handler for AppEngine requests. Just converts them into our 14 internal Servlet architecture. 15 ''' 16 17 def post(self): 18 self._HandleRequest() 19 20 def get(self): 21 self._HandleRequest() 22 23 def _HandleRequest(self): 24 profile_mode = self.request.get('profile') 25 if profile_mode: 26 import cProfile, pstats, StringIO 27 pr = cProfile.Profile() 28 pr.enable() 29 30 try: 31 response = None 32 arguments = {} 33 for argument in self.request.arguments(): 34 arguments[argument] = self.request.get(argument) 35 request = Request(self.request.path, 36 self.request.url[:-len(self.request.path)], 37 self.request.headers, 38 arguments) 39 response = Handler(request).Get() 40 except Exception as e: 41 logging.exception(e) 42 finally: 43 if profile_mode: 44 pr.disable() 45 s = StringIO.StringIO() 46 pstats.Stats(pr, stream=s).sort_stats(profile_mode).print_stats() 47 self.response.out.write(s.getvalue()) 48 self.response.headers['Content-Type'] = 'text/plain' 49 self.response.status = 200 50 elif response: 51 self.response.out.write(response.content.ToString()) 52 self.response.headers.update(response.headers) 53 self.response.status = response.status 54 else: 55 self.response.out.write('Internal server error') 56 self.response.status = 500 57