o
    Zh^                     @   sp  d dl m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mZ d dlmZmZ d d	lmZm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m Z m!Z! e	r|d dl"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( d dl)m*Z+ d dlm,Z, z<d dl-Z-d dl-m.Z/ d dl0m1Z1 d dl2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8m9Z9 d dl:m;Z; d dl<m=Z=m>Z>m*Z?m@Z@ W n eAy   edw zd dlBmCZC W n eAy   d dlDmCZC Y nw zd dlEZEW n eAy   dZEY nw dZFdZGG dd deZHdd ZId;d!d"ZJd#d$ ZKd%d& ZLd'd( ZMd)d* ZNd+d, ZOd-d. ZPd/d0 ZQd1d2 ZRG d3d4 d4ZSd5d6 ZTd7d8 ZUd9d: ZVdS )<    )absolute_importN)deepcopy)	iteritems)TYPE_CHECKING)OP)Hub_should_send_default_pii)DidNotEnableIntegration)_is_json_content_typerequest_body_within_bounds)SentryAsgiMiddleware)SOURCE_FOR_STYLETRANSACTION_SOURCE_COMPONENTTRANSACTION_SOURCE_ROUTE)AnnotatedValuecapture_internal_exceptionsevent_from_exceptionloggerparse_versiontransaction_from_function)Any	AwaitableCallableDictOptionalTuple)Scope)Event)__version__)	Starlette)
UploadFile)
Middleware)AuthenticationMiddleware)Request)Match)ASGIAppReceiver   SendzStarlette is not installed)ExceptionMiddlewarezgeneric Starlette request)endpointurlc                   @   s*   e Zd ZdZdZd	ddZedd ZdS )
StarletteIntegration	starlette r+   c                 C   s"   |t vrtd|t f || _d S )Nz7Invalid value for transaction_style: %s (must be in %s))TRANSACTION_STYLE_VALUES
ValueErrortransaction_style)selfr1    r3   X/var/www/html/lang_env/lib/python3.10/site-packages/sentry_sdk/integrations/starlette.py__init__L   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)versionr3   r3   r4   
setup_onceU   s   
zStarletteIntegration.setup_onceN)r+   )__name__
__module____qualname__
identifierr1   r5   staticmethodr>   r3   r3   r3   r4   r,   G   s    
	r,   c                    s*   | j   fdd} jdv}|r|| _ | S )Nc                    sL  t j}|t}|d ur| jj | }t| ||\}}	|d ur)|j||	d W d    n1 s3w   Y  |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 | |fi |I d H S )Nsourceopdescriptionstarlette.middleware_namec                     h   t j}|jtjtdtd}|d  | i |I d H W  d    S 1 s-w   Y  d S NrA   rF   rI   )r   current
start_spanr   ZMIDDLEWARE_STARLETTE_RECEIVEgetattrstrset_tagargskwargshubspan)middleware_namereceiver3   r4   _sentry_receive      $zO_enable_span_for_middleware.<locals>._create_span_call.<locals>._sentry_receiver?   rX   c                     rJ   rK   )r   rL   rM   r   ZMIDDLEWARE_STARLETTE_SENDrN   rO   rP   rQ   )rV   sendr3   r4   _sentry_send   rY   zL_enable_span_for_middleware.<locals>._create_span_call.<locals>._sentry_sendr[   )r   rL   get_integrationr,   	__class__r?   configure_scope _get_transaction_from_middlewareset_transaction_namerM   r   ZMIDDLEWARE_STARLETTErP   rN   rO   )appscoperW   rZ   rS   rT   integrationsentry_scopenamerE   Zmiddleware_spanrX   Zreceive_nameZreceive_patchedZnew_receiver[   Z	send_nameZsend_patchedZnew_sendold_call)rV   rW   rZ   r4   _create_span_callk   s<   



$&z6_enable_span_for_middleware.<locals>._create_span_call)rh   %_sentry_authenticationmiddleware_call _sentry_exceptionmiddleware_call)__call__r?   )middleware_classrh   not_yet_patchedr3   rf   r4   _enable_span_for_middlewareg   s   
8rn   Fc                 C   sR   t j}|td u rd S t| |jr|jjnd tj|dd\}}|j||d d S )N)typehandled)Zclient_optionsZ	mechanism)hint)	r   rL   r\   r,   r   clientoptionsrB   Zcapture_event)	exceptionrp   rT   eventrq   r3   r3   r4   _capture_exception   s   

