NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

__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)