def toolbar_tween(request): try: p = request.path_info except UnicodeDecodeError as e: raise URLDecodeError(e.encoding, e.object, e.start, e.end, e.reason) last_proxy_addr = None if request.remote_addr: last_proxy_addr = last_proxy(request.remote_addr) if (last_proxy_addr is None or any(p.startswith(e) for e in exclude_prefixes) or not addr_in(last_proxy_addr, hosts) or auth_check and not auth_check(request)): return handler(request) if request.environ.get('wsgi.multiprocess', False): warnings.warn( 'pyramid_debugtoolbar has detected that the application is ' 'being served by a forking / multiprocess web server. The ' 'toolbar relies on global state to work and is not compatible ' 'with this environment. The toolbar will be disabled.') return handler(request) root_path = debug_toolbar_url(request, '', _app_url='') if p.startswith(root_path): # we know root_path will always have a trailing slash # but script_name doesn't want it try: old_script_name = request.script_name old_path_info = request.path_info request.script_name += root_path[:-1] request.path_info = request.path_info[len(root_path) - 1:] return dispatch(request) finally: request.script_name = old_script_name request.path_info = old_path_info request.exc_history = exc_history request.history = request_history request.pdtb_id = hexlify(id(request)) toolbar = DebugToolbar(request, panel_classes, global_panel_classes, default_active_panels) request.debug_toolbar = toolbar _handler = handler for panel in toolbar.panels: _handler = panel.wrap_handler(_handler) try: response = _handler(request) toolbar.status_int = response.status_int except Exception: if exc_history is not None: tb = get_traceback(info=sys.exc_info(), skip=1, show_hidden_frames=False, ignore_system_exceptions=True) for frame in tb.frames: exc_history.frames[frame.id] = frame exc_history.tracebacks[tb.id] = tb request.pdbt_tb = tb msg = 'Exception at %s\ntraceback url: %s' qs = {'token': registry.pdtb_token, 'tb': str(tb.id)} subrequest = make_subrequest(request, root_path, 'exception', qs) exc_msg = msg % (request.url, subrequest.url) _logger.exception(exc_msg) response = dispatch(subrequest) # The original request must be processed so that the panel data exists # if the request is later examined in the full toolbar view. toolbar.process_response(request, response) toolbar.response = response toolbar.status_int = response.status_int request_history.put(request.pdtb_id, toolbar) # Inject the button to activate the full toolbar view. toolbar.inject(request, response) return response else: _logger.exception('Exception at %s' % request.url) raise else: if intercept_redirects: # Intercept http redirect codes and display an html page with a # link to the target. if response.status_int in redirect_codes: redirect_to = response.location redirect_code = response.status_int if redirect_to: qs = { 'token': registry.pdtb_token, 'redirect_to': redirect_to, 'redirect_code': str(redirect_code), } subrequest = make_subrequest(request, root_path, 'redirect', qs) content = dispatch(subrequest).text response.location = None response.text = content response.status_int = 200 toolbar.process_response(request, response) # Don't store the favicon.ico request # it's requested by the browser automatically if not "/favicon.ico" == request.path: toolbar.response = response request_history.put(request.pdtb_id, toolbar) if not show_on_exc_only and response.content_type in html_types: toolbar.inject(request, response) return response finally: # break circref del request.debug_toolbar
def toolbar_tween(request): try: p = request.path_info except UnicodeDecodeError as e: raise URLDecodeError(e.encoding, e.object, e.start, e.end, e.reason) last_proxy_addr = None if request.remote_addr: last_proxy_addr = last_proxy(request.remote_addr) if ( last_proxy_addr is None or any(p.startswith(e) for e in exclude_prefixes) or not addr_in(last_proxy_addr, hosts) or auth_check and not auth_check(request) ): return handler(request) root_path = debug_toolbar_url(request, '', _app_url='') if p.startswith(root_path): # we know root_path will always have a trailing slash # but script_name doesn't want it try: old_script_name = request.script_name old_path_info = request.path_info request.script_name += root_path[:-1] request.path_info = request.path_info[len(root_path) - 1:] return dispatch(request) finally: request.script_name = old_script_name request.path_info = old_path_info request.exc_history = exc_history request.history = request_history request.pdtb_id = hexlify(id(request)) toolbar = DebugToolbar(request, panel_classes, global_panel_classes, default_active_panels) request.debug_toolbar = toolbar _handler = handler for panel in toolbar.panels: _handler = panel.wrap_handler(_handler) try: response = _handler(request) toolbar.status_int = response.status_int except Exception: if exc_history is not None: tb = get_traceback(info=sys.exc_info(), skip=1, show_hidden_frames=False, ignore_system_exceptions=True) for frame in tb.frames: exc_history.frames[frame.id] = frame exc_history.tracebacks[tb.id] = tb request.pdbt_tb = tb msg = 'Exception at %s\ntraceback url: %s' qs = {'token': registry.pdtb_token, 'tb': str(tb.id)} subrequest = make_subrequest( request, root_path, 'exception', qs) exc_msg = msg % (request.url, subrequest.url) _logger.exception(exc_msg) response = dispatch(subrequest) # The original request must be processed so that the panel data exists # if the request is later examined in the full toolbar view. toolbar.process_response(request, response) toolbar.response = response toolbar.status_int = response.status_int request_history.put(request.pdtb_id, toolbar) # Inject the button to activate the full toolbar view. toolbar.inject(request, response) return response else: _logger.exception('Exception at %s' % request.url) raise else: if intercept_redirects: # Intercept http redirect codes and display an html page with a # link to the target. if response.status_int in redirect_codes: redirect_to = response.location redirect_code = response.status_int if redirect_to: qs = { 'token': registry.pdtb_token, 'redirect_to': redirect_to, 'redirect_code': str(redirect_code), } subrequest = make_subrequest( request, root_path, 'redirect', qs) content = dispatch(subrequest).text response.location = None response.text = content response.status_int = 200 toolbar.process_response(request, response) # Don't store the favicon.ico request # it's requested by the browser automatically if not "/favicon.ico" == request.path: toolbar.response = response request_history.put(request.pdtb_id, toolbar) if not show_on_exc_only and response.content_type in html_types: toolbar.inject(request, response) return response finally: # break circref del request.debug_toolbar
def toolbar_tween(request): try: p = request.path_info except UnicodeDecodeError as e: raise URLDecodeError(e.encoding, e.object, e.start, e.end, e.reason) client_addr = None if request.remote_addr and ',' not in request.remote_addr: client_addr = request.remote_addr.strip() elif request.remote_addr is not None: warnings.warn( 'pyramid_debugtoolbar has detected a broken proxy ' 'that modified REMOTE_ADDR with an invalid value and is ' 'cowardly going to refuse to serve the toolbar. If you see ' 'this message, and you think it is incorrect, please open an ' 'issue with more details including the proxy you\'re using and ' 'the format of the REMOTE_ADDR at ' 'https://github.com/Pylons/pyramid_debugtoolbar/issues/' ) if ( client_addr is None or any(p.startswith(e) for e in exclude_prefixes) or not addr_in(client_addr, hosts) or auth_check and not auth_check(request) ): return handler(request) if request.environ.get('wsgi.multiprocess', False): warnings.warn( 'pyramid_debugtoolbar has detected that the application is ' 'being served by a forking / multiprocess web server. The ' 'toolbar relies on global state to work and is not compatible ' 'with this environment. The toolbar will be disabled.') return handler(request) root_path = debug_toolbar_url(request, '', _app_url='') if p.startswith(root_path): # we know root_path will always have a trailing slash # but script_name doesn't want it try: old_script_name = request.script_name old_path_info = request.path_info request.script_name += root_path[:-1] request.path_info = request.path_info[len(root_path) - 1:] return dispatch(request) finally: request.script_name = old_script_name request.path_info = old_path_info request.pdtb_id = hexlify(id(request)) toolbar = DebugToolbar(request, panel_classes, global_panel_classes, default_active_panels) request.debug_toolbar = toolbar request_history.put(request.pdtb_id, toolbar) _handler = handler for panel in toolbar.panels: _handler = panel.wrap_handler(_handler) try: response = _handler(request) toolbar.status_int = response.status_int if request.exc_info and intercept_exc: toolbar.traceback = process_traceback(request.exc_info) msg = 'Squashed %s at %s\ntraceback url: %s' exc_name = get_exc_name(request.exc_info[1]) subrequest = make_subrequest( request, root_path, request.pdtb_id + '/exception') exc_msg = msg % (exc_name, request.url, subrequest.url) _logger.info(exc_msg) except Exception as exc: exc_name = get_exc_name(exc) if intercept_exc: toolbar.traceback = process_traceback(sys.exc_info()) msg = 'Uncaught %s at %s\ntraceback url: %s' subrequest = make_subrequest( request, root_path, request.pdtb_id + '/exception') exc_msg = msg % (exc_name, request.url, subrequest.url) _logger.exception(exc_msg) response = dispatch(subrequest) toolbar.status_int = response.status_int # The original request must be processed so that the panel # data exists if the request is later examined in the full # toolbar view. toolbar.process_response(request, response) # Inject the button to activate the full toolbar view. toolbar.inject(request, response) # we want later tweens to understand that the response # is from handling an exception, so we must add # request.exc_info and request.exception as an indicator # see Pylons/pyramid_debugtoolbar#341 request.exception = exc request.exc_info = sys.exc_info() return response else: msg = 'Uncaught %s at %s' _logger.exception(msg % (exc_name, request.url)) raise else: if intercept_redirects: # Intercept http redirect codes and display an html page with a # link to the target. if response.status_int in redirect_codes: redirect_to = response.location redirect_code = response.status_int if redirect_to: qs = { 'redirect_to': redirect_to, 'redirect_code': str(redirect_code), } subrequest = make_subrequest( request, root_path, 'redirect', qs) content = dispatch(subrequest).text response.location = None response.text = content response.status_int = 200 toolbar.process_response(request, response) if not show_on_exc_only and response.content_type in html_types: toolbar.inject(request, response) return response finally: # break circref del request.debug_toolbar