rv   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   |d }t |dot|jto|jdk}|rt|dd d }t|jD ]}| v r0 | } nq$|d u r7d S t|rI|| g|R i |I d H S || g|R i |S )Nr   status_codei  T)rp   )hasattr
isinstancerx   intrv   ro   __mro___is_async_callable)r2   rR   rS   expZis_http_server_errorZold_handlerclsZold_handlersr3   r4   !_sentry_patched_exception_handler   s(   

zfpatch_exception_middleware.<locals>._sentry_middleware_init.<locals>._sentry_patched_exception_handler)Z_exception_handlerscopykeys)r2   rR   rS   r   keyold_middleware_initr   r4   rw      s   
z;patch_exception_middleware.<locals>._sentry_middleware_initc                    s"   t |  | |||I d H  d S N_add_user_to_sentry_scoper2   rb   rW   rZ   rf   r3   r4   rj      s   zDpatch_exception_middleware.<locals>._sentry_exceptionmiddleware_callN)r5   rO   rk   )rl   rm   rw   rj   r3   )rg   r   r4   patch_exception_middleware   s   %
r   c                 C   s   d| vrdS t  sdS tj}|tdu rdS | ?}i }| d }t|dd}|r1|d|j t|dd}|r@|d|j	 t|dd}|rO|d|j
 ||_W d   dS 1 s]w   Y  dS )zZ
    Extracts user information from the ASGI scope and
    adds it to Sentry's scope.
    userNusernameidemail)r   r   rL   r\   r,   r^   rN   
setdefaultr   r   r   r   )rb   rT   rd   Z	user_infoZstarlette_userr   Zuser_idr   r3   r3   r4   r     s*   
"r   c                    s0   | j  dt v}|r fdd}|| _ dS dS )z/
    Add user information to Sentry scope.
    ri   c                    s"    | |||I d H  t | d S r   r   r   rf   r3   r4   ri   4  s   zNpatch_authentication_middleware.<locals>._sentry_authenticationmiddleware_callN)rk   rO   )rl   rm   ri   r3   rf   r4   patch_authentication_middleware)  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.
    rw   c                    s\   |t kr | |fi |S t|} | |fi | |tkr"t| |tkr,t| d S d S r   )r   rn   r#   r   r)   r   )r2   r   rs   Zspan_enabled_clsr   r3   r4   rw   H  s   z2patch_middlewares.<locals>._sentry_middleware_initN)r"   r5   rO   )rm   rw   r3   r   r4   r9   <  s   
r9   c                     s   t j  fdd} | t _dS )zG
    Instrument Starlette ASGI app using the SentryAsgiMiddleware.
    c                    s`   t jt}|d u r |||I d H S t fddtj|jd}|j|_||||I d H S )Nc                     s    g| R i |S r   r3   )akw)old_appr2   r3   r4   <lambda>g  s    zBpatch_asgi_app.<locals>._sentry_patched_asgi_app.<locals>.<lambda>)Zmechanism_typer1   )	r   rL   r\   r,   r   rB   r1   Z
_run_asgi3rk   )r2   rb   rW   rZ   rc   Z
middlewarer   r2   r4   _sentry_patched_asgi_app`  s   z0patch_asgi_app.<locals>._sentry_patched_asgi_appN)r    rk   )r   r3   r   r4   r:   Y  s   
r:   c                 C   s<   t | tjr| j} t | tjst| pt| ot| jS r   )rz   	functoolspartialfuncasyncioiscoroutinefunctioncallablerk   )objr3   r3   r4   r}   t  s   
r}   c                     s    t jj  fdd} | t j_d S )Nc                    s@   |  t  }|r fdd}|} | S  fdd}|} | S )Nc                     s   t j}|t}|d u r| i |I d H S | $}| d }t||j| t|}| I d H   fdd}W d    n1 sBw   Y  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   ru   rq   request_infoinfor3   r4   event_processor  s   zpatch_request_response.<locals>._sentry_request_response.<locals>._sentry_async_func.<locals>._make_request_event_processor.<locals>.event_processorr3   reqrc   r   r   r3   r4   _make_request_event_processor  s   z{patch_request_response.<locals>._sentry_request_response.<locals>._sentry_async_func.<locals>._make_request_event_processor)r   rL   r\   r,   r^    _set_transaction_name_and_sourcer1   StarletteRequestExtractorextract_request_inforB   _nameadd_event_processorrR   rS   rT   rc   rd   r   Z	extractorr   Zold_funcr   r4   _sentry_async_func  s&   

zTpatch_request_response.<locals>._sentry_request_response.<locals>._sentry_async_funcc                     s   t j}|t}|d u r| i |S | +}|jd ur"|j  | d }t||j| t	|}|
   fdd}W d    n1 sEw   Y  tj|_|||| | i |S )Nr   c                    r   )Nc                    s(   |  di } r |d< t|| d< | S )Nr   r   r   r   r   r3   r4   r     s
   zpatch_request_response.<locals>._sentry_request_response.<locals>._sentry_sync_func.<locals>._make_request_event_processor.<locals>.event_processorr3   r   r   r3   r4   r     s   zzpatch_request_response.<locals>._sentry_request_response.<locals>._sentry_sync_func.<locals>._make_request_event_processor)r   rL   r\   r,   r^   ZprofileZupdate_active_thread_idr   r1   r   extract_cookies_from_requestrB   r   r   r   r   r   r4   _sentry_sync_func  s(   



zSpatch_request_response.<locals>._sentry_request_response.<locals>._sentry_sync_func)r}   )r   Zis_coroutiner   r   Zold_request_responser   r4   _sentry_request_response  s   *0+z8patch_request_response.<locals>._sentry_request_response)r-   ZroutingZrequest_response)r   r3   r   r4   r;   ~  s   cr;   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 j} | }d|iS )NZsentry_trace_meta)r   rL   Ztrace_propagation_meta)r   rT   Z
trace_metar   r3   r4   add_sentry_trace_meta  s   zTpatch_templates.<locals>._sentry_jinja2templates_init.<locals>.add_sentry_trace_metaZcontext_processors)r   append)r2   rR   rS   r   r   Zold_jinja2templates_initr3   r4   r     s
   z5patch_templates.<locals>._sentry_jinja2templates_init)Z
