o
    ٰ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deNfd d!ZOeeMdKd#ePd$dddfd%d&ZQdLd'd(ZReeMdMd+d,ZSdLd-d.ZTdNd/d0ZUdNd1d2ZVd3ddeWfd4d5ZXdNd6d7ZYdNd8d9ZZG d:d; d;Z[dOd>d?Z\d)d@dAe]dBdddfdCdDZ^	E		F	*	G			HdPdIdJZ_dS )Q    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                	   @   sP   e Zd ZdZde ZdZdedefdeddd	e	d
dfddZ
edddZdS )StarletteIntegration	starlettez
auto.http. r/   Ftransaction_stylefailed_request_status_codesz0Union[Set[int], list[HttpStatusCodeRange], None]middleware_spanshttp_methods_to_captureztuple[str, ...]c                 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
ValueErrorr3   r5   tuplemapstrupperr6   
isinstancer   r4   warningswarnDeprecationWarningr   r
   )selfr3   r4   r5   r6    rD   U/home/ubuntu/.local/lib/python3.10/site-packages/sentry_sdk/integrations/starlette.py__init__X   s,   


zStarletteIntegration.__init__returnNc                  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_oncerG   N)__name__
__module____qualname__
identifieroriginr3   r   r	   r=   boolrF   staticmethodrP   rD   rD   rD   rE   r0   R   s&    

#r0   middleware_classr   rG   c                    sD   | j  												
	 d fdd} jdv}|r || _ | S )Nappr   scopeDict[str, Any]receive'Callable[[], Awaitable[Dict[str, Any]]]send+Callable[[Dict[str, Any]], Awaitable[None]]kwargsrG   c                    sP  t  t}|d u r| |fi |I d H S t| ||\}}|d ur/t  j||d |js@| |fi |I d H S | jj	 t j
tj tjdP}|d  d fdd	}	td
t}
|
dk}|sm|	n}d fdd}td
t}|dk}|s|n}| |||fi |I d H W  d    S 1 sw   Y  d S )NsourceopnamerV   starlette.middleware_nameargsr   ra   rG   c                     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 NrT   rd   rg   )	
sentry_sdk
start_spanr   MIDDLEWARE_STARLETTE_RECEIVEgetattrr=   r0   rV   set_tagrh   ra   span)middleware_namer]   rD   rE   _sentry_receive      $zO_enable_span_for_middleware.<locals>._create_span_call.<locals>._sentry_receiverR   rs   c                     ri   rj   )	rk   rl   r   MIDDLEWARE_STARLETTE_SENDrn   r=   r0   rV   ro   rp   )rr   r_   rD   rE   _sentry_send   rt   zL_enable_span_for_middleware.<locals>._create_span_call.<locals>._sentry_sendrv   rh   r   ra   r   rG   r   )rk   
get_clientget_integrationr0    _get_transaction_from_middlewareget_current_scopeset_transaction_namer5   	__class__rR   rl   r   MIDDLEWARE_STARLETTErV   ro   rn   r=   )rZ   r[   r]   r_   ra   integrationrf   rc   middleware_spanrs   receive_namereceive_patchednew_receiverv   	send_namesend_patchednew_sendold_call)rr   r]   r_   rE   _create_span_call   s<   		$z6_enable_span_for_middleware.<locals>._create_span_call)r   %_sentry_authenticationmiddleware_call _sentry_exceptionmiddleware_call)rZ   r   r[   r\   r]   r^   r_   r`   ra   r   rG   N)__call__rR   )rY   r   not_yet_patchedrD   r   rE   _enable_span_for_middleware   s$   
>r   F	exceptionhandledc                 C   s2   t | t jtj|dd\}}tj||d d S )N)typer   )client_options	mechanism)hint)r   rk   rx   optionsr0   rU   capture_event)r   r   eventr   rD   rD   rE   _capture_exception   s   

r   c                    s`   | j dtv}|r.dfdd	}|| _ | j 		
		
						d fdd}|| _dS dS )zX
    Capture all exceptions in Starlette app and
    also extract user information.
    _sentry_middleware_initrC   r   rh   ra   rG   Nc                    s\   | g|R i | | j   								 d fdd}| j  D ]}|| j |< q$d S )	NrC   r   rh   ra   rG   c                    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   )rk   rx   ry   r0   hasattrr?   r   intr4   r   r   __mro___is_async_callable)rC   rh   ra   r   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rC   r   rh   r   ra   r   rG   N)_exception_handlerscopykeys)rC   rh   ra   r   keyold_middleware_initr   rE   r      s   
