o
    0 i~f                     @   s  d dl 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	Z	d dl
mZ d dlmZmZmZ d dlmZmZ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m Z m!Z!m"Z" d dl#m$Z$ e$rd dl#m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z, d dl-m.Z.m/Z/ z<d dl0Z0d dl0m1Z2 d dl3m4Z4 d dl5m6Z6 d dl7m8Z8 d dl9m:Z: d dl;m<Z< d dl=m>Z> d dl?m@Z@mAZAmBZCmDZD W n eEy   edw zd dlFmGZG W n eEy   d dlHmGZG Y nw zzd dlIZJW n eEy   d dlJZJY nw W n eEy   dZJY nw dZKdZLG dd deZMdd ZNeeMd:d d!ZOd"d# ZPeeMd$d% ZQd&d' ZRd(d) ZSd*d+ ZTd,d- ZUd.d/ ZVd0d1 ZWG d2d3 d3ZXd4d5 ZYd6d7 ZZd8d9 Z[dS );    N)Set)deepcopy)JSONDecodeError)OP)DidNotEnableIntegration$_DEFAULT_FAILED_REQUEST_STATUS_CODES)DEFAULT_HTTP_METHODS_TO_CAPTUREHttpCodeRangeContainer_is_json_content_typerequest_body_within_bounds)SentryAsgiMiddleware)should_send_default_pii)SOURCE_FOR_STYLETransactionSource)AnnotatedValuecapture_internal_exceptionsensure_integration_enabledevent_from_exceptionparse_versiontransaction_from_function)TYPE_CHECKING)Any	AwaitableCallable	ContainerDictOptionalTupleUnion)EventHttpStatusCodeRange)__version__)	Starlette)
UploadFile)
Middleware)AuthenticationMiddleware)Request)Match)ASGIAppReceiveScopeSendzStarlette is not installed)ExceptionMiddlewarezgeneric Starlette request)endpointurlc                   @   s<   e Zd ZdZde ZdZdedefddZe	dd	 Z
d
S )StarletteIntegration	starlettez
auto.http. r/   Tc                 C   sz   |t vrtd|t f || _|| _tttj|| _t	|t
r%|| _d S tjdtdd |d u r6t| _d S t|| _d S )Nz7Invalid value for transaction_style: %s (must be in %s)zgPassing a list or None for failed_request_status_codes is deprecated. Please pass a set of int instead.   )
stacklevel)TRANSACTION_STYLE_VALUES
ValueErrortransaction_stylemiddleware_spanstuplemapstrupperhttp_methods_to_capture
isinstancer   failed_request_status_codeswarningswarnDeprecationWarningr   r
   )selfr7   r?   r8   r=    rD   m/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/sentry_sdk/integrations/starlette.py__init__X   s*   



zStarletteIntegration.__init__c                  C   sF   t t} | d u rtdtt  t  t  | dkr!t  d S d S )Nz Unparsable Starlette version: {})r      )r   STARLETTE_VERSIONr   formatpatch_middlewarespatch_asgi_apppatch_request_responsepatch_templates)versionrD   rD   rE   
setup_oncez   s   
zStarletteIntegration.setup_onceN)__name__
__module____qualname__
identifieroriginr7   r   r	   rF   staticmethodrO   rD   rD   rD   rE   r0   R   s    

"r0   c                    s*   | j   fdd} jdv}|r|| _ | S )Nc                    s0  t  t}|d u s|js| |fi |I d H S | jj t| ||\}}|d ur6t  j	||d t j
tj tjdN}|d   fdd}	tdt}
|
dk}|s^|	n} fdd	}tdt}|d
k}|sw|n}| |||fi |I d H W  d    S 1 sw   Y  d S )NsourceopnamerT   starlette.middleware_namec                     f   t jtjtdttjd}|d  | i |I d H W  d    S 1 s,w   Y  d S NrR   rX   r[   )	
sentry_sdk
start_spanr   ZMIDDLEWARE_STARLETTE_RECEIVEgetattrr;   r0   rT   set_tagargskwargsspan)middleware_namereceiverD   rE   _sentry_receive      $zO_enable_span_for_middleware.<locals>._create_span_call.<locals>._sentry_receiverP   rh   c                     r\   r]   )	r^   r_   r   ZMIDDLEWARE_STARLETTE_SENDr`   r;   r0   rT   ra   rb   )rf   sendrD   rE   _sentry_send   ri   zL_enable_span_for_middleware.<locals>._create_span_call.<locals>._sentry_sendrk   )r^   
get_clientget_integrationr0   r8   	__class__rP    _get_transaction_from_middlewareget_current_scopeset_transaction_namer_   r   ZMIDDLEWARE_STARLETTErT   ra   r`   r;   )appscoperg   rj   rd   integrationrZ   rW   Zmiddleware_spanrh   Zreceive_nameZreceive_patchedZnew_receiverk   Z	send_nameZsend_patchedZnew_sendold_call)rf   rg   rj   rE   _create_span_call   s8   

