o
    BDi-g                     @   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"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/m0Z0 z<d dl1Z1d dl1m2Z3 d dl4m5Z5 d dl6m7Z7 d dl8m9Z9 d dl:m;Z; d dl<m=Z= d dl>m?Z? d dl@mAZAmBZBmCZDmEZE W n eFy   edw zd dlGmHZH W n eFy   d dlImHZH Y nw zzd dlJZKW n eFy   d dlKZKY nw W n eFy
   dZKY nw dZLdZMG dd deZNdd ZOeeNd:d d!ZPd"d# ZQeeNd$d% ZRd&d' ZSd(d) ZTd*d+ ZUd,d- ZVd.d/ ZWd0d1 ZXG d2d3 d3ZYd4d5 ZZd6d7 Z[d8d9 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logger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. r0   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
   )selfr8   r@   r9   r>    rE   Z/var/www/Datamplify/venv/lib/python3.10/site-packages/sentry_sdk/integrations/starlette.py__init__Y   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)versionrE   rE   rF   
setup_once}   s   
zStarletteIntegration.setup_onceN)__name__
__module____qualname__
identifieroriginr8   r   r	   rG   staticmethodrP   rE   rE   rE   rF   r1   S   s    

$r1   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namerU   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 NrS   rY   r\   )	
sentry_sdk
start_spanr   MIDDLEWARE_STARLETTE_RECEIVEgetattrr<   r1   rU   set_tagargskwargsspan)middleware_namereceiverE   rF   _sentry_receive      $zO_enable_span_for_middleware.<locals>._create_span_call.<locals>._sentry_receiverQ   rj   c                     r]   r^   )	r_   r`   r   MIDDLEWARE_STARLETTE_SENDrb   r<   r1   rU   rc   rd   )rh   sendrE   rF   _sentry_send   rk   zL_enable_span_for_middleware.<locals>._create_span_call.<locals>._sentry_sendrn   )r_   
get_clientget_integrationr1   r9   	__class__rQ    _get_transaction_from_middlewareget_current_scopeset_transaction_namer`   r   MIDDLEWARE_STARLETTErU   rc   rb   r<   )appscoperi   rm   rf   integrationr[   rX   middleware_spanrj   receive_namereceive_patchednew_receivern   	send_namesend_patchednew_sendold_call)rh   ri   rm   rF   _create_span_call   s8   

$z6_enable_span_for_middleware.<locals>._create_span_call)r   %_sentry_authenticationmiddleware_call _sentry_exceptionmiddleware_call)__call__rQ   )middleware_classr   not_yet_patchedrE   r   rF   _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)client_options	mechanism)hint)r   r_   ro   optionsr1   rT   capture_event)	exceptionr   eventr   rE   rE   rF   _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_   ro   rp   r1   hasattrr?   r   intr@   r   r   __mro___is_async_callable)rD   re   rf   rx   expis_http_server_errorold_handlerclsold_handlersrE   rF   !_sentry_patched_exception_handler   s0   


zfpatch_exception_middleware.<locals>._sentry_middleware_init.<locals>._sentry_patched_exception_handler)_exception_handlerscopykeys)rD   re   rf   r   keyold_middleware_initr   rF   r      s   
 z;patch_exception_middleware.<locals>._sentry_middleware_initc                    s"   t |  | |||I d H  d S N_add_user_to_sentry_scoperD   rw   ri   rm   r   rE   rF   r     s   zDpatch_exception_middleware.<locals>._sentry_exceptionmiddleware_callN)rG   r<   r   )r   r   r   r   rE   )r   r   rF   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   rb   
setdefaultr   r   r   r_   get_isolation_scoper   )rw   	user_infostarlette_userr   user_idr   sentry_scoperE   rE   rF   r   /  s"   
r   c                    s0   | j  dt v}|r fdd}|| _ dS dS )z/
    Add user information to Sentry scope.
    r   c                    s"    | |||I d H  t | d S r   r   r   r   rE   rF   r   Z  s   zNpatch_authentication_middleware.<locals>._sentry_authenticationmiddleware_callN)r   r<   )r   r   r   rE   r   rF   patch_authentication_middlewareO  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   )rD   r   re   rf   span_enabled_clsr   rE   rF   r   n  s   z2patch_middlewares.<locals>._sentry_middleware_initN)r&   rG   r<   )r   r   rE   r   rF   rK   b  s   
rK   c                     s   t j  fdd} | t _dS )zG
    Instrument Starlette ASGI app using the SentryAsgiMiddleware.
    c                    sr   t  t}|d u r |||I d H S t fddtj|jtj|r(|jnt	d}|j
