o
    ha.                     @   sH  d Z ddlZddlZddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ dd	lmZmZmZ dd
lmZ ddlmZmZmZmZ ddlmZmZmZmZmZm Z m!Z! ddlm"Z" erddl#m$Z$ ddl#m%Z% ddl#m&Z& ddl#m'Z' ddl#m(Z( ddlm)Z)m*Z* edZ+dZ,dZ-dddZ.dd Z/G dd dZ0dS )ze
An ASGI middleware.

Based on Tom Christie's `sentry-asgi <https://github.com/encode/sentry-asgi>`.
    N)deepcopy)partial)TYPE_CHECKING)continue_trace)OP)Hub)_get_headers_get_request_data_get_url)auto_session_tracking)SOURCE_FOR_STYLETRANSACTION_SOURCE_ROUTETRANSACTION_SOURCE_URLTRANSACTION_SOURCE_COMPONENT)
ContextVarevent_from_exceptionHAS_REAL_CONTEXTVARSCONTEXTVARS_ERROR_MESSAGEloggertransaction_from_function_get_installed_modules)Transaction)Any)Callable)Dict)Optional)Tuple)EventHintsentry_asgi_middleware_appliedzgeneric ASGI request)endpointurlasgic                 C   s<   | j d urt|| j j|ddd\}}| j||d d S d S )NF)typehandled)client_options	mechanism)hint)clientr   optionscapture_event)hubexcmechanism_typeeventr'    r/   _/var/www/html/aiguide_backend/venv/lib/python3.10/site-packages/sentry_sdk/integrations/asgi.py_capture_exception9   s   

r1   c                 C   s>   t | r
t| dS t | rt| S t| dd}t|S )z
    Try to figure out if an application object supports ASGI3.

    This is how uvicorn figures out the application version as well.
    	__await____call__N)inspectisclasshasattr
isfunctionasyncioiscoroutinefunctiongetattr)appcallr/   r/   r0   _looks_like_asgi3F   s   




r=   c                   @   sH   e Zd ZdZ			dddZdd Zd	d
 Zdd Zdd Zdd Z	dS )SentryAsgiMiddleware)r;   r3   transaction_styler-   Fr    r"   c                 C   s~   |s
t s
tdt |tvrtd|tf |dkodt v }|r&td || _|| _	|| _
t|r9| j| _dS | j| _dS )ab  
        Instrument an ASGI application with Sentry. Provides HTTP/websocket
        data to sent events and basic handling for exceptions bubbling up
        through the middleware.

        :param unsafe_context_data: Disable errors when a proper contextvars installation could not be found. We do not recommend changing this from the default.
        zRThe ASGI middleware for Sentry requires Python 3.7+ or the aiocontextvars package.z7Invalid value for transaction_style: %s (must be in %s)r"   	starlettezThe Sentry Python SDK can now automatically support ASGI frameworks like Starlette and FastAPI. Please remove 'SentryAsgiMiddleware' from your project. See https://docs.sentry.io/platforms/python/guides/asgi/ for more information.N)r   RuntimeErrorr   TRANSACTION_STYLE_VALUES
