
    Uvh-g                        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%rd dl$m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- d dl.m/Z/m0Z0 	 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 	 d dlGmHZH 	 	 d dlJZKdZLdZM G d de      ZNd ZO eeN      d,d       ZPd ZQ eeN      d         ZRd! ZSd" ZTd# ZUd$ ZVd% ZWd& ZX G d' d(      ZYd) ZZd* Z[d+ Z\y# eF$ r	  ed      w xY w# eF$ r	 d dlImHZH Y |w xY w# eF$ r d dlKZKY w xY w# eF$ r dZKY w xY w)-    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                   >    e Zd ZdZde ZdZdedefdZe	d        Z
y)	StarletteIntegration	starlettez
auto.http. r1   Tc                 P   |t         vrt        d|dt         d      || _        || _        t	        t        t        j                  |            | _        t        |t              r|| _        y t        j                  dt        d       |t        | _        y t!        |      | _        y )Nz%Invalid value for transaction_style: z (must be in )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   )selfr<   rD   r=   rB   s        \/opt/face_recognition/venv/lib/python3.12/site-packages/sentry_sdk/integrations/starlette.py__init__zStarletteIntegration.__init__Y   s     $<<$&>@  "3 0',S<S-T'U$137+ , MM4"	 +23W03I/40    c                      t        t              } | t        dj                  t                    t	                t                t                | dk\  rt                y y )Nz Unparsable Starlette version: {})r      )r   STARLETTE_VERSIONr   formatpatch_middlewarespatch_asgi_apppatch_request_responsepatch_templates)versions    rI   
setup_oncezStarletteIntegration.setup_once}   sW       12?299:KL  	 g rK   N)__name__
__module____qualname__
identifieroriginr<   r	   r
   rJ   staticmethodrU    rK   rI   r3   r3   S   sA    J*&F  $H ?"H  rK   r3   c                 X    | j                   fd}j                  dv}|r|| _         | S )Nc                   K   t        j                         j                  t              }||j                  s | |fi | d {   S | j
                  j                  t        | ||      \  }}|%t        j                         j                  ||       t        j                  t        j                  t        j                        5 }|j                  d       fd}	t        dt!                    }
