__init__.py (4528B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\lib\werkzeug\debug\__init__.py 2 import mimetypes 3 from os.path import join, dirname, basename, isfile 4 from werkzeug.wrappers import BaseRequest as Request, BaseResponse as Response 5 from werkzeug.debug.repr import debug_repr 6 from werkzeug.debug.tbtools import get_current_traceback 7 from werkzeug.debug.console import Console 8 from werkzeug.debug.utils import render_template 9 10 class _ConsoleFrame(object): 11 12 def __init__(self, namespace): 13 self.console = Console(namespace) 14 self.id = 0 15 16 17 class DebuggedApplication(object): 18 __module__ = 'werkzeug' 19 20 def __init__(self, app, evalex = False, request_key = 'werkzeug.request', console_path = '/console', console_init_func = None, show_hidden_frames = False): 21 if not console_init_func: 22 console_init_func = dict 23 self.app = app 24 self.evalex = evalex 25 self.frames = {} 26 self.tracebacks = {} 27 self.request_key = request_key 28 self.console_path = console_path 29 self.console_init_func = console_init_func 30 self.show_hidden_frames = show_hidden_frames 31 32 def debug_application(self, environ, start_response): 33 app_iter = None 34 try: 35 app_iter = self.app(environ, start_response) 36 for item in app_iter: 37 yield item 38 39 if hasattr(app_iter, 'close'): 40 app_iter.close() 41 except: 42 if hasattr(app_iter, 'close'): 43 app_iter.close() 44 traceback = get_current_traceback(skip=1, show_hidden_frames=self.show_hidden_frames, ignore_system_exceptions=True) 45 for frame in traceback.frames: 46 self.frames[frame.id] = frame 47 48 self.tracebacks[traceback.id] = traceback 49 try: 50 start_response('500 INTERNAL SERVER ERROR', [('Content-Type', 'text/html; charset=utf-8')]) 51 except: 52 environ['wsgi.errors'].write('Debugging middleware caught exception in streamed response at a point where response headers were already sent.\n') 53 else: 54 yield traceback.render_full(evalex=self.evalex).encode('utf-8', 'replace') 55 56 traceback.log(environ['wsgi.errors']) 57 58 def execute_command(self, request, command, frame): 59 return Response(frame.console.eval(command), mimetype='text/html') 60 61 def display_console(self, request): 62 if 0 not in self.frames: 63 self.frames[0] = _ConsoleFrame(self.console_init_func()) 64 return Response(render_template('console.html'), mimetype='text/html') 65 66 def paste_traceback(self, request, traceback): 67 paste_id = traceback.paste() 68 return Response('{"url": "http://paste.pocoo.org/show/%s/", "id": %s}' % (paste_id, paste_id), mimetype='application/json') 69 70 def get_source(self, request, frame): 71 return Response(frame.render_source(), mimetype='text/html') 72 73 def get_resource(self, request, filename): 74 filename = join(dirname(__file__), 'shared', basename(filename)) 75 if isfile(filename): 76 mimetype = mimetypes.guess_type(filename)[0] or 'application/octet-stream' 77 f = file(filename, 'rb') 78 try: 79 return Response(f.read(), mimetype=mimetype) 80 finally: 81 f.close() 82 83 return Response('Not Found', status=404) 84 85 def __call__(self, environ, start_response): 86 request = Request(environ) 87 response = self.debug_application 88 if self.evalex and self.console_path is not None and request.path == self.console_path: 89 response = self.display_console(request) 90 elif request.path.rstrip('/').endswith('/__debugger__'): 91 cmd = request.args.get('cmd') 92 arg = request.args.get('f') 93 traceback = self.tracebacks.get(request.args.get('tb', type=int)) 94 frame = self.frames.get(request.args.get('frm', type=int)) 95 if cmd == 'resource' and arg: 96 response = self.get_resource(request, arg) 97 elif cmd == 'paste' and traceback is not None: 98 response = self.paste_traceback(request, traceback) 99 elif cmd == 'source' and frame: 100 response = self.get_source(request, frame) 101 elif self.evalex and cmd is not None and frame is not None: 102 response = self.execute_command(request, cmd, frame) 103 return response(environ, start_response)