$z6_enable_span_for_middleware.<locals>._create_span_call)rw   %_sentry_authenticationmiddleware_call _sentry_exceptionmiddleware_call)__call__rP   )middleware_classrw   not_yet_patchedrD   ru   rE   _enable_span_for_middleware   s   
7r}   Fc                 C   s2   t | t jtj|dd\}}tj||d d S )N)typehandled)Zclient_optionsZ	mechanism)hint)r   r^   rl   optionsr0   rS   Zcapture_event)	exceptionr   eventr   rD   rD   rE   _capture_exception   s   

r   c                    sH   | j dtv}|r"fdd}|| _ | j  fdd}|| _dS dS )zX
    Capture all exceptions in Starlette app and
    also extract user information.
    _sentry_middleware_initc                    sJ   | g|R i | | j    fdd}| j  D ]}|| j |< qd S )Nc                    s   t  t}|d }|d ur)t|do t|jto |j|jv }|r)t	|dd d }t
|jD ]}| v r< | } nq0|d u rCd S t|rU|| g|R i |I d H S || g|R i |S )Nr   status_codeT)r   )r^   rl   rm   r0   hasattrr>   r   intr?   r   r~   __mro___is_async_callable)rC   rc   rd   rt   expZis_http_server_errorZold_handlerclsZold_handlersrD   rE   !_sentry_patched_exception_handler   s0   


zfpatch_exception_middleware.<locals>._sentry_middleware_init.<locals>._sentry_patched_exception_handler)Z_exception_handlerscopykeys)rC   rc   rd   r   keyold_middleware_initr   rE   r      s   
 z;patch_exception_middleware.<locals>._sentry_middleware_initc                    s"   t |  | |||I d H  d S N_add_user_to_sentry_scoperC   rs   rg   rj   ru   rD   rE   ry     s   zDpatch_exception_middleware.<locals>._sentry_exceptionmiddleware_callN)rF   r;   rz   )r{   r|   r   ry   rD   )rv   r   rE   patch_exception_middleware   s   *
