def fail(value, context_info=None, src_exception=None, err_condition=None): """Wrapper to raise (and log) DAVError.""" if isinstance(value, Exception): e = as_DAVError(value) else: e = DAVError(value, context_info, src_exception, err_condition) _logger.error("Raising DAVError {}".format(e.get_user_info())) raise e
def fail(value, context_info=None, src_exception=None, err_condition=None): """Wrapper to raise (and log) DAVError.""" if isinstance(value, Exception): e = as_DAVError(value) else: e = DAVError(value, context_info, src_exception, err_condition) _logger.debug("Raising DAVError {}".format(e.get_user_info())) raise e
def __call__(self, environ, start_response): # Intercept start_response sub_app_start_response = util.SubAppStartResponse() try: try: # request_server app may be a generator (for example the GET handler) # So we must iterate - not return self.next_app(..)! # Otherwise the we could not catch exceptions here. response_started = False app_iter = self.next_app(environ, sub_app_start_response) for v in app_iter: # Start response (the first time) if not response_started: # Success! start_response( sub_app_start_response.status, sub_app_start_response.response_headers, sub_app_start_response.exc_info, ) response_started = True yield v # Close out iterator if hasattr(app_iter, "close"): app_iter.close() # Start response (if it hasn't been done yet) if not response_started: # Success! start_response( sub_app_start_response.status, sub_app_start_response.response_headers, sub_app_start_response.exc_info, ) return except DAVError as e: _logger.debug("re-raising {}".format(e)) raise except Exception as e: # Caught a non-DAVError if self._catch_all_exceptions: # Catch all exceptions to return as 500 Internal Error # traceback.print_exc(10, environ.get("wsgi.errors") or sys.stderr) _logger.error("{}".format(traceback.format_exc(10))) raise as_DAVError(e) else: _logger.error("Caught Exception\n{}".format( traceback.format_exc(10))) # traceback.print_exc(10, sys.stderr) raise except DAVError as e: _logger.debug("caught {}".format(e)) status = get_http_status_string(e) # Dump internal errors to console if e.value == HTTP_INTERNAL_ERROR: tb = traceback.format_exc(10) _logger.error( "Caught HTTPRequestException(HTTP_INTERNAL_ERROR)\n{}". format(tb)) # traceback.print_exc(10, environ.get("wsgi.errors") or sys.stdout) _logger.error("e.srcexception:\n{}".format(e.srcexception)) elif e.value in (HTTP_NOT_MODIFIED, HTTP_NO_CONTENT): # _logger.warn("Forcing empty error response for {}".format(e.value)) # See paste.lint: these code don't have content start_response(status, [("Content-Length", "0"), ("Date", util.get_rfc1123_time())]) yield b"" return # If exception has pre-/post-condition: return as XML response, # else return as HTML content_type, body = e.get_response_page() # TODO: provide exc_info=sys.exc_info()? start_response( status, [ ("Content-Type", content_type), ("Content-Length", str(len(body))), ("Date", util.get_rfc1123_time()), ], ) yield body return
def __call__(self, environ, start_response): # Intercept start_response sub_app_start_response = util.SubAppStartResponse() try: try: # request_server app may be a generator (for example the GET handler) # So we must iterate - not return self.next_app(..)! # Otherwise the we could not catch exceptions here. response_started = False app_iter = self.next_app(environ, sub_app_start_response) for v in app_iter: # Start response (the first time) if not response_started: # Success! start_response( sub_app_start_response.status, sub_app_start_response.response_headers, sub_app_start_response.exc_info, ) response_started = True yield v # Close out iterator if hasattr(app_iter, "close"): app_iter.close() # Start response (if it hasn't been done yet) if not response_started: # Success! start_response( sub_app_start_response.status, sub_app_start_response.response_headers, sub_app_start_response.exc_info, ) return except DAVError as e: _logger.debug("re-raising {}".format(e)) raise except Exception as e: # Caught a non-DAVError if self.catch_all_exceptions: # Catch all exceptions to return as 500 Internal Error # traceback.print_exc(10, environ.get("wsgi.errors") or sys.stderr) _logger.error("{}".format(traceback.format_exc(10))) raise as_DAVError(e) else: _logger.error( "Caught Exception\n{}".format(traceback.format_exc(10)) ) # traceback.print_exc(10, sys.stderr) raise except DAVError as e: _logger.debug("caught {}".format(e)) status = get_http_status_string(e) # Dump internal errors to console if e.value == HTTP_INTERNAL_ERROR: tb = traceback.format_exc(10) _logger.error( "Caught HTTPRequestException(HTTP_INTERNAL_ERROR)\n{}".format(tb) ) # traceback.print_exc(10, environ.get("wsgi.errors") or sys.stdout) _logger.error("e.src_exception:\n{}".format(e.src_exception)) elif e.value in (HTTP_NOT_MODIFIED, HTTP_NO_CONTENT): # _logger.warning("Forcing empty error response for {}".format(e.value)) # See paste.lint: these code don't have content start_response( status, [("Content-Length", "0"), ("Date", util.get_rfc1123_time())] ) yield b"" return # If exception has pre-/post-condition: return as XML response, # else return as HTML content_type, body = e.get_response_page() # TODO: provide exc_info=sys.exc_info()? start_response( status, [ ("Content-Type", content_type), ("Content-Length", str(len(body))), ("Date", util.get_rfc1123_time()), ], ) yield body return