o
    i-                     @   s  d dl mZ d dlmZ d dl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 d dlmZ d d	lmZmZ d d
lmZmZmZ z(d dlmZ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$ W n e%yw   e	dw d dl&m'Z' e'rd dl&m(Z(m)Z)m*Z* d dl+m,Z, d dl-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z4m5Z5m6Z6 d dlm7Z7 d dl8m9Z9m:Z: dZ;G dd de
Z<G dd deZ=d0ddZ>d0d d!Z?d1d$d%Z@d0d&d'ZAd2d+d,ZBee<d-eCd(d)ddfd.d/ZDdS )3    )Set)deepcopyN)OP)$_DEFAULT_FAILED_REQUEST_STATUS_CODESDidNotEnableIntegration)SentryAsgiMiddleware)ignore_logger)should_send_default_pii)TransactionSourceSOURCE_FOR_STYLE)ensure_integration_enabledevent_from_exceptiontransaction_from_function)RequestLitestar)BaseRouteHandler)DefineMiddleware)	HTTPRoute)ConnectionDataExtractor)HTTPExceptionzLitestar is not installed)TYPE_CHECKING)AnyOptionalUnion)ASGIApp)HTTPReceiveMessage	HTTPScopeMessage
MiddlewareReceiveScopeSendWebSocketReceiveMessage)MiddlewareProtocol)EventHintzgeneric Litestar requestc                   @   s<   e Zd ZdZde Zef			dddZedd	d
ZdS )LitestarIntegrationlitestarz
auto.http.failed_request_status_codesSet[int]returnNc                 C   s
   || _ d S )N)r)   )selfr)    r-   ]/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/sentry_sdk/integrations/litestar.py__init__8   s   
zLitestarIntegration.__init__c                   C   s   t   t  t  td d S )Nr(   )patch_app_initpatch_middlewarespatch_http_route_handler	   r-   r-   r-   r.   
setup_once>   s   
zLitestarIntegration.setup_once)r)   r*   r+   Nr+   N)	__name__
__module____qualname__
identifieroriginr   r/   staticmethodr3   r-   r-   r-   r.   r'   4   s    

r'   c                       sB   e Zd Zejfdddeddf fddZdeddfd	d
Z  Z	S )SentryLitestarASGIMiddlewareappr   span_originr+   Nc                    s   t  j|ddd|dd d S )NFendpointasgi   )r<   unsafe_context_datatransaction_stylemechanism_typer=   asgi_version)superr/   )r,   r<   r=   	__class__r-   r.   r/   P   s   
z%SentryLitestarASGIMiddleware.__init__excc                 C   s   dS )zAvoid catching exceptions from request handlers.

        Those exceptions are already handled in Litestar.after_exception handler.
        We still catch exceptions from application lifespan handlers.
        Nr-   )r,   rH   r-   r-   r.   _capture_request_exception\   s   z7SentryLitestarASGIMiddleware._capture_request_exception)
r5   r6   r7   r'   r9   strr/   	ExceptionrI   __classcell__r-   r-   rF   r.   r;   O   s    r;   r+   c                     s(   t j tt d
 fdd	} | t _dS )a\  
    Replaces the Litestar class's `__init__` function in order to inject `after_exception` handlers and set the
    `SentryLitestarASGIMiddleware` as the outmost middleware in the stack.
    See:
    - https://docs.litestar.dev/2/usage/applications.html#after-exception
    - https://docs.litestar.dev/2/usage/middleware/using-middleware.html
    r,   r   argsr   kwargsr+   Nc                    sN   t g|dpg |d< |dpg }tg||d<  | g|R i | d S )Nafter_exception
middleware)exception_handlergetr;   )r,   rM   rN   rP   old__init__r-   r.   injection_wrappero   s   z)patch_app_init.<locals>.injection_wrapper)r,   r   rM   r   rN   r   r+   N)r   r/   r   r'   )rU   r-   rS   r.   r0   e   s   

r0   c                     s(   t j tt d fdd} | t _d S )Nr,   r   r+   list[Middleware]c                    s   dd  | D S )Nc                 S   s   g | ]}t |qS r-   )enable_span_for_middleware).0rP   r-   r-   r.   
<listcomp>   s    zIpatch_middlewares.<locals>.resolve_middleware_wrapper.<locals>.<listcomp>r-   )r,   old_resolve_middleware_stackr-   r.   resolve_middleware_wrapper   s   z5patch_middlewares.<locals>.resolve_middleware_wrapper)r,   r   r+   rV   )r   resolve_middlewarer   r'   )r\   r-   rZ   r.   r1   }   s   
r1   rP   r   c                    s   t | dr	| tu r| S t| tr| jj n| j 										
	 d fdd} jdv}|r>t| tr;|| j_| S || _| S )N__call__r,   r$   scopeLitestarScopereceiver    sendr"   r+   c                    s   t  td u r| |I d H S | jj t jtj tj	dR}|