|
dk(  }|s|	n}fd}t        dt!                    }|dk(  }|s|n} | |||fi | d {   cd d d        S 7 7 # 1 sw Y   y xY ww)	NsourceopnamerZ   starlette.middleware_namec            
        K   t        j                  t        j                  t	        dt                    t        j                        5 }|j                  d        | i | d {   cd d d        S 7 # 1 sw Y   y xY wwNrX   ra   rd   )	
sentry_sdk
start_spanr   MIDDLEWARE_STARLETTE_RECEIVEgetattrr@   r3   rZ   set_tag)argskwargsspanmiddleware_namereceives      rI   _sentry_receivezO_enable_span_for_middleware.<locals>._create_span_call.<locals>._sentry_receive   sz     **66 .#g,G/66 : LL!<oN!($!9&!99: : :: :0   A	BA:*A8+A:.
B8A::B?BrV   rq   c            
        K   t        j                  t        j                  t	        dt                    t        j                        5 }|j                  d        | i | d {   cd d d        S 7 # 1 sw Y   y xY wwrf   )	rg   rh   r   MIDDLEWARE_STARLETTE_SENDrj   r@   r3   rZ   rk   )rl   rm   rn   ro   sends      rI   _sentry_sendzL_enable_span_for_middleware.<locals>._create_span_call.<locals>._sentry_send   sz     **33 ~s4yA/66 7 LL!<oN!%t!6v!667 7 77 7rr   rv   )rg   
get_clientget_integrationr3   r=   	__class__rV    _get_transaction_from_middlewareget_current_scopeset_transaction_namerh   r   MIDDLEWARE_STARLETTErZ   rk   rj   r@   )appscoperp   ru   rm   integrationrc   r`   middleware_spanrq   receive_namereceive_patchednew_receiverv   	send_namesend_patchednew_sendro   old_calls     ``             @rI   _create_span_callz6_enable_span_for_middleware.<locals>._create_span_call   sm     ++-==>RSk&B&B!#ugtFvFFF--00 8UKPf((*?? @ 
 ""&& '..
 %	O ##$?Q: #7JGEL*.??O1@/gK7  j#d)<I$6L+7|TH!#uk8NvNNK%	O %	O Gb OK%	O %	Os>   AE EBE A0EEEE EEE )r   %_sentry_authenticationmiddleware_call _sentry_exceptionmiddleware_call)__call__rV   )middleware_classr   not_yet_patchedr   s      @rI   _enable_span_for_middlewarer      s@    ((H5On '' 0 O $5!rK   c                     t        | t        j                         j                  t        j
                  |d      \  }}t        j                  ||       y )N)typehandled)client_options	mechanism)hint)r   rg   rw   optionsr3   rY   capture_event)	exceptionr   eventr   s       rI   _capture_exceptionr      sG     '!,,.66/::wOKE4 U.rK   c                     | j                   dt              v}|r%fd}|| _         | j                  fd}|| _        yy)zX
    Capture all exceptions in Starlette app and
    also extract user information.
    _sentry_middleware_initc                      | g|i | | j                   j                         fd}| j                   j                         D ]  }|| j                   |<    y )Nc                   K   t        j                         j                  t              }|d   }|Qt	        |d      xr4 t        |j                  t              xr |j                  |j                  v }|rt        |d       d }t        |      j                  D ]  }|v s|   } n |y t        |      r || g|i | d {   S  || g|i |S 7 w)Nr   status_codeT)r   )rg   rw   rx   r3   hasattrrC   r   intrD   r   r   __mro___is_async_callable)	rH   rl   rm   r   expis_http_server_errorold_handlerclsold_handlerss	           rI   !_sentry_patched_exception_handlerzfpatch_exception_middleware.<locals>._sentry_middleware_init.<locals>._sentry_patched_exception_handler   s     (335EE( 1g*]3 W&s<WOO{/V/VV )
 ,*3= #9,, Cl*&23&7
 &%k2!,T!CD!CF!CCC&t=d=f== Ds   BC"%CCC)_exception_handlerscopykeys)rH   rl   rm   r   keyr   old_middleware_inits        @rI   r   z;patch_exception_middleware.<locals>._sentry_middleware_init   sc    6t6v6  3388:L>@ //446 R0Q((-RrK   c                 N   K   t        |        | |||       d {    y 7 wN_add_user_to_sentry_scoperH   r   rp   ru   r   s       rI   r   zDpatch_exception_middleware.<locals>._sentry_exceptionmiddleware_call  s%      &e,4666s   %#%N)rJ   r@   r   )r   r   r   r   r   r   s       @@rI   patch_exception_middlewarer      sX     +33/s;N7OOO(	RT %<!#,,	7  %E!A rK   c                 j   d| vryt               syi }| d   }t        |dd      }|r|j                  d|j                         t        |dd      }|r|j                  d|j                         t        |dd      }|r|j                  d|j
                         t        j                         }||_        y)zZ
    Extracts user information from the ASGI scope and
    adds it to Sentry's scope.
    userNusernameidemail)	r   rj   
setdefaultr   r   r   rg   get_isolation_scoper   )r   	user_infostarlette_userr   user_idr   sentry_scopes          rI   r   r   /  s     U"$I6]N~z48HZ)@)@AndD1GT>#4#45NGT2EWn&:&:;113L!LrK   c                 V    | j                   dt              v}|rfd}|| _         yy)z/
    Add user information to Sentry scope.
    r   c                 N   K    | |||       d {    t        |       y 7 wr   r   r   s       rI   r   zNpatch_authentication_middleware.<locals>._sentry_authenticationmiddleware_callZ  s(     4666%e, 7s   %#%N)r   r@   )r   r   r   r   s      @rI   patch_authentication_middlewarer   O  s7    
  ((H=S]RO	-
 %J! rK   c                  f    t         j                  dt              v} | rfd}|t         _        yy)za
    Patches Starlettes `Middleware` class to record
    spans for every middleware invoked.
    r   c                     |t         k(  r | |g|i |S t        |      } | |g|i | |t        k(  rt        |       |t        k(  rt        |       y y r   )r   r   r(   r   r/   r   )rH   r   rl   rm   span_enabled_clsr   s        rI   r   z2patch_middlewares.<locals>._sentry_middleware_initn  sj    ***4FtFvFF:3?&6HHH../4))*3/ *rK   N)r'   rJ   r@   )r   r   r   s     @rI   rP   rP   b  s8     %--/s;N7OOO	0 6
! rK   c                  F    t         j                  fd} | t         _        y)zG
    Instrument Starlette ASGI app using the SentryAsgiMiddleware.
    c                 l   K   t        j                         j                  t              }|  |||       d {   S t	         fdt        j
                  |j                  t        j                  |r|j                  nt              }|j                  |_         ||||       d {   S 7 s7 w)Nc                       g| i |S r   r\   )akwold_apprH   s     rI   <lambda>zBpatch_asgi_app.<locals>._sentry_patched_asgi_app.<locals>.<lambda>  s    WT4A44 rK   )mechanism_typer<   span_originrB   )rg   rw   rx   r3   r   rY   r<   rZ   rB   r
   
_run_asgi3r   )rH   r   rp   ru   r   
middlewarer   s   `     rI   _sentry_patched_asgi_appz0patch_asgi_app.<locals>._sentry_patched_asgi_app  s      ++-==>RS ugt<<<)4/::);;,33  334


 )33
