def handle_response(self, response, content): """Validate HTTP response """ status = response.status_code if status in (301, 302, 303, 307): raise exceptions.Redirection(response, content) elif 200 <= status <= 299: return json.loads(content) if content else {} elif status == 400: raise exceptions.BadRequest(response, content) elif status == 401: raise exceptions.UnauthorizedAccess(response, content) elif status == 403: raise exceptions.ForbiddenAccess(response, content) elif status == 404: raise exceptions.ResourceNotFound(response, content) elif status == 405: raise exceptions.MethodNotAllowed(response, content) elif status == 409: raise exceptions.ResourceConflict(response, content) elif status == 410: raise exceptions.ResourceGone(response, content) elif status == 422: raise exceptions.ResourceInvalid(response, content) elif 401 <= status <= 499: raise exceptions.ClientError(response, content) elif 500 <= status <= 599: raise exceptions.ServerError(response, content) else: raise exceptions.ConnectionError( response, content, "Unknown response code: #{response.code}")
async def exception_middleware(request: web.Request, handler: Callable) -> web.Response: """ Обрабатывает исключения приложения :param request: объект запроса :param handler: обработчик :return: объект ответа """ try: response: web.Response = await handler(request) return response except MarshmallowValidationError as ex: exc = exceptions.ValidationError(debug=str(ex), message=exceptions.ValidationError.message) except exceptions.BaseAppException as ex: exc = ex except web_exceptions.HTTPBadRequest as ex: exc = exceptions.InputValidationError(debug=ex.text, message=exceptions.InputValidationError.message) except web_exceptions.HTTPUnprocessableEntity as ex: exc = exceptions.ValidationError(debug=ex.text, message=exceptions.ValidationError.message) except web_exceptions.HTTPForbidden as ex: exc = exceptions.Forbidden(debug=f'Goodbye Moonmen. {ex}', message=exceptions.Forbidden.message) except web_exceptions.HTTPNotFound as ex: exc = exceptions.NotFound(debug=ex.text, message=exceptions.NotFound.message) except Exception as ex: # pylint: disable=broad-except exc = exceptions.ServerError(debug=str(ex), message=exceptions.ServerError.message) exc_data = exc.as_dict() exc_data['message'] = exc.message exc_data.pop('code', None) exc.__init__(**exc_data) return web.json_response(exc.as_dict(), status=exc.status_code)
async def exception_middleware( request: web.Request, handler: Callable[[web.Request], Awaitable[web.Response]], ) -> web.Response: sentry_event_id: Optional[str] = None try: response: web.Response = await handler(request) return response except MarshmallowValidationError as ex: exc: ServerError = exceptions.ValidationError(str(ex)) except web_exceptions.HTTPBadRequest as ex: exc = exceptions.InputValidationError(ex.text or '') except web_exceptions.HTTPUnprocessableEntity as ex: exc = exceptions.ValidationError(ex.text or '') except web_exceptions.HTTPForbidden as ex: exc = exceptions.Forbidden(str(ex)) except web_exceptions.HTTPNotFound as ex: exc = exceptions.NotFound(ex.text or '') except asyncio.CancelledError as ex: exc = exceptions.ServerError(str(ex)) except exceptions.ServerError as ex: exc = ex except NotImplementedError: exc = exceptions.MethodNotImplemented() # nolint except Exception as ex: # pylint: disable=W0703 print_exc() sentry_event_id = sentry_sdk.capture_exception(ex) exc = exceptions.ServerError(str(ex)) if not sentry_event_id: sentry_event_id = sentry_sdk.capture_exception(exc) return web.json_response(data=exc.as_dict(), status=exc.status_code, headers={'X-Sentry-ID': sentry_event_id or ''})
async def exception_middleware( # pylint: disable=bad-continuation request: web.Request, handler: Callable[[web.Request], Awaitable[web.Response]], ) -> web.Response: # pylint: enable=bad-continuation """ Обрабатывает исключения приложения :param request: web.Request объект запроса :param handler: Coroutine[[web.Request], web.Response] обработчик :return: web.Response объект ответа """ exc: Optional[exceptions.ServerError] = None try: response: web.Response = await handler(request) except exceptions.ServerError as ex: exc = ex except MarshmallowValidationError as ex: exc = exceptions.ValidationError( debug=str(ex), message=exceptions.ValidationError.message) except web_exceptions.HTTPBadRequest as ex: exc = exceptions.InputValidationError( debug=ex.text, message=exceptions.InputValidationError.message) except web_exceptions.HTTPUnprocessableEntity as ex: exc = exceptions.ValidationError( debug=ex.text, message=exceptions.ValidationError.message) except web_exceptions.HTTPForbidden as ex: exc = exceptions.Forbidden(debug=f'Goodbye Moonmen. {ex}', message=exceptions.Forbidden.message) except web_exceptions.HTTPNotFound as ex: exc = exceptions.NotFound(debug=ex.text, message=exceptions.NotFound.message) except Exception as ex: # pylint: disable=broad-except exc = exceptions.ServerError(debug=str(ex), message=exceptions.ServerError.message) if not exc: return response exc_data = exc.as_dict() exc_data['message'] = exc.message exc_data.pop('code', None) type(exc)(**exc_data) return web.json_response(exc.as_dict(), status=exc.status_code)
def transaction(transaction): start_sign = transaction[:4] protocol_version = transaction[4:6] end_sign = transaction[-4:] if not (start_sign == '0002' \ and protocol_version == '01' \ and end_sign == '0003'): raise e.ServerError( message={ 'error': 'Transaction with invalid template received: ' \ 'start_sign: {0}, ' \ 'protocol_version: {1}, ' \ 'end_sign: {2}'.format( start_sign, protocol_version, end_sign ) } ) transaction_data = parse(transaction[6:-4]) return dispatch(transaction_data)