r   c                 C   s   d| vrdS t  sdS i }| d }t|dd}|r |d|j t|dd}|r/|d|j t|dd}|r>|d|j t }|| dS )zZ
    Extracts user information from the ASGI scope and
    adds it to Sentry's scope.
    userNusernameidemail)	r   r`   
setdefaultr   r   r   r^   get_isolation_scopeZset_user)rs   Z	user_infoZstarlette_userr   Zuser_idr   sentry_scoperD   rD   rE   r   ,  s"   r   c                    s0   | j  dt v}|r fdd}|| _ dS dS )z/
    Add user information to Sentry scope.
    rx   c                    s"    | |||I d H  t | d S r   r   r   ru   rD   rE   rx   W  s   zNpatch_authentication_middleware.<locals>._sentry_authenticationmiddleware_callN)rz   r;   )r{   r|   rx   rD   ru   rE   patch_authentication_middlewareL  s   
r   c                     s0   t j dt v} | r fdd}|t _dS dS )za
    Patches Starlettes `Middleware` class to record
    spans for every middleware invoked.
    r   c                    sh   |t kr | |g|R i |S t|} | |g|R i | |tkr(t| |tkr2t| d S d S r   )r   r}   r&   r   r-   r   )rC   r   rc   rd   Zspan_enabled_clsr   rD   rE   r   k  s   z2patch_middlewares.<locals>._sentry_middleware_initN)r%   rF   r;   )r|   r   rD   r   rE   rJ   _  s   
rJ   c                     s   t j  fdd} | t _dS )zG
    Instrument Starlette ASGI app using the SentryAsgiMiddleware.
    c                    sl   t  t}|d u r |||I d H S t fddtj|jtj|r(|jnt	dd}||||I d H S )Nc                     s    g| R i |S r   rD   )akw)old_apprC   rD   rE   <lambda>  s    zBpatch_asgi_app.<locals>._sentry_patched_asgi_app.<locals>.<lambda>   )Zmechanism_typer7   Zspan_originr=   Zasgi_version)
r^   rl   rm   r0   r   rS   r7   rT   r=   r	   )rC   rs   rg   rj   rt   Z
middlewarer   rC   rE   _sentry_patched_asgi_app  s   z0patch_asgi_app.<locals>._sentry_patched_asgi_appN)r#   rz   )r   rD   r   rE   rK   |  s   
rK   c                 C   s<   t | tjr| j} t | tjst| pt| ot| jS r   )r>   	functoolspartialfuncasyncioiscoroutinefunctioncallablerz   )objrD   rD   rE   r     s   
r   c                     s    t jj  fdd} | t j_d S )Nc                    sJ   |  t  }|r fdd}|} | S t  fdd}|} | S )Nc                     s   t  t}|d u r| i |I d H S | d }tt  |j| t  }t|}|	 I d H   fdd}tj
|_|||| | i |I d H S )Nr   c                        fdd}|S )Nc                    sH   |  di } rd v r d |d< d v r d |d< t|| d< | S )Nrequestcookiesdatagetr   r   r   request_infoinforD   rE   event_processor  s   zpatch_request_response.<locals>._sentry_request_response.<locals>._sentry_async_func.<locals>._make_request_event_processor.<locals>.event_processorrD   reqrt   r   r   rD   rE   _make_request_event_processor  s   z{patch_request_response.<locals>._sentry_request_response.<locals>._sentry_async_func.<locals>._make_request_event_processor)r^   rl   rm   r0    _set_transaction_name_and_sourcerp   r7   r   StarletteRequestExtractorextract_request_inforS   _nameadd_event_processor)rc   rd   rt   r   r   	extractorr   Zold_funcr   rE   _sentry_async_func  s*   zTpatch_request_response.<locals>._sentry_request_response.<locals>._sentry_async_funcc                     s   t  t}|d u r| i |S t  }|jd ur |j  t  }|jd ur.|j	  | d }t
||j| t|}|   fdd}tj|_|||| | i |S )Nr   c                    r   )Nc                    s(   |  di } r |d< t|| d< | S )Nr   r   r   r   r   rD   rE   r     s
   zpatch_request_response.<locals>._sentry_request_response.<locals>._sentry_sync_func.<locals>._make_request_event_processor.<locals>.event_processorrD   r   r   rD   rE   r     s   zzpatch_request_response.<locals>._sentry_request_response.<locals>._sentry_sync_func.<locals>._make_request_event_processor)r^   rl   rm   r0   rp   ZtransactionZupdate_active_threadr   ZprofileZupdate_active_thread_idr   r7   r   extract_cookies_from_requestrS   r   r   )rc   rd   rt   Zcurrent_scoper   r   r   r   r   r   rE   _sentry_sync_func  s.   



zSpatch_request_response.<locals>._sentry_request_response.<locals>._sentry_sync_func)r   r   wraps)r   Zis_coroutiner   r   Zold_request_responser   rE   _sentry_request_response  s   -70z8patch_request_response.<locals>._sentry_request_response)r1   ZroutingZrequest_response)r   rD   r   rE   rL     s   mrL   c                     sd   zddl m  W n
 ty   Y d S w ddlm}  | jdtv}|r0 fdd}|| _d S d S )Nr   Markup)Jinja2Templates_sentry_jinja2templates_initc                    sH    fdd}| dg  ||d vr|d | | g|R i |S )Nc                    s    t   }d|iS )NZsentry_trace_meta)r^   rp   Ztrace_propagation_meta)r   Z
trace_metar   rD   rE   add_sentry_trace_meta2  s
   
zTpatch_templates.<locals>._sentry_jinja2templates_init.<locals>.add_sentry_trace_metaZcontext_processors)r   append)rC   rc   rd   r   r   Zold_jinja2templates_initrD   rE   r   0  s
   	z5patch_templates.<locals>._sentry_jinja2templates_init)Z
markupsafer   ImportErrorZstarlette.templatingr   rF   r;   )r   r|   r   rD   r   rE   rM     s   
rM   c                   @   sT   e Zd ZdZdZdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd ZdS )r   z
    Extracts useful information from the Starlette request
    (like form data or cookies) and adds it to the Sentry event.
    Nc                 C   s
   || _ d S r   )r   )rC   r   rD   rD   rE   rF   M  s   
z"StarletteRequestExtractor.__init__c                 C   s   d }t  r	|  }|S r   )r   r   )rC   r   rD   rD   rE   r   Q  s   z6StarletteRequestExtractor.extract_cookies_from_requestc           
         s6  t  }i }t  t r|  |d< |  I d H }|s&|W  d    S |r<t||s<t |d< |W  d    S | 	 I d H }|rR||d< |W  d    S | 
 I d H }|ri }| D ]\}}t|t}	|	sn|nt ||< qa||d< |W  d    S t |d< |W  d    S 1 sw   Y  d S )Nr   r   )r^   rl   r   r   r   content_lengthr   r   Zremoved_because_over_size_limitjsonformitemsr>   r$   Zremoved_because_raw_data)
rC   clientr   r   r   r   Z	form_datar   valis_filerD   rD   rE   r   Y  sH   
'$z.StarletteRequestExtractor.extract_request_infoc                    s"   d| j jv rt| j jd S d S )Nzcontent-length)r   headersr   r   rD   rD   rE   r     s   z(StarletteRequestExtractor.content_lengthc                 C   s   | j jS r   )r   r   r   rD   rD   rE   r     s   z!StarletteRequestExtractor.cookiesc                    s.   t d u rd S | j I d H  | j I d H S r   )	multipartr   bodyr   r   rD   rD   rE   r     s
   zStarletteRequestExtractor.formc                 C   s   t | jjdS )Nzcontent-type)r   r   r   r   r   rD   rD   rE   is_json  s   z!StarletteRequestExtractor.is_jsonc                    s6   |   sd S z	| j I d H W S  ty   Y d S w r   )r   r   r   r   r   rD   rD   rE   r     s   zStarletteRequestExtractor.json)rP   rQ   rR   __doc__r   rF   r   r   r   r   r   r   r   rD   rD   rD   rE   r   E  s    0r   c              	   C   sh   |  d}|s	d S |jD ]%}|| }|d tjkr1z|jW   S  ty0   |  d Y   S w qd S )Nrouterr   path)r   Zroutesmatchesr(   ZFULLr   AttributeError)rs   r   ZroutematchrD   rD   rE   _transaction_name_from_router  s   


r   c                 C   sh   d }t | }|dkr|jd}|rt|pd }n	|dkr"t|j}|d u r+t}tj}| j||d d S )Nr.   r/   rV   )	r   rs   r   r   r   _DEFAULT_TRANSACTION_NAMEr   ROUTErq   )rs   r7   r   rZ   rW   r.   rD   rD   rE   r     s   
r   c                 C   sJ   d }d }|j dkrt| j}tj}||fS |j dkr!t|}tj}||fS )Nr.   r/   )r7   r   rn   r   Z	COMPONENTr   r   )rr   Z
asgi_scopert   rZ   rW   rD   rD   rE   ro     s   


ro   )F)\r   r   r@   collections.abcr   r   r   r   r   r^   Zsentry_sdk.constsr   Zsentry_sdk.integrationsr   r   r   Z$sentry_sdk.integrations._wsgi_commonr	   r
   r   r   Zsentry_sdk.integrations.asgir   Zsentry_sdk.scoper   Zsentry_sdk.tracingr   r   Zsentry_sdk.utilsr   r   r   r   r   r   typingr   r   r   r   r   r   r   r   r   Zsentry_sdk._typesr    r!   r1   r"   rH   Zstarlette.applicationsr#   Zstarlette.datastructuresr$   Zstarlette.middlewarer%   Z#starlette.middleware.authenticationr&   Zstarlette.requestsr'   Zstarlette.routingr(   Zstarlette.typesr)   r*   r+   ZStarletteScoper,   r   Zstarlette.middleware.exceptionsr-   Zstarlette.exceptionsZpython_multipartr   r   r5   r0   r}   r   r   r   r   rJ   rK   r   rL   rM   r   r   r   ro   rD   rD   rD   rE   <module>   s     	(:GM
!
t*j