d  						d fdd	}td
t}|dk}|sG|n}d fdd}	td
t}
|
dk}|sa|	n}| |||I d H W  d    S 1 sww   Y  d S )Nopnamer9   litestar.middleware_namerM   r   rN   r+   2Union[HTTPReceiveMessage, WebSocketReceiveMessage]c                     s   t  td u r| i |I d H S t jtjtdttj	d}|
d  | i |I d H W  d    S 1 s?w   Y  d S Nr7   rc   rf   )
sentry_sdk
get_clientget_integrationr'   
start_spanr   MIDDLEWARE_LITESTAR_RECEIVEgetattrrJ   r9   set_tag)rM   rN   span)middleware_namera   r-   r.   _sentry_receive   s   $zNenable_span_for_middleware.<locals>._create_span_call.<locals>._sentry_receiver5   rr   messager   c                    s   t  td u r| I d H S t jtjtdttj	d}|
d  | I d H W  d    S 1 s9w   Y  d S rh   )ri   rj   rk   r'   rl   r   MIDDLEWARE_LITESTAR_SENDrn   rJ   r9   ro   )rs   rp   )rq   rb   r-   r.   _sentry_send   s   $zKenable_span_for_middleware.<locals>._create_span_call.<locals>._sentry_sendru   )rM   r   rN   r   r+   rg   )rs   r   r+   N)ri   rj   rk   r'   rG   r5   rl   r   MIDDLEWARE_LITESTARr9   ro   rn   rJ   )r,   r_   ra   rb   middleware_spanrr   receive_namereceive_patchednew_receiveru   	send_namesend_patchednew_sendold_call)rq   ra   rb   r.   _create_span_call   s6   $z5enable_span_for_middleware.<locals>._create_span_call)r   )
r,   r$   r_   r`   ra   r    rb   r"   r+   N)hasattrr;   
isinstancer   rP   r^   r5   )rP   r   not_yet_patchedr-   r~   r.   rW      s2   


5
rW   c                     s2   t j 											 d fd
d} | t _d S )Nr,   r   r_   r   ra   r    rb   r"   r+   c                    s   t  td u r| ||I d H S t  }d j||d}tddd|  d}|I d H d fdd}tj|_	|
| | ||I d H S )Nr<   )r_   ra   rb   T)
parse_bodyparse_querybodyeventr%   _r&   r+   c                    s    d}|  di }t dd|d< t r d |d< d ur&|d< d }|jd ur1|j}nt|jdr<|jj}n|j}|d urGt|}d	td
 i}|sVt	}d	t
ji}| t|||d | S )Nroute_handlerrequest_body    content_lengthcookiesdatavaluesourcer>   )r   transactiontransaction_info)rR   lenr
   re   r   fnr   r   r   _DEFAULT_TRANSACTION_NAMEr   ROUTEupdater   )r   r   r   request_infofunctx_nametx_infoextracted_request_datarequest_datar_   r-   r.   event_processor   s4   



zHpatch_http_route_handle.<locals>.handle_wrapper.<locals>.event_processor)r   r%   r   r&   r+   r%   )ri   rj   rk   r'   get_isolation_scoperequest_classr   popr8   _nameadd_event_processor)r,   r_   ra   rb   sentry_scoper   r   r   
old_handler   r.   handle_wrapper   s$   

$
z/patch_http_route_handle.<locals>.handle_wrapper)
r,   r   r_   r   ra   r    rb   r"   r+   N)r   handle)r   r-   r   r.   r2      s   
:r2   r_   r`   Optional[dict[str, Any]]c                 C   s.   |  d}t|tr|S t|dr| S d S )Nuserasdict)rR   r   dictr   r   )r_   
scope_userr-   r-   r.   retrieve_user_from_scope  s   


r   rH   c                 C   s   d }t  r	t|}|rt|trt }|| t| tr1t 	t
}|d ur1| j|jvr1d S t| t jt
jddd\}}tj||d d S )NF)typehandled)client_options	mechanism)hint)r
   r   r   r   ri   r   set_userr   rj   rk   r'   status_coder)   r   optionsr8   capture_event)rH   r_   	user_infor   integrationr   r   r-   r-   r.   rQ      s"   



rQ   r4   )rP   r   r+   r   )r_   r`   r+   r   )Ecollections.abcr   copyr   ri   sentry_sdk.constsr   sentry_sdk.integrationsr   r   r   sentry_sdk.integrations.asgir   sentry_sdk.integrations.loggingr	   sentry_sdk.scoper
   sentry_sdk.tracingr   r   sentry_sdk.utilsr   r   r   r(   r   r   litestar.handlers.baser   litestar.middlewarer   litestar.routes.httpr   litestar.data_extractorsr   litestar.exceptionsr   ImportErrortypingr   r   r   r   litestar.types.asgi_typesr   litestar.typesr   r   r   r   r    r!   r`   r"   r#   r$   sentry_sdk._typesr%   r&   r   r'   r;   r0   r1   rW   r2   r   rK   rQ   r-   r-   r-   r.   <module>   sJ    (




L
@