w555 = 6s"   8B4B0A.B4+B2,B42B4N)r%   r   )r   r   s    @rI   rQ   rQ     s    
   G6* 2IrK   c                 
   t        | t        j                        r'| j                  } t        | t        j                        r't	        j
                  |       xs, t        |       xr t	        j
                  | j                        S r   )rC   	functoolspartialfuncasyncioiscoroutinefunctioncallabler   )objs    rI   r   r     sb    
S)++
,hh S)++
, &&s+ C'55cllCrK   c                  n    t         j                  j                  fd} | t         j                  _        y )Nc                     | t              }|rfd}|} nt        j                        fd       }|}  |       S )Nc                    K   t        j                         j                  t              }| | i | d {   S | d   }t	        t        j
                         |j                  |       t        j                         }t        |      }|j                          d {   fd}t        j                  |_        |j                   |||              | i | d {   S 7 7 H7 w)Nr   c                     fd}|S )Nc                 |    | j                  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infos      rI   event_processorzpatch_request_response.<locals>._sentry_request_response.<locals>._sentry_async_func.<locals>._make_request_event_processor.<locals>.event_processor  sW     (-yyB'?(D0:>y/Y 7%~7;F|V 4+3L+Ai($rK   r\   )reqr   r   r   s      rI   _make_request_event_processorz{patch_request_response.<locals>._sentry_request_response.<locals>._sentry_async_func.<locals>._make_request_event_processor  s    % +*rK   )rg   rw   rx   r3    _set_transaction_name_and_sourcer{   r<   r   StarletteRequestExtractorextract_request_inforY   _nameadd_event_processor)	rl   rm   r   r   r   	extractorr   r   old_funcs	          @rI   _sentry_async_funczTpatch_request_response.<locals>._sentry_request_response.<locals>._sentry_async_func  s     (335EE( &!)4!:6!:::q'000211  *==?5g>	&;;==+$ &:%D%D"001';G &t6v666K ; >2 7s5   5C+C%A$C+C'AC+ C)!C+'C+)C+c                  2   t        j                         j                  t              }| 	| i |S t        j                         }|j
                  |j
                  j                          t        j                         }|j                  |j                  j                          | d   }t        ||j                  |       t        |      }|j                         fd}t        j                  |_        |j!                   |||              	| i |S )Nr   c                     fd}|S )Nc                 V    | j                  di       }r|d<   t        |      | d<   | S )Nr   r   r   )r   r   r   r   s      rI   r   zpatch_request_response.<locals>._sentry_request_response.<locals>._sentry_sync_func.<locals>._make_request_event_processor.<locals>.event_processor  s6     (-yyB'?"6=L3+3L+Ai($rK   r\   )r   r   r   r   s      rI   r   zzpatch_request_response.<locals>._sentry_request_response.<locals>._sentry_sync_func.<locals>._make_request_event_processor   s    
% +*rK   )rg   rw   rx   r3   r{   transactionupdate_active_threadr   profileupdate_active_thread_idr   r<   r   extract_cookies_from_requestrY   r   r   )
rl   rm   r   current_scoper   r   r   r   r   r   s
           @rI   _sentry_sync_funczSpatch_request_response.<locals>._sentry_request_response.<locals>._sentry_sync_func  s    )335EE( &#T4V44 * < < > ,,8!--BBD)==?''3 ((@@Bq'0 +"?"? 6g>	#@@B+  &:%D%D"001';G  000rK   )r   r   wraps)r   is_coroutiner   r   r   old_request_responses       @rI   _sentry_request_responsez8patch_request_response.<locals>._sentry_request_response  sR    )(3+7Z &D __X&.1 '.1` %D#D))rK   )r4   routingrequest_response)r   r   s    @rI   rR   rR     s-    $,,==k*Z *BI&rK   c                      	 ddl m ddlm}  | j
                  dt              v}|rfd}|| _        y y # t        $ r Y y w xY w)Nr   )Markup)Jinja2Templates_sentry_jinja2templates_initc                     fd}|j                  dg        ||d   vr|d   j                  |        | g|i |S )Nc                 \     t        j                         j                               }d|iS )Nsentry_trace_meta)rg   r{   trace_propagation_meta)r   
