SILENT KILLERPanel

Current Path: > > opt > hc_python > > > lib > python3.12 > site-packages > > sentry_sdk > integrations


Operation   : Linux premium131.web-hosting.com 4.18.0-553.44.1.lve.el8.x86_64 #1 SMP Thu Mar 13 14:29:12 UTC 2025 x86_64
Software     : Apache
Server IP    : 162.0.232.56 | Your IP: 216.73.216.111
Domains      : 1034 Domain(s)
Permission   : [ 0755 ]

Files and Folders in: //opt/hc_python///lib/python3.12/site-packages//sentry_sdk/integrations

NameTypeSizeLast ModifiedActions
__pycache__ Directory - -
celery Directory - -
django Directory - -
grpc Directory - -
opentelemetry Directory - -
redis Directory - -
spark Directory - -
__init__.py File 10218 bytes May 23 2025 10:34:44.
_asgi_common.py File 3187 bytes May 23 2025 10:34:44.
_wsgi_common.py File 7558 bytes May 23 2025 10:34:44.
aiohttp.py File 12895 bytes May 23 2025 10:34:44.
anthropic.py File 9426 bytes May 23 2025 10:34:44.
argv.py File 911 bytes May 23 2025 10:34:44.
ariadne.py File 5834 bytes May 23 2025 10:34:44.
arq.py File 7857 bytes May 23 2025 10:34:44.
asgi.py File 12779 bytes May 23 2025 10:34:44.
asyncio.py File 4034 bytes May 23 2025 10:34:44.
asyncpg.py File 6521 bytes May 23 2025 10:34:44.
atexit.py File 1652 bytes May 23 2025 10:34:44.
aws_lambda.py File 17954 bytes May 23 2025 10:34:44.
beam.py File 5182 bytes May 23 2025 10:34:44.
boto3.py File 4411 bytes May 23 2025 10:34:44.
bottle.py File 6615 bytes May 23 2025 10:34:44.
chalice.py File 4699 bytes May 23 2025 10:34:44.
clickhouse_driver.py File 5247 bytes May 23 2025 10:34:44.
cloud_resource_context.py File 7780 bytes May 23 2025 10:34:44.
cohere.py File 9333 bytes May 23 2025 10:34:44.
dedupe.py File 1418 bytes May 23 2025 10:34:44.
dramatiq.py File 5583 bytes May 23 2025 10:34:44.
excepthook.py File 2408 bytes May 23 2025 10:34:44.
executing.py File 1994 bytes May 23 2025 10:34:44.
falcon.py File 9501 bytes May 23 2025 10:34:44.
fastapi.py File 4718 bytes May 23 2025 10:34:44.
flask.py File 8740 bytes May 23 2025 10:34:44.
gcp.py File 8274 bytes May 23 2025 10:34:44.
gnu_backtrace.py File 2894 bytes May 23 2025 10:34:44.
gql.py File 4179 bytes May 23 2025 10:34:44.
graphene.py File 5042 bytes May 23 2025 10:34:44.
httpx.py File 5866 bytes May 23 2025 10:34:44.
huey.py File 5443 bytes May 23 2025 10:34:44.
huggingface_hub.py File 6551 bytes May 23 2025 10:34:44.
langchain.py File 17718 bytes May 23 2025 10:34:44.
launchdarkly.py File 1935 bytes May 23 2025 10:34:44.
litestar.py File 11569 bytes May 23 2025 10:34:44.
logging.py File 13506 bytes May 23 2025 10:34:44.
loguru.py File 3620 bytes May 23 2025 10:34:44.
modules.py File 820 bytes May 23 2025 10:34:44.
openai.py File 15585 bytes May 23 2025 10:34:44.
openfeature.py File 1235 bytes May 23 2025 10:34:44.
pure_eval.py File 4581 bytes May 23 2025 10:34:44.
pymongo.py File 6380 bytes May 23 2025 10:34:44.
pyramid.py File 7364 bytes May 23 2025 10:34:44.
quart.py File 7437 bytes May 23 2025 10:34:44.
ray.py File 4162 bytes May 23 2025 10:34:44.
rq.py File 5307 bytes May 23 2025 10:34:44.
rust_tracing.py File 9078 bytes May 23 2025 10:34:44.
sanic.py File 12960 bytes May 23 2025 10:34:44.
serverless.py File 1804 bytes May 23 2025 10:34:44.
socket.py File 3169 bytes May 23 2025 10:34:44.
sqlalchemy.py File 4372 bytes May 23 2025 10:34:44.
starlette.py File 26413 bytes May 23 2025 10:34:44.
starlite.py File 10620 bytes May 23 2025 10:34:44.
statsig.py File 1227 bytes May 23 2025 10:34:44.
stdlib.py File 8831 bytes May 23 2025 10:34:44.
strawberry.py File 14126 bytes May 23 2025 10:34:44.
sys_exit.py File 2493 bytes May 23 2025 10:34:44.
threading.py File 5392 bytes May 23 2025 10:34:44.
tornado.py File 7222 bytes May 23 2025 10:34:44.
trytond.py File 1651 bytes May 23 2025 10:34:44.
typer.py File 1815 bytes May 23 2025 10:34:44.
unleash.py File 1058 bytes May 23 2025 10:34:44.
wsgi.py File 10747 bytes May 23 2025 10:34:44.

