o
    0 i?)                     @   s  d dl mZ d dlZd dlmZ d dlmZ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 z4d 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 d dlm Z m!Z!m"Z" d dl#m$Z$ W n e%yu   edw d dl&m'Z' e'rd dl&m(Z(m)Z)m*Z* d dl+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z4m5Z5m6Z6 d dlm7Z7 d dl8m9Z9 dZ:G 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$ ZAee;d%d& ZBdS )'    )deepcopyN)OP)DidNotEnableIntegration)SentryAsgiMiddleware)should_send_default_pii)SOURCE_FOR_STYLETransactionSource)ensure_integration_enabledevent_from_exceptiontransaction_from_function)RequestStarliteState)BaseRouteHandler)DefineMiddleware)get_plugin_for_value)	HTTPRoute)ConnectionDataExtractoris_async_callableRef)	BaseModelzStarlite is not installed)TYPE_CHECKING)AnyOptionalUnion)
ASGIAppHintHTTPReceiveMessage	HTTPScopeMessage
MiddlewareReceiveScopeSendWebSocketReceiveMessage)MiddlewareProtocol)Eventzgeneric Starlite requestc                   @   s&   e Zd ZdZde Zedd ZdS )StarliteIntegrationstarlitez
auto.http.c                   C   s   t   t  t  d S )N)patch_app_initpatch_middlewarespatch_http_route_handle r-   r-   l/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/sentry_sdk/integrations/starlite.py
setup_once5   s   
zStarliteIntegration.setup_onceN)__name__
__module____qualname__
identifieroriginstaticmethodr/   r-   r-   r-   r.   r(   1   s
    
r(   c                       s"   e Zd Zejf fdd	Z  ZS )SentryStarliteASGIMiddlewarec                    s   t  j|ddd|dd d S )NFendpointZasgi   )appZunsafe_context_dataZtransaction_styleZmechanism_typespan_originZasgi_version)super__init__)selfr9   r:   	__class__r-   r.   r<   >   s   
z%SentryStarliteASGIMiddleware.__init__)r0   r1   r2   r(   r4   r<   __classcell__r-   r-   r>   r.   r6   =   s    r6   c                     s&   t j tt  fdd} | t _dS )a  
    Replaces the Starlite class's `__init__` function in order to inject `after_exception` handlers and set the
    `SentryStarliteASGIMiddleware` as the outmost middleware in the stack.
    See:
    - https://starlite-api.github.io/starlite/usage/0-the-starlite-app/5-application-hooks/#after-exception
    - https://starlite-api.github.io/starlite/usage/7-middleware/0-middleware-intro/
    c                    sd   | dg }|jtgt|tr|n|gd |dpg }tg||d<  | g|R i | d S )Nafter_exception)rA   
middleware)popupdateexception_handler
isinstancelistgetr6   )r=   argskwargsrA   rB   Zold__init__r-   r.   injection_wrapperU   s   z)patch_app_init.<locals>.injection_wrapperN)r   r<   r
   r(   )rL   r-   rK   r.   r*   J   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).0rB   r-   r-   r.   
<listcomp>r   s    zIpatch_middlewares.<locals>.resolve_middleware_wrapper.<locals>.<listcomp>r-   )r=   Zold_resolve_middleware_stackr-   r.   resolve_middleware_wrappero   s   z5patch_middlewares.<locals>.resolve_middleware_wrapper)r   Zresolve_middlewarer
   r(   )rQ   r-   rP   r.   r+   k   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namer4   starlite.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 Nr2   rS   rV   )
sentry_sdk
get_clientget_integrationr(   
start_spanr   ZMIDDLEWARE_STARLITE_RECEIVEgetattrstrr4   set_tag)rI   rJ   span)middleware_namereceiver-   r.   _sentry_receive   s   $zNenable_span_for_middleware.<locals>._create_span_call.<locals>._sentry_receiver0   rb   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 rW   )rX   rY   rZ   r(   r[   r   ZMIDDLEWARE_STARLITE_SENDr\   r]   r4   r^   )messager_   )r`   sendr-   r.   _sentry_send   s   $zKenable_span_for_middleware.<locals>._create_span_call.<locals>._sentry_sendre   )rX   rY   rZ   r(   r?   r0   r[   r   ZMIDDLEWARE_STARLITEr4   r^   r\   r]   )r=   scopera   rd   Zmiddleware_spanrb   Zreceive_nameZreceive_patchedZnew_receivere   Z	send_nameZsend_patchedZnew_sendZold_call)r`   ra   rd   r.   _create_span_call   s*   $z5enable_span_for_middleware.<locals>._create_span_call)rh   )hasattrr6   rF   r   rB   rR   r0   )rB   rh   Znot_yet_patchedr-   rg   r.   rM   z   s   


1
rM   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 )Nr9   )rf   ra   rd   T)Z
parse_bodyZ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t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sourcer7   )rl   ZtransactionZtransaction_info)rH   lenr   rU   rF   fnr   valuer   r   _DEFAULT_TRANSACTION_NAMEr	   ZROUTErD   r   )event_rk   Zrequest_infofuncZtx_nameZtx_infoZextracted_request_dataZrequest_datarf   r-   r.   event_processor   s4   



zHpatch_http_route_handle.<locals>.handle_wrapper.<locals>.event_processor)rX   rY   rZ   r(   get_isolation_scopeZrequest_classr   rC   r3   _nameZadd_event_processor)r=   rf   ra   rd   sentry_scoperl   rj   r{   Z
old_handlerz   r.   handle_wrapper   s    

$
z/patch_http_route_handle.<locals>.handle_wrapper)r   handle)r   r-   r   r.   r,      s   
7r,   c                 C   sh   |  d}|s	d S t|tr|S t|tr| S t|dr"| S t|}|r2t|js2||S d S )Nuserasdict)	rH   rF   dictr   ri   r   r   r   to_dict)rf   Z
scope_userpluginr-   r-   r.   retrieve_user_from_scope  s   




r   c                 C   sd   d }t  r	t|}|rt|trt }|| t| t j	t
jddd\}}tj||d d S )NF)typeZhandled)Zclient_optionsZ	mechanism)hint)r   r   rF   r   rX   r|   Zset_userr   rY   optionsr(   r3   Zcapture_event)excrf   rx   Z	user_infor~   rw   r   r-   r-   r.   rE     s   


rE   )Ccopyr   rX   Zsentry_sdk.constsr   Zsentry_sdk.integrationsr   r   Zsentry_sdk.integrations.asgir   Zsentry_sdk.scoper   Zsentry_sdk.tracingr   r	   Zsentry_sdk.utilsr
   r   r   r)   r   r   r   Zstarlite.handlers.baser   Zstarlite.middlewarer   Zstarlite.plugins.baser   Zstarlite.routes.httpr   Zstarlite.utilsr   r   r   Zpydanticr   ImportErrortypingr   r   r   r   Zstarlite.typesr   r   r   r   r    r!   r"   r#   ZStarliteScoper$   r%   r&   Zsentry_sdk._typesr'   rv   r(   r6   r*   r+   rM   r,   r   rE   r-   r-   r-   r.   <module>   sF    0!I>