Пример #1
0
 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}")
Пример #2
0
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)
Пример #3
0
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)
Пример #5
0
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)