!z;patch_exception_middleware.<locals>._sentry_middleware_initr\   r[   r]   r^   r_   r`   c                    s"   t |  | |||I d H  d S N_add_user_to_sentry_scoperC   r[   r]   r_   r   rD   rE   r     s   zDpatch_exception_middleware.<locals>._sentry_exceptionmiddleware_callr   
rC   r\   r[   r\   r]   r^   r_   r`   rG   N)rF   r=   r   )rY   r   r   r   rD   )r   r   rE   patch_exception_middleware   s&   *
r   r[   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   rn   
setdefaultr   r   r   rk   get_isolation_scopeset_user)r[   	user_infostarlette_userr   user_idr   sentry_scoperD   rD   rE   r   4  s"   r   c                    sF   | j  dt v}|r!											
d fdd}|| _ d
S d
S )z/
    Add user information to Sentry scope.
    r   rC   r\   r[   r]   r^   r_   r`   rG   Nc                    s"    | |||I d H  t | d S r   r   r   r   rD   rE   r   ]  s   zNpatch_authentication_middleware.<locals>._sentry_authenticationmiddleware_callr   )r   r=   )rY   r   r   rD   r   rE   patch_authentication_middlewareS  s    
	r   c                     sF   t j dt v} | r!										d fd	d
}|t _dS dS )za
    Patches Starlettes `Middleware` class to record
    spans for every middleware invoked.
    r   rC   r   r   rh   ra   rG   Nc                    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   rh   ra   span_enabled_clsr   rD   rE   r   t  s   z2patch_middlewares.<locals>._sentry_middleware_init)
rC   r   r   r   rh   r   ra   r   rG   N)r%   rF   r=   )r   r   rD   r   rE   rK   i  s    
rK   c                     s2   t j 											
d fdd} | t _d
S )zG
    Instrument Starlette ASGI app using the SentryAsgiMiddleware.
    rC   r#   r[   StarletteScoper]   r*   r_   r,   rG   Nc                    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_typer3   span_originr6   asgi_version)
rk   rx   ry   r0   r   rU   r3   rV   r6   r	   )rC   r[   r]   r_   r   
middlewarer   rC   rE   _sentry_patched_asgi_app  s   z0patch_asgi_app.<locals>._sentry_patched_asgi_app)
rC   r#   r[   r   r]   r*   r_   r,   rG   N)r#   r   )r   rD   r   rE   rL     s   
rL   objc                 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   )r   rD   rD   rE   r     s   
r   c                     s"   t jj d fdd} | t j_d S )Nr   Callable[[Any], Any]rG   r)   c                    sN   |  t  }|rd	 fdd}|} | S t d	 fdd}|} | S )
Nrh   r   ra   rG   c                     s   t  t}|d u r| i |I d H S | d }tt  |j| t  }t|}|	 I d H  						d	 fdd}tj
|_|||| | i |I d H S )
Nr   reqr   r   rG   (Callable[[Event, dict[str, Any]], Event]c                       						d fdd}|S )	Nr   r    r   r\   rG   c                    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_processor)r   r    r   r\   rG   r    rD   r   r   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   r   r   r   rG   r   )rk   rx   ry   r0    _set_transaction_name_and_sourcer{   r3   r   StarletteRequestExtractorextract_request_inforU   _nameadd_event_processor)rh   ra   r   r   r   	extractorr   old_funcr   rE   _sentry_async_func  s6   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|}|  						d	 fdd}tj|_|||| | i |S )
Nr   r   r   r   rG   r   c                    r   )	Nr   r    r   dict[str, Any]rG   c                    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_processor)r   r    r   r   rG   r    rD   r   r   rD   rE   r     s   zzpatch_request_response.<locals>._sentry_request_response.<locals>._sentry_sync_func.<locals>._make_request_event_processorr   )rk   rx   ry   r0   r{   transactionupdate_active_threadr   profileupdate_active_thread_idr   r3   r   extract_cookies_from_requestrU   r   r   )rh   ra   r   current_scoper   r   r   r   r   r   rE   _sentry_sync_func  s:   



zSpatch_request_response.<locals>._sentry_request_response.<locals>._sentry_sync_funcrw   )r   r   wraps)r   is_coroutiner   r   old_request_responser   rE   _sentry_request_response  s   -70z8patch_request_response.<locals>._sentry_request_response)r   r   rG   r)   )r1   routingrequest_response)r   rD   r   rE   rM     s   lrM   c                     sv   zddl m  W n
 ty   Y d S w ddlm}  | jdtv}|r9								
	 d fdd}|| _d S d S )Nr   Markup)Jinja2Templates_sentry_jinja2templates_initrC   r   rh   r   ra   rG   c                    sJ   d fdd}| dg  ||d vr|d | | g|R i |S )	Nr   r'   rG   r\   c                    s    t   }d|iS )Nsentry_trace_meta)rk   r{   trace_propagation_meta)r   
trace_metar   rD   rE   add_sentry_trace_meta8  s
   
zTpatch_templates.<locals>._sentry_jinja2templates_init.<locals>.add_sentry_trace_metacontext_processors)r   r'   rG   r\   )r   append)rC   rh   ra   r  r   old_jinja2templates_initrD   rE   r  5  s
   z5patch_templates.<locals>._sentry_jinja2templates_init)rC   r   rh   r   ra   r   rG   N)
markupsafer   ImportErrorstarlette.templatingr   rF   r=   )r   r   r  rD   r  rE   rN   "  s,   
rN   c                   @   s   e Zd ZU dZdZded< dddZ		 			dd
dZ		 			dddZdddZ	dddZ
dddZdd defddZd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.
    Nr'   r   rC   rG   c                 C   s
   || _ d S r   )r   )rC   r   rD   rD   rE   rF   R  s   
z"StarletteRequestExtractor.__init__Optional[Dict[str, Any]]c                 C   s   d }t  r	|  }|S r   )r   r   )rC   r   rD   rD   rE   r   U  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   )rk   rx   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_infoOptional[int]c                    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_lengthr\   c                 C   s   | j jS r   )r   r   r   rD   rD   rE   r     s   z!StarletteRequestExtractor.cookiesr   c                    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)rC   r   r   r'   rG   N)rC   r   rG   r  )rC   r   rG   r  )rC   r   rG   r\   )rC   r   rG   r   )rR   rS   rT   __doc__r   __annotations__rF   r   r   r  r   r  rW   r  r  rD   rD   rD   rE   r   J  s&   
 

	

1

r   r   Optional[str]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)r[   r   routematchrD   rD   rE   _transaction_name_from_router  s   


r(  zsentry_sdk.Scoper3   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/   rb   )	r   r[   r   r   r(  _DEFAULT_TRANSACTION_NAMEr   ROUTEr|   )r[   r3   r   rf   rc   r.   rD   rD   rE   r     s   
r   rZ   
asgi_scoper   #Tuple[Optional[str], Optional[str]]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/   )r3   r   r}   r   	COMPONENTr(  r*  )rZ   r+  r   rf   rc   rD   rD   rE   rz     s   


rz   )F)rY   r   rG   N)r[   r\   rG   NrQ   )r[   r   rG   r  )rZ   r   r+  r\   r   r0   rG   r,  )`r   r   r@   collections.abcr   r   r   r  r   rk   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"   rI   starlette.applicationsr#   starlette.datastructuresr$   starlette.middlewarer%   #starlette.middleware.authenticationr&   starlette.requestsr'   starlette.routingr(   starlette.typesr)   r*   r+   r   r,   r  starlette.middleware.exceptionsr-   starlette.exceptionspython_multipartr  r)  r9   r0   r   r   BaseExceptionr   r   r   r   rK   rL   rW   r   rM   rN   r   r(  r=   r   rz   rD   rD   rD   rE   <module>   s     	(:M

P


!
	
r(
f