trace_metar  s     rI   add_sentry_trace_metazTpatch_templates.<locals>._sentry_jinja2templates_init.<locals>.add_sentry_trace_meta5  s3    #002IIK
 ( rK   context_processors)r   append)rH   rl   rm   r
  r  old_jinja2templates_inits       rI   r  z5patch_templates.<locals>._sentry_jinja2templates_init3  sS     2B7$F3G,HH+,334IJ+DB4B6BBrK   )
markupsafer  ImportErrorstarlette.templatingr  rJ   r@   )r  r   r  r  r  s      @@rI   rS   rS     s_    % 5.774C = O 	C$ $@ )   s   : 	AAc                   D    e Zd ZdZdZd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)r   z
    Extracts useful information from the Starlette request
    (like form data or cookies) and adds it to the Sentry event.
    Nc                     || _         y r   )r   )rH   r   s     rI   rJ   z"StarletteRequestExtractor.__init__P  s	    rK   c                 >    d }t               r| j                         }|S r   )r   r   )rH   r   s     rI   r   z6StarletteRequestExtractor.extract_cookies_from_requestT  s    "$llnGrK   c                   K   t        j                         }i }t               5  t               r| j	                         |d<   | j                          d {   }|s|cd d d        S |r.t        ||      s"t        j                         |d<   |cd d d        S | j                          d {   }|r||d<   |cd d d        S | j                          d {   }|rUi }|j                         D ]0  \  }}t        |t              }	|	s|nt        j                         ||<   2 ||d<   |cd d d        S t        j                         |d<   |cd d d        S 7 7 7 # 1 sw Y   y xY ww)Nr   r   )rg   rw   r   r   r   content_lengthr   r   removed_because_over_size_limitjsonformitemsrC   r&   removed_because_raw_data)