|_||||I d H S )Nc                     s    g| R i |S r   rE   )akw)old_apprD   rE   rF   <lambda>  s    zBpatch_asgi_app.<locals>._sentry_patched_asgi_app.<locals>.<lambda>)mechanism_typer8   span_originr>   )r_   ro   rp   r1   r   rT   r8   rU   r>   r	   
_run_asgi3r   )rD   rw   ri   rm   rx   
middlewarer   rD   rF   _sentry_patched_asgi_app  s   z0patch_asgi_app.<locals>._sentry_patched_asgi_appN)r$   r   )r   rE   r   rF   rL     s   
rL   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callabler   )objrE   rE   rF   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inforE   rF   event_processor  s   zpatch_request_response.<locals>._sentry_request_response.<locals>._sentry_async_func.<locals>._make_request_event_processor.<locals>.event_processorrE   reqrx   r   r   rE   rF   _make_request_event_processor  s   z{patch_request_response.<locals>._sentry_request_response.<locals>._sentry_async_func.<locals>._make_request_event_processor)r_   ro   rp   r1    _set_transaction_name_and_sourcers   r8   r   StarletteRequestExtractorextract_request_inforT   _nameadd_event_processor)re   rf   rx   r   r   	extractorr   old_funcr   rF   _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   rE   rF   r     s
   zpatch_request_response.<locals>._sentry_request_response.<locals>._sentry_sync_func.<locals>._make_request_event_processor.<locals>.event_processorrE   r   r   rE   rF   r      s   zzpatch_request_response.<locals>._sentry_request_response.<locals>._sentry_sync_func.<locals>._make_request_event_processor)r_   ro   rp   r1   rs   transactionupdate_active_threadr   profileupdate_active_thread_idr   r8   r   extract_cookies_from_requestrT   r   r   )re   rf   rx   current_scoper   r   r   r   r   r   rF   _sentry_sync_func  s.   



zSpatch_request_response.<locals>._sentry_request_response.<locals>._sentry_sync_func)r   r   wraps)r   is_coroutiner   r   old_request_responser   rF   _sentry_request_response  s   -70z8patch_request_response.<locals>._sentry_request_response)r2   routingrequest_response)r   rE   r   rF   rM     s   mrM   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 )Nsentry_trace_meta)r_   rs   trace_propagation_meta)r   
trace_metar   rE   rF   add_sentry_trace_meta5  s
   
zTpatch_templates.<locals>._sentry_jinja2templates_init.<locals>.add_sentry_trace_metacontext_processors)r   append)rD   re   rf   r   r   old_jinja2templates_initrE   rF   r   3  s
   	z5patch_templates.<locals>._sentry_jinja2templates_init)
markupsafer   ImportErrorstarlette.templatingr   rG   r<   )r   r   r   rE   r   rF   rN     s   
rN   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   )rD   r   rE   rE   rF   rG   P  s   
z"StarletteRequestExtractor.__init__c                 C   s   d }t  r	|  }|S r   )r   r   )rD   r   rE   rE   rF   r   T  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_   ro   r   r   r   content_lengthr   r   removed_because_over_size_limitjsonformitemsr?   r%   removed_because_raw_data)
rD   clientr   r   r   r  	form_datar   valis_filerE   rE   rF   r   \  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   rE   rE   rF   r     s   z(StarletteRequestExtractor.content_lengthc                 C   s   | j jS r   )r   r   r   rE   rE   rF   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   rE   rE   rF   r    s
   zStarletteRequestExtractor.formc                 C   s   t | jjdS )Nzcontent-type)r   r   r  r   r   rE   rE   rF   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   rE   rE   rF   r     s   zStarletteRequestExtractor.json)rQ   rR   rS   __doc__r   rG   r   r   r   r   r  r  r   rE   rE   rE   rF   r   H  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   routesmatchesr)   FULLr  AttributeError)rw   r  routematchrE   rE   rF   _transaction_name_from_router  s   


r  c                 C   sv   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 t	
d|| d S )Nr/   r0   rW   z=[Starlette] Set transaction name and source on scope: %s / %s)r   rw   r   r   r  _DEFAULT_TRANSACTION_NAMEr   ROUTErt   r   debug)rw   r8   r   r[   rX   r/   rE   rE   rF   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/   r0   )r8   r   rq   r   	COMPONENTr  r  )rv   
asgi_scoperx   r[   rX   rE   rE   rF   rr     s   


rr   )F)]r   r   rA   collections.abcr   r   r   r   r   r_   sentry_sdk.constsr   sentry_sdk.integrationsr   r   r   $sentry_sdk.integrations._wsgi_commonr	   r
   r   r   sentry_sdk.integrations.asgir   sentry_sdk.scoper   sentry_sdk.tracingr   r   sentry_sdk.utilsr   r   r   r   r   r   r   typingr   r   r   r   r   r   r   r   r    sentry_sdk._typesr!   r"   r2   r#   rI   starlette.applicationsr$   starlette.datastructuresr%   starlette.middlewarer&   #starlette.middleware.authenticationr'   starlette.requestsr(   starlette.routingr)   starlette.typesr*   r+   r,   StarletteScoper-   r   starlette.middleware.exceptionsr.   starlette.exceptionspython_multipartr	  r  r6   r1   r   r   r   r   r   rK   rL   r   rM   rN   r   r  r   rr   rE   rE   rE   rF   <module>   s    $
(<GM
!
t*j