Reading File: //opt/hc_python///lib/python3.12/site-packages//sentry_sdk/integrations/flask.py

import sentry_sdk
from sentry_sdk.integrations import _check_minimum_version, DidNotEnable, Integration
from sentry_sdk.integrations._wsgi_common import (
    DEFAULT_HTTP_METHODS_TO_CAPTURE,
    RequestExtractor,
)
from sentry_sdk.integrations.wsgi import SentryWsgiMiddleware
from sentry_sdk.scope import should_send_default_pii
from sentry_sdk.tracing import SOURCE_FOR_STYLE
from sentry_sdk.utils import (
    capture_internal_exceptions,
    ensure_integration_enabled,
    event_from_exception,
    package_version,
)

from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from typing import Any, Callable, Dict, Union

    from sentry_sdk._types import Event, EventProcessor
    from sentry_sdk.integrations.wsgi import _ScopedResponse
    from werkzeug.datastructures import FileStorage, ImmutableMultiDict


try:
    import flask_login  # type: ignore
except ImportError:
    flask_login = None

try:
    from flask import Flask, Request  # type: ignore
    from flask import request as flask_request
    from flask.signals import (
        before_render_template,
        got_request_exception,
        request_started,
    )
    from markupsafe import Markup
except ImportError:
    raise DidNotEnable("Flask is not installed")

try:
    import blinker  # noqa
except ImportError:
    raise DidNotEnable("blinker is not installed")

TRANSACTION_STYLE_VALUES = ("endpoint", "url")


class FlaskIntegration(Integration):
    identifier = "flask"
    origin = f"auto.http.{identifier}"

    transaction_style = ""

    def __init__(
        self,
        transaction_style="endpoint",  # type: str
        http_methods_to_capture=DEFAULT_HTTP_METHODS_TO_CAPTURE,  # type: tuple[str, ...]
    ):
        # type: (...) -> None
        if transaction_style not in TRANSACTION_STYLE_VALUES:
            raise ValueError(
                "Invalid value for transaction_style: %s (must be in %s)"
                % (transaction_style, TRANSACTION_STYLE_VALUES)
            )
        self.transaction_style = transaction_style
        self.http_methods_to_capture = tuple(map(str.upper, http_methods_to_capture))

    @staticmethod
    def setup_once():
        # type: () -> None
        try:
            from quart import Quart  # type: ignore

            if Flask == Quart:
                # This is Quart masquerading as Flask, don't enable the Flask
                # integration. See https://github.com/getsentry/sentry-python/issues/2709
                raise DidNotEnable(
                    "This is not a Flask app but rather Quart pretending to be Flask"
                )
        except ImportError:
            pass

        version = package_version("flask")
        _check_minimum_version(FlaskIntegration, version)

        before_render_template.connect(_add_sentry_trace)
        request_started.connect(_request_started)
        got_request_exception.connect(_capture_exception)

        old_app = Flask.__call__

        def sentry_patched_wsgi_app(self, environ, start_response):
            # type: (Any, Dict[str, str], Callable[..., Any]) -> _ScopedResponse
            if sentry_sdk.get_client().get_integration(FlaskIntegration) is None:
                return old_app(self, environ, start_response)

            integration = sentry_sdk.get_client().get_integration(FlaskIntegration)

            middleware = SentryWsgiMiddleware(
                lambda *a, **kw: old_app(self, *a, **kw),
                span_origin=FlaskIntegration.origin,
                http_methods_to_capture=(
                    integration.http_methods_to_capture
                    if integration
                    else DEFAULT_HTTP_METHODS_TO_CAPTURE
                ),
            )
            return middleware(environ, start_response)

        Flask.__call__ = sentry_patched_wsgi_app