rH   clientr   r  r  r  	form_datar   valis_files
             rI   r   z.StarletteRequestExtractor.extract_request_info\  sq    &&((* (	 &(*.,,.Y' $(#6#6#88N!#(	  (	  &@' (6'U'U'WV$#(	  (	 $ $D'+V$#+(	  (	 0 $D	 $

 HC(j9G  ' +DDF cN (1V$#I(	  (	 N $2#J#J#LL Q(	  (	  9 % %1(	  (	 s   !E#1EEE
E#&&E
E#E)E*E6
E# EEAE%
E#/E
E#EEEE E#c                    K   d| j                   j                  v r"t        | j                   j                  d         S y w)Nzcontent-length)r   headersr   rH   s    rI   r  z(StarletteRequestExtractor.content_length  s6     t||333t||++,<=>>s   <>c                 .    | j                   j                  S r   )r   r   r!  s    rI   r   z!StarletteRequestExtractor.cookies  s    ||###rK   c                    K   t         y | j                  j                          d {    | j                  j                          d {   S 7 &7 wr   )	multipartr   bodyr  r!  s    rI   r  zStarletteRequestExtractor.form  sF      ll!!!\\&&((( 	"(s!   %AA!A	A
AAc                 ^    t        | j                  j                  j                  d            S )Nzcontent-type)r   r   r   r   r!  s    rI   is_jsonz!StarletteRequestExtractor.is_json  s"    $T\\%9%9%=%=n%MNNrK   c                    K   | j                         sy 	 | j                  j                          d {   S 7 # t        $ r Y y w xY wwr   )r'  r   r  r   r!  s    rI   r  zStarletteRequestExtractor.json  sA     ||~	**,,,, 		s1   A9 79 A9 	AAAA)rV   rW   rX   __doc__r   rJ   r   r   r  r   r  r'  r  r\   rK   rI   r   r   H  s8    
 G. `$)OrK   r   c                     | j                  d      }|sy |j                  D ]8  }|j                  |       }|d   t        j                  k(  s+	 |j
                  c S  y # t        $ r | j                  d      cY c S w xY w)Nrouterr   path)r   routesmatchesr*   FULLr,  AttributeError)r   r+  routematchs       rI   _transaction_name_from_routerr3    s{    YYx F )e$8uzz!)zz!	) 	 " )yy(()s   AA<;A<c                 6   d }t         |   }|dk(  r-|j                  j                  d      }|r*t        |      xs d }n|dk(  rt	        |j                        }|t
        }t        j                  }| j                  ||       t        j                  d||       y )Nr0   r1   r_   z=[Starlette] Set transaction name and source on scope: %s / %s)r   r   r   r   r3  _DEFAULT_TRANSACTION_NAMEr   ROUTEr|   r   debug)r   r<   r   rc   r`   r0   s         rI   r   r     s    D/0FJ&==$$Z0,X6>$D	e	#,W]];|("((	tF3
LLGvrK   c                     d }d }|j                   dk(  r)t        | j                        }t        j                  }||fS |j                   dk(  rt        |      }t        j                  }||fS )Nr0   r1   )r<   r   ry   r   	COMPONENTr3  r6  )r~   
asgi_scoper   rc   r`   s        rI   rz   rz     sn    DF$$
2(7",,
 <	 
	&	&%	/,Z8"((<rK   )F)]r   r   rE   collections.abcr   r   r   r  r   rg   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#   r4   r$   rN   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$  r5  r:   r3   r   r   r   r   r   rP   rQ   r   rR   rS   r   r3  r   rz   r\   rK   rI   <module>rP     s             
  > 4   !XXX<5:03/ +'OO9C
	, 8 . 9; 9xDN 01/ 2/JEZ 01" 2">J&6:2BqBh'@Tg gT$.G  5
3
445  989    IsH   
:D) D: E )D7:EE	EE EE E$#E$