o
    h'.                     @   s  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#yq   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-m.Z.m/Z/m0Z0m1Z2m3Z3m4Z4 d dlm5Z5 d dl6m7Z7m8Z8 dZ9G dd deZ:G dd de
Z;dd Z<dd Z=d d! Z>d"d# Z?d$d% Z@ee:d&d' ZAdS )(    )SetN)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                   @   s6   e Zd ZdZde Zef	d	ddZedd ZdS )
LitestarIntegrationlitestarz
auto.http.returnNc                 C   s
   || _ d S )N)failed_request_status_codes)selfr)    r+   b/var/www/html/pro-man-master/venv/lib/python3.10/site-packages/sentry_sdk/integrations/litestar.py__init__6   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(   N)	__name__
__module____qualname__
identifieroriginr   r-   staticmethodr1   r+   r+   r+   r,   r&   2   s    

r&   c                       s*   e Zd Zejf fdd	Zdd Z  ZS )SentryLitestarASGIMiddlewarec                    s   t  j|ddd|dd d S )NFendpointasgi   )appunsafe_context_datatransaction_stylemechanism_typespan_originasgi_version)superr-   )r*   r<   r@   	__class__r+   r,   r-   O   s   
z%SentryLitestarASGIMiddleware.__init__c                 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*   excr+   r+   r,   _capture_request_exception[   s   z7SentryLitestarASGIMiddleware._capture_request_exception)r2   r3   r4   r&   r6   r-   rF   __classcell__r+   r+   rC   r,   r8   N   s    r8   c                     s&   t j tt  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
    c                    sN   t g|dpg |d< |dpg }tg||d<  | g|R i | d S )Nafter_exception
middleware)exception_handlergetr8   )r*   argskwargsrI   old__init__r+   r,   injection_wrapperp   s   z)patch_app_init.<locals>.injection_wrapperN)r   r-   r   r&   )rP   r+   rN   r,   r.   e   s   	
r.   c                     s&   t j tt  fdd} | t _d S )Nc                    s   dd  | D S )Nc                 S   s   g | ]}t |qS r+   )enable_span_for_middleware).0rI   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   resolve_middlewarer   r&   )rV   r+   rT   r,   r/      s   
r/   c                    sj   t | dr	| tu r| S t| tr| jj n| j  fdd} jdv}|r3t| tr0|| j_| S || _| S )N__call__c                    s   t  td u r| |I d H S | jj t jtj tj	dJ}|
d   fdd}tdt}|dk}|s@|n} fdd}	tdt}
|
d	k}|sY|	n}| |||I d H W  d    S 1 sow   Y  d S )
Nopnamer6   litestar.middleware_namec                     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 Nr4   rY   r\   )
sentry_sdk
get_clientget_integrationr&   
start_spanr   MIDDLEWARE_LITESTAR_RECEIVEgetattrstrr6   set_tag)rL   rM   span)middleware_namereceiver+   r,   _sentry_receive   s   $zNenable_span_for_middleware.<locals>._create_span_call.<locals>._sentry_receiver2   ri   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 r]   )r^   r_   r`   r&   ra   r   MIDDLEWARE_LITESTAR_SENDrc   rd   r6   re   )messagerf   )rg   sendr+   r,   _sentry_send   s   $zKenable_span_for_middleware.<locals>._create_span_call.<locals>._sentry_sendrm   )r^   r_   r`   r&   rD   r2   ra   r   MIDDLEWARE_LITESTARr6   re   rc   rd   )r*   scoperh   rl   middleware_spanri   receive_namereceive_patchednew_receiverm   	send_namesend_patchednew_sendold_call)rg   rh   rl   r,   _create_span_call   s*   $z5enable_span_for_middleware.<locals>._create_span_call)ry   )hasattrr8   
isinstancer   rI   rX   r2   )rI   ry   not_yet_patchedr+   rw   r,   rQ      s   


1
rQ   c                     s   t j  fdd} | t _d S )Nc                    s   t  td u r| ||I d H S t  }d j||d}tddd|  d}|I d H  fdd}tj|_	|
| | ||I d H S )Nr<   )ro   rh   rl   T)
parse_bodyparse_querybodyc                    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}| |||d | S )Nroute_handlerrequest_body    content_lengthcookiesdatavaluesourcer9   )r   transactiontransaction_info)rK   lenr	   r[   rz   fnr   r   r   _DEFAULT_TRANSACTION_NAMEr
   ROUTEupdate)event_r   request_infofunctx_nametx_infoextracted_request_datarequest_dataro   r+   r,   event_processor   s4   



zHpatch_http_route_handle.<locals>.handle_wrapper.<locals>.event_processor)r^   r_   r`   r&   get_isolation_scoperequest_classr   popr5   _nameadd_event_processor)r*   ro   rh   rl   sentry_scoper   r   r   
old_handler   r,   handle_wrapper   s$   

%
z/patch_http_route_handle.<locals>.handle_wrapper)r   handle)r   r+   r   r,   r0      s   
:r0   c                 C   s.   |  d}t|tr|S t|dr| S d S )Nuserasdict)rK   r{   dictrz   r   )ro   
scope_userr+   r+   r,   retrieve_user_from_scope  s   


r   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   r^   r   set_userr   r_   r`   r&   status_coder)   r   optionsr5   capture_event)rE   ro   	user_infor   integrationr   r   r+   r+   r,   rJ   #  s"   



rJ   )Bcollections.abcr   r^   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    LitestarScoper!   r"   r#   sentry_sdk._typesr$   r%   r   r&   r8   r.   r/   rQ   r0   r   rJ   r+   r+   r+   r,   <module>   sH    (
IA