def _add_sentry_trace(sender, template, context, **extra):
    # type: (Flask, Any, Dict[str, Any], **Any) -> None
    if "sentry_trace" in context:
        return

    scope = sentry_sdk.get_current_scope()
    trace_meta = Markup(scope.trace_propagation_meta())
    context["sentry_trace"] = trace_meta  # for backwards compatibility
    context["sentry_trace_meta"] = trace_meta


def _set_transaction_name_and_source(scope, transaction_style, request):
    # type: (sentry_sdk.Scope, str, Request) -> None
    try:
        name_for_style = {
            "url": request.url_rule.rule,
            "endpoint": request.url_rule.endpoint,
        }
        scope.set_transaction_name(
            name_for_style[transaction_style],
            source=SOURCE_FOR_STYLE[transaction_style],
        )
    except Exception:
        pass


def _request_started(app, **kwargs):
    # type: (Flask, **Any) -> None
    integration = sentry_sdk.get_client().get_integration(FlaskIntegration)
    if integration is None:
        return

    request = flask_request._get_current_object()

    # Set the transaction name and source here,
    # but rely on WSGI middleware to actually start the transaction
    _set_transaction_name_and_source(
        sentry_sdk.get_current_scope(), integration.transaction_style, request
    )

    scope = sentry_sdk.get_isolation_scope()
    evt_processor = _make_request_event_processor(app, request, integration)
    scope.add_event_processor(evt_processor)


class FlaskRequestExtractor(RequestExtractor):
    def env(self):
        # type: () -> Dict[str, str]
        return self.request.environ

    def cookies(self):
        # type: () -> Dict[Any, Any]
        return {
            k: v[0] if isinstance(v, list) and len(v) == 1 else v
            for k, v in self.request.cookies.items()
        }

    def raw_data(self):
        # type: () -> bytes
        return self.request.get_data()

    def form(self):
        # type: () -> ImmutableMultiDict[str, Any]
        return self.request.form

    def files(self):
        # type: () -> ImmutableMultiDict[str, Any]
        return self.request.files

    def is_json(self):
        # type: () -> bool
        return self.request.is_json

    def json(self):
        # type: () -> Any
        return self.request.get_json(silent=True)

    def size_of_file(self, file):
        # type: (FileStorage) -> int
        return file.content_length


def _make_request_event_processor(app, request, integration):
    # type: (Flask, Callable[[], Request], FlaskIntegration) -> EventProcessor

    def inner(event, hint):
        # type: (Event, dict[str, Any]) -> Event

        # if the request is gone we are fine not logging the data from
        # it.  This might happen if the processor is pushed away to
        # another thread.
        if request is None:
            return event

        with capture_internal_exceptions():
            FlaskRequestExtractor(request).extract_into_event(event)

        if should_send_default_pii():
            with capture_internal_exceptions():
                _add_user_to_event(event)

        return event

    return inner


@ensure_integration_enabled(FlaskIntegration)
def _capture_exception(sender, exception, **kwargs):
    # type: (Flask, Union[ValueError, BaseException], **Any) -> None
    event, hint = event_from_exception(
        exception,
        client_options=sentry_sdk.get_client().options,
        mechanism={"type": "flask", "handled": False},
    )

    sentry_sdk.capture_event(event, hint=hint)


def _add_user_to_event(event):
    # type: (Event) -> None
    if flask_login is None:
        return

    user = flask_login.current_user
    if user is None:
        return

    with capture_internal_exceptions():
        # Access this object as late as possible as accessing the user
        # is relatively costly

        user_info = event.setdefault("user", {})

        try:
            user_info.setdefault("id", user.get_id())
            # TODO: more configurable user attrs here
        except AttributeError:
            # might happen if:
            # - flask_login could not be imported
            # - flask_login is not configured
            # - no user is logged in
            pass

        # The following attribute accesses are ineffective for the general
        # Flask-Login case, because the User interface of Flask-Login does not
        # care about anything but the ID. However, Flask-User (based on
        # Flask-Login) documents a few optional extra attributes.
        #
        # https://github.com/lingthio/Flask-User/blob/a379fa0a281789618c484b459cb41236779b95b1/docs/source/data_models.rst#fixed-data-model-property-names

        try:
            user_info.setdefault("email", user.email)
        except Exception:
            pass

        try:
            user_info.setdefault("username", user.username)
        except Exception:
            pass

SILENT KILLER Tool