ValueErrorr   r   warningr?   r-   r;   r=   
_run_asgi3r3   
_run_asgi2)selfr;   unsafe_context_datar?   r-   0asgi_middleware_while_using_starlette_or_fastapir/   r/   r0   __init__Y   s0   zSentryAsgiMiddleware.__init__c                    s    fdd}|S )Nc                    s   j  | |ddI d H S )N   asgi_version_run_app)receivesendscoperG   r/   r0   inner      z.SentryAsgiMiddleware._run_asgi2.<locals>.innerr/   )rG   rS   rT   r/   rR   r0   rF      s   zSentryAsgiMiddleware._run_asgi2c                    s   | j |||ddI d H S )N   rL   rN   )rG   rS   rP   rQ   r/   r/   r0   rE      rU   zSentryAsgiMiddleware._run_asgi3c                    s
  t d}|d dk}|s|rDz|dkr!| || I d H W S | || I d H W S  tyC } zttj|| jd |d d }~ww t d z4ttj}t	|dd | |
 }	|	  d	|	_t| j|d
}
|	|
 W d    n1 s}w   Y  |d }| | j|\}}|dv rtt|d|||dtd nttj||dtd d| tdjj |jd|idy td zY fdd}|dkr| |||I d H W W  d    W  d    W  d    W t d S | |||I d H W W  d    W  d    W  d    W t d S  tyE } zt||| jd |d d }~ww 1 sJw   Y  W d    n	1 sZw   Y  W d    n1 sjw   Y  W t d d S W t d d S t d w )NFr#   lifespanrK   )r-   Trequest)session_moder"   )
asgi_scope)http	websocketz	{}.server)opnamesourcez1[ASGI] Created transaction (continuing trace): %sz$[ASGI] Created transaction (new): %sz	asgi.typezB[ASGI] Set transaction name and source on transaction: '%s' / '%s'rZ   )custom_sampling_contextz[ASGI] Started transaction: %sc                    s@   |  ddkod uod| v }|r| d   | I d H S )Nr#   zhttp.response.startstatus)getset_http_status)r.   is_http_responserQ   transactionr/   r0   _sentry_wrapped_send   s   z;SentryAsgiMiddleware._run_app.<locals>._sentry_wrapped_send)_asgi_middleware_appliedrb   r;   	Exceptionr1   r   currentr-   setr   configure_scopeclear_breadcrumbs_namer   event_processoradd_event_processor _get_transaction_name_and_sourcer?   r   r   formatr   debugr   r   HTTP_SERVERset_tagr^   r_   start_transaction)rG   rS   rP   rQ   rM   is_recursive_asgi_middlewareis_lifespanr,   r+   sentry_scope	processortytransaction_nametransaction_sourcerg   r/   re   r0   rO      s   





M
M MMzSentryAsgiMiddleware._run_appc                 C   s   | di }|t| t||d< |d tko#|d  dttfv }|sF| | j|\}}||d< d|i|d< t	
d|d |d d  |S )NrX   rf   transaction_infor_   zF[ASGI] Set transaction name and source in event_processor: '%s' / '%s')rb   updater	   r   _DEFAULT_TRANSACTION_NAMEr   r   rq   r?   r   rs   )rG   r.   r'   rZ   request_dataalready_setr^   r_   r/   r/   r0   ro      s.   
z$SentryAsgiMiddleware.event_processorc           	      C   s   d }t | }|d}|dkr-|d}|rt|pd}n7t||dkr%dndd d}t}n'|dkrT|d}|rEt|d	d }|d urD|}nt||dkrMdndd d}t}|d u r`t}t}||fS ||fS )
Nr#   r     r[   ws)hostr!   routepath)r   rb   r   r
   r   r:   r   r   )	rG   r?   rZ   r^   r_   r{   r    r   r   r/   r/   r0   rq     s.   


z5SentryAsgiMiddleware._get_transaction_name_and_sourceN)Fr    r"   )
__name__
__module____qualname__	__slots__rJ   rF   rE   rO   ro   rq   r/   r/   r/   r0   r>   V   s    
/a"r>   )r"   )1__doc__r8   r4   copyr   sentry_sdk._functoolsr   sentry_sdk._typesr   sentry_sdk.apir   sentry_sdk.constsr   sentry_sdk.hubr   $sentry_sdk.integrations._asgi_commonr   r	   r
   sentry_sdk.sessionsr   sentry_sdk.tracingr   r   r   r   sentry_sdk.utilsr   r   r   r   r   r   r   r   typingr   r   r   r   r   r   r   rh   r   rB   r1   r=   r>   r/   r/   r/   r0   <module>   s6    $	
