def inject(self, request, response): """ Inject the debug toolbar iframe into an HTML response. """ # called in host app response_html = response.body toolbar_url = debug_toolbar_url(request, request.id) button_style = get_setting(request.registry.settings, "button_style", "") css_path = request.static_url(STATIC_PATH + "css/toolbar.css") toolbar_html = toolbar_html_template % { "button_style": button_style, "css_path": css_path, "toolbar_url": toolbar_url, } toolbar_html = toolbar_html.encode(response.charset or "utf-8") response.body = replace_insensitive(response_html, bytes_("</body>"), toolbar_html + bytes_("</body>"))
def inject(self, request, response): """ Inject the debug toolbar iframe into an HTML response. """ # called in host app response_html = response.body toolbar_url = debug_toolbar_url(request, request.id) button_style = get_setting(request.registry.settings, 'button_style', '') css_path = request.static_url(STATIC_PATH + 'css/toolbar_button.css') toolbar_html = toolbar_html_template % { 'button_style': button_style, 'css_path': css_path, 'toolbar_url': toolbar_url } toolbar_html = toolbar_html.encode(response.charset or 'utf-8') response.body = replace_insensitive(response_html, bytes_('</body>'), toolbar_html + bytes_('</body>'))
def inject(self, request, response): """ Inject the debug toolbar iframe into an HTML response. """ # called in host app response_html = response.body toolbar_url = debug_toolbar_url(request, request.id) button_style = get_setting(request.registry.settings, 'button_style', '') css_path = request.static_url(STATIC_PATH + 'css/toolbar_button.css') toolbar_html = toolbar_html_template % { 'button_style': button_style, 'css_path': css_path, 'toolbar_url': toolbar_url} toolbar_html = toolbar_html.encode(response.charset or 'utf-8') response.body = replace_insensitive( response_html, bytes_('</body>'), toolbar_html + bytes_('</body>') )
def toolbar_tween(request): request.exc_history = exc_history request.history = request_history root_url = request.route_path('debugtoolbar', subpath='') exclude = [root_url] + exclude_prefixes last_proxy_addr = None try: p = request.path except UnicodeDecodeError as e: raise URLDecodeError(e.encoding, e.object, e.start, e.end, e.reason) starts_with_excluded = list(filter(None, map(p.startswith, exclude))) if request.remote_addr: last_proxy_addr = last_proxy(request.remote_addr) if last_proxy_addr is None \ or starts_with_excluded \ or not addr_in(last_proxy_addr, hosts) \ or auth_check and not auth_check(request): return handler(request) toolbar = DebugToolbar(request, panel_classes, global_panel_classes) request.debug_toolbar = toolbar _handler = handler # XXX 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 qs = {'token': registry.pdtb_token, 'tb': str(tb.id)} msg = 'Exception at %s\ntraceback url: %s' exc_url = debug_toolbar_url(request, 'exception', _query=qs) exc_msg = msg % (request.url, exc_url) _logger.exception(exc_msg) subenviron = request.environ.copy() del subenviron['PATH_INFO'] del subenviron['QUERY_STRING'] subrequest = type(request).blank(exc_url, subenviron) subrequest.script_name = request.script_name subrequest.path_info = \ subrequest.path_info[len(request.script_name):] response = request.invoke_subrequest(subrequest) toolbar.process_response(request, response) request.id = hexlify(id(request)) toolbar.response = response toolbar.status_int = response.status_int request_history.put(request.id, toolbar) 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: content = render( 'pyramid_debugtoolbar:templates/redirect.dbtmako', { 'redirect_to': redirect_to, 'redirect_code': redirect_code, }, request=request) content = content.encode(response.charset) response.content_length = len(content) response.location = None response.app_iter = [content] response.status_int = 200 toolbar.process_response(request, response) request.id = hexlify(id(request)) # 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.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) 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.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) 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
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) 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