o
    hf                     @   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   c/var/www/html/pro-man-master/venv/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_once|   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   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   ri   c                     r\   r]   )	r^   r_   r   MIDDLEWARE_STARLETTE_SENDra   r;   r0   rT   rb   rc   )rg   sendrD   rE   _sentry_send   rj   zL_enable_span_for_middleware.<locals>._create_span_call.<locals>._sentry_sendrm   )r^   
get_clientget_integrationr0   r8   	__class__rP    _get_transaction_from_middlewareget_current_scopeset_transaction_namer_   r   MIDDLEWARE_STARLETTErT   rb   ra   r;   )appscoperh   rl   re   integrationrZ   rW   middleware_spanri   receive_namereceive_patchednew_receiverm   	send_namesend_patchednew_sendold_call)rg   rh   rl   rE   _create_span_call   s8   

$z6_enable_span_for_middleware.<locals>._create_span_call)r   %_sentry_authenticationmiddleware_call _sentry_exceptionmiddleware_call)__call__rP   )middleware_classr   not_yet_patchedrD   r   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)client_options	mechanism)hint)r   r^   rn   optionsr0   rS   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^   rn   ro   r0   hasattrr>   r   intr?   r   r   __mro___is_async_callable)rC   rd   re   rw   expis_http_server_errorold_handlerclsold_handlersrD   rE   !_sentry_patched_exception_handler   s0   


zfpatch_exception_middleware.<locals>._sentry_middleware_init.<locals>._sentry_patched_exception_handler)_exception_handlerscopykeys)rC   rd   re   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   rv   rh   rl   r   rD   rE   r     s   zDpatch_exception_middleware.<locals>._sentry_exceptionmiddleware_callN)rF   r;   r   )r   r   r   r   rD   )r   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   ra   
setdefaultr   r   r   r^   get_isolation_scoper   )rv   	user_infostarlette_userr   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.
    r   c                    s"    | |||I d H  t | d S r   r   r   r   rD   rE   r   Y  s   zNpatch_authentication_middleware.<locals>._sentry_authenticationmiddleware_callN)r   r;   )r   r   r   rD   r   rE   patch_authentication_middlewareN  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   rd   re   span_enabled_clsr   rD   rE   r   m  s   z2patch_middlewares.<locals>._sentry_middleware_initN)r%   rF   r;   )r   r   rD   r   rE   rJ   a  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>   )mechanism_typer7   span_originr=   asgi_version)
r^   rn   ro   r0   r   rS   r7   rT   r=   r	   )rC   rv   rh   rl   rw   
middlewarer   rC   rE   _sentry_patched_asgi_app  s   z0patch_asgi_app.<locals>._sentry_patched_asgi_appN)r#   r   )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callabler   )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   reqrw   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^   rn   ro   r0    _set_transaction_name_and_sourcerr   r7   r   StarletteRequestExtractorextract_request_inforS   _nameadd_event_processor)rd   re   rw   r   r   	extractorr   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^   rn   ro   r0   rr   transactionupdate_active_threadr   profileupdate_active_thread_idr   r7   r   extract_cookies_from_requestrS   r   r   )rd   re   rw   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   is_coroutiner   r   old_request_responser   rE   _sentry_request_response  s   -70z8patch_request_response.<locals>._sentry_request_response)r1   routing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 )Nsentry_trace_meta)r^   rr   trace_propagation_meta)r   
trace_metar   rD   rE   add_sentry_trace_meta4  s
   
zTpatch_templates.<locals>._sentry_jinja2templates_init.<locals>.add_sentry_trace_metacontext_processors)r   append)rC   rd   re   r   r   old_jinja2templates_initrD   rE   r   2  s
   	z5patch_templates.<locals>._sentry_jinja2templates_init)
markupsafer   ImportError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   O  s   
z"StarletteRequestExtractor.__init__c                 C   s   d }t  r	|  }|S r   )r   r   )rC   r   rD   rD   rE   r   S  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^   rn   r   r   r   content_lengthr   r   removed_because_over_size_limitjsonformitemsr>   r$   removed_because_raw_data)
rC   clientr   r   r   r  	form_datar   valis_filerD   rD   rE   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   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   G  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)rv   r  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   rv   r   r   r  _DEFAULT_TRANSACTION_NAMEr   ROUTErs   )rv   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   rp   r   	COMPONENTr  r  )ru   
asgi_scoperw   rZ   rW   rD   rD   rE   rq     s   


rq   )F)\r   r   r@   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   typingr   r   r   r   r   r   r   r   r   sentry_sdk._typesr    r!   r1   r"   rH   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  r5   r0   r   r   r   r   r   rJ   rK   r   rL   rM   r   r  r   rq   rD   rD   rD   rE   <module>   s     	(<GM
!
t*j