markupsafer   ImportErrorZstarlette.templatingr   r5   rO   )r   rm   r   r3   r   r4   r<     s   
r<   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   )r2   r   r3   r3   r4   r5     s   
z"StarletteRequestExtractor.__init__c                 C   s*   t jj}|d u r
d S d }t r|  }|S r   )r   rL   rr   r   r   )r2   rr   r   r3   r3   r4   r     s   z6StarletteRequestExtractor.extract_cookies_from_requestc           
         sB  t jj}|d u rd S i }t  t r|  |d< |  I d H }|s,|W  d    S |rBt||sBt	 |d< |W  d    S | 
 I d H }|rX||d< |W  d    S |  I d H }|ri }t|D ]\}}t|t}	|	st|nt ||< qg||d< |W  d    S t |d< |W  d    S 1 sw   Y  d S )Nr   r   )r   rL   rr   r   r   r   content_lengthr   r   Zremoved_because_over_size_limitjsonformr   rz   r!   Zremoved_because_raw_data)
r2   rr   r   r   r   r   Z	form_datar   valis_filer3   r3   r4   r   )  sL   
'$z.StarletteRequestExtractor.extract_request_infoc                    s"   d| j jv rt| j jd S d S )Nzcontent-length)r   headersr{   r   r3   r3   r4   r   [  s   z(StarletteRequestExtractor.content_lengthc                 C   s   | j jS r   )r   r   r   r3   r3   r4   r   b  s   z!StarletteRequestExtractor.cookiesc                    s.   t d u rd S | j I d H  | j I d H S r   )	multipartr   bodyr   r   r3   r3   r4   r   f  s
   zStarletteRequestExtractor.formc                 C   s   t | jjdS )Nzcontent-type)r   r   r   r   r   r3   r3   r4   is_jsons  s   z!StarletteRequestExtractor.is_jsonc                    s   |   sd S | j I d H S r   )r   r   r   r   r3   r3   r4   r   w  s   zStarletteRequestExtractor.json)r?   r@   rA   __doc__r   r5   r   r   r   r   r   r   r   r3   r3   r3   r4   r     s    2r   c                 C   sD   |  d}|s	d S |jD ]}|| }|d tjkr|j  S qd S )Nrouterr   )r   Zroutesmatchesr%   ZFULLpath)rb   r   Zroutematchr3   r3   r4   _transaction_name_from_router  s   



r   c                 C   st   d }t | }|dkr|jd}|rt|pd }n	|dkr"t|j}|d u r*t}t}| j||d t	d|| d S )Nr*   r+   rD   z=[Starlette] Set transaction name and source on scope: %s / %s)
r   rb   r   r   r   _DEFAULT_TRANSACTION_NAMEr   r`   r   debug)rb   r1   r   re   rE   r*   r3   r3   r4   r     s    
r   c                 C   sF   d }d }|j dkrt| j}t}||fS |j dkrt|}t}||fS )Nr*   r+   )r1   r   r]   r   r   r   )ra   Z
asgi_scoperc   re   rE   r3   r3   r4   r_     s   


r_   )F)W
__future__r   r   r   r   r   Zsentry_sdk._compatr   Zsentry_sdk._typesr   Zsentry_sdk.constsr   Zsentry_sdk.hubr   r   Zsentry_sdk.integrationsr	   r
   Z$sentry_sdk.integrations._wsgi_commonr   r   Zsentry_sdk.integrations.asgir   Zsentry_sdk.tracingr   r   r   Zsentry_sdk.utilsr   r   r   r   r   r   typingr   r   r   r   r   r   Zsentry_sdk.scoper   ZSentryScoper   r-   r   r7   Zstarlette.applicationsr    Zstarlette.datastructuresr!   Zstarlette.middlewarer"   Z#starlette.middleware.authenticationr#   Zstarlette.requestsr$   Zstarlette.routingr%   Zstarlette.typesr&   r'   ZStarletteScoper(   r   Zstarlette.middleware.exceptionsr)   Zstarlette.exceptionsr   r   r/   r,   rn   rv   r   r   r   r9   r:   r}   r;   r<   r   r   r   r_   r3   r3   r3   r4   <module>   sr     	  
HH#
j)n