
    \j-                        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 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 	 d dlmZm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$ d dl&m'Z' e'r2d dl&m(Z(m)Z)m*Z* d dl+m,Z, d dl-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z4m5Z5m6Z6 d dlm7Z7 d dl8m9Z9m:Z: dZ; G d de
      Z< G d de      Z=d'dZ>d'dZ?d(d Z@d'd!ZAd)d$ZB ee<      d%eCd"d#ddfd&       ZDy# e%$ r	  e	d      w xY w)*    )Set)deepcopyN)OP)$_DEFAULT_FAILED_REQUEST_STATUS_CODESDidNotEnableIntegration)SentryAsgiMiddleware)ignore_logger)should_send_default_pii)TransactionSourceSOURCE_FOR_STYLE)ensure_integration_enabledevent_from_exceptiontransaction_from_function)RequestLitestar)BaseRouteHandler)DefineMiddleware)	HTTPRoute)ConnectionDataExtractor)HTTPExceptionzLitestar is not installed)TYPE_CHECKING)AnyOptionalUnion)ASGIApp)HTTPReceiveMessage	HTTPScopeMessage
MiddlewareReceiveScopeSendWebSocketReceiveMessage)MiddlewareProtocol)EventHintzgeneric Litestar requestc                   >    e Zd ZdZde Zef	 	 	 ddZedd       Zy)LitestarIntegrationlitestarz
auto.http.Nc                     || _         y N)failed_request_status_codes)selfr-   s     J/root/env/lib/python3.12/site-packages/sentry_sdk/integrations/litestar.py__init__zLitestarIntegration.__init__8   s     ,G(    c                  V    t                t                t                t        d       y )Nr*   )patch_app_initpatch_middlewarespatch_http_route_handler
    r1   r/   
setup_oncezLitestarIntegration.setup_once>   s    ! 	j!r1   )r-   zSet[int]returnNr8   N)	__name__
__module____qualname__
identifieroriginr   r0   staticmethodr7   r6   r1   r/   r)   r)   4   sG    J*&F 3WG%/G 
G " "r1   r)   c                   T     e Zd Zej                  fdddeddf fdZdeddfdZ xZ	S )	SentryLitestarASGIMiddlewareappr   span_originr8   Nc                 0    t         |   |ddd|d       y )NFendpointasgi   )rB   unsafe_context_datatransaction_stylemechanism_typerC   asgi_version)superr0   )r.   rB   rC   	__class__s      r/   r0   z%SentryLitestarASGIMiddleware.__init__P   s)     	 %(!# 	 	
r1   excc                      y)zAvoid catching exceptions from request handlers.

        Those exceptions are already handled in Litestar.after_exception handler.
        We still catch exceptions from application lifespan handlers.
        Nr6   )r.   rN   s     r/   _capture_request_exceptionz7SentryLitestarASGIMiddleware._capture_request_exception\   s     	r1   )
r:   r;   r<   r)   r>   strr0   	ExceptionrP   __classcell__)rM   s   @r/   rA   rA   O   s<    1D1K1K



+.

	

i D r1   rA   r8   c                  n    t         j                  t        t              dfd       } | t         _        y)a\  
    Replaces the Litestar class's `__init__` function in order to inject `after_exception` handlers and set the
    `SentryLitestarASGIMiddleware` as the outmost middleware in the stack.
    See:
    - https://docs.litestar.dev/2/usage/applications.html#after-exception
    - https://docs.litestar.dev/2/usage/middleware/using-middleware.html
    Nc                     t         g|j                  d      xs g |d<   |j                  d      xs g }t        g||d<    | g|i | y )Nafter_exception
middleware)exception_handlergetrA   )r.   argskwargsrW   old__init__s       r/   injection_wrapperz)patch_app_init.<locals>.injection_wrappero   se     %
jj*+1r%
 !
 ZZ-3
 <JzJ|D*4*6*r1   )r.   r   rZ   r   r[   r   r8   N)r   r0   r   r)   )r]   r\   s    @r/   r3   r3   e   s5     ##K 3[A+ B+ *Hr1   c                  n    t         j                  t        t              dfd       } | t         _        y )Nc                 L     |       D cg c]  }t        |       c}S c c}w r,   )enable_span_for_middleware)r.   rW   old_resolve_middleware_stacks     r/   resolve_middleware_wrapperz5patch_middlewares.<locals>.resolve_middleware_wrapper   s/     ;4@
 'z2
 	
 
s   !)r.   r   r8   zlist[Middleware])r   resolve_middlewarer   r)   )rb   ra   s    @r/   r4   r4   }   s7    #3#F#F  35QR
 S
 +E'r1   c                 .   t        | d      r| t        u r| S t        | t              r| j                  j
                  n| j
                  	 	 	 	 	 	 	 	 	 	 dfd}j                  dv}|r*t        | t              r|| j                  _        | S || _        | S )N__call__c                 D  K   t        j                         j                  t               | |       d {   S | j                  j
                  t        j                  t        j                  t        j                        5 }|j                  d       	 	 	 	 	 	 dfd}t        dt                    }|dk(  }|s|n}d	fd}	t        dt                    }
|
dk(  }|s|	n} | |||       d {   cd d d        S 7 7 # 1 sw Y   y xY ww)
Nopnamer>   litestar.middleware_namec            
        K   t        j                         j                  t               | i | d {   S t        j                  t
        j                  t        dt                    t        j                        5 }|j                  d        | i | d {   cd d d        S 7 x7 # 1 sw Y   y xY wwNr<   rg   rj   )
sentry_sdk
get_clientget_integrationr)   
start_spanr   MIDDLEWARE_LITESTAR_RECEIVEgetattrrQ   r>   set_tag)rZ   r[   spanmiddleware_namereceives      r/   _sentry_receivezNenable_span_for_middleware.<locals>._create_span_call.<locals>._sentry_receive   s      ((*::;NOW!($!9&!999**55 .#g,G.55 : LL!;_M!($!9&!99: : : :: ::   3B?B/AB?B3!B1"B3%B?1B33B<8B?r:   rw   c           
        K   t        j                         j                  t               |        d {   S t        j                  t
        j                  t        dt                    t        j                        5 }|j                  d        |        d {   cd d d        S 7 x7 # 1 sw Y   y xY wwrl   )rm   rn   ro   r)   rp   r   MIDDLEWARE_LITESTAR_SENDrr   rQ   r>   rs   )messagert   ru   sends     r/   _sentry_sendzKenable_span_for_middleware.<locals>._create_span_call.<locals>._sentry_send   s     ((*::;NOW!%g..**22 ~s4yA.55 / LL!;_M!%g./ / / // /rx   r}   )rZ   r   r[   r   r8   z2Union[HTTPReceiveMessage, WebSocketReceiveMessage])r{   r   r8   N)rm   rn   ro   r)   rM   r:   rp   r   MIDDLEWARE_LITESTARr>   rs   rr   rQ   )r.   scoperv   r|   middleware_spanrw   receive_namereceive_patchednew_receiver}   	send_namesend_patchednew_sendru   old_calls     ``         @r/   _create_span_callz5enable_span_for_middleware.<locals>._create_span_call   s0       "223FGO!$w===..11""%% &--
 )	F ##$>P::(-:E: #7JGEL*.??O1@/gK	/  j#d)<I$6L+7|TH!${HEES)	F )	F >X FS)	F )	Fs;   6D DAD A7DDDD DDD )r   )
r.   r%   r   LitestarScoperv   r!   r|   r#   r8   N)hasattrrA   
isinstancer   rW   re   r:   )rW   r   not_yet_patchedr   s      @r/   r`   r`      s    J
+55*./(33<<&&3F"3F3F 3F 	3F
 
3Fj ''/DDOj"23->J!!*  #4Jr1   c                  \    t         j                  	 	 	 	 	 	 	 	 	 	 dfd} | t         _        y )Nc                   	K   t        j                         j                  t               
| ||       d {   S t        j                         }d   j                  ||      } t        dd      |      j                  d      }| d {   	d	fd}t        j                  |_	        |j                  |        
| ||       d {   S 7 7 G7 w)NrB   )r   rv   r|   T)
parse_bodyparse_querybodyc                    	j                  d      }| j                  di       }t        	j                  dd            |d<   t               rd   |d<   |d<   d }|j                  |j                  }n9t	        |j
                  d      r|j
                  j                  }n|j
                  }|t        |      }d	t        d
   i}st        }d	t        j                  i}| j                  t        |      ||d       | S )Nroute_handlerrequest_bodyr1   content_lengthcookiesdatavaluesourcerE   )r   transactiontransaction_info)rY   lenr   ri   r   fnr   r   r   _DEFAULT_TRANSACTION_NAMEr   ROUTEupdater   )
event_r   request_infofunctx_nametx_infoextracted_request_datarequest_datar   s
          r/   event_processorzHpatch_http_route_handle.<locals>.handle_wrapper.<locals>.event_processor   s   !IIo6M 99Y3L-07C1H-IL)*&(*@*KY'''3V$D!!-',,))73$''--$''3D9!1*!=>G3#%6%<%<=LL'5#*(/ Lr1   )r   r&   r   r'   r8   r&   )rm   rn   ro   r)   get_isolation_scoperequest_classr   popr=   _nameadd_event_processor)r.   r   rv   r|   sentry_scoper   r   r   r   r   
old_handles    `      @@r/   handle_wrapperz/patch_http_route_handle.<locals>.handle_wrapper   s        "223FGO#D%$???!557',U|'A'At (B (
"
!8"

" &))&1!z"	H 1;;((9eWd;;;i @ "R <s5   6C!CAC!CA C!CC!C!C!)
r.   r   r   r   rv   r!   r|   r#   r8   N)r   handle)r   r   s    @r/   r5   r5      sF    !!J8<8<"-8<8A8<IO8<	8<t &Ir1   r   r   c                     | j                  d      }t        |t              r|S t        |d      r|j	                         S y )Nuserasdict)rY   r   dictr   r   )r   
scope_users     r/   retrieve_user_from_scoper     s<    6"J*d#z8$  ""r1   rN   c                    d }t               rt        |      }|r5t        |t              r%t	        j
                         }|j                  |       t        | t              rBt	        j                         j                  t              }|| j                  |j                  vry t        | t	        j                         j                  t        j                  dd      \  }}t	        j                   ||       y )NF)typehandled)client_options	mechanism)hint)r   r   r   r   rm   r   set_userr   rn   ro   r)   status_coder-   r   optionsr=   capture_event)rN   r   	user_infor   integrationr   r   s          r/   rX   rX      s    ,0I ,U3	Z	40!557i(#}% ++-==>QR#{'N'NN&!,,.66.99eLKE4 U.r1   r9   )rW   r    r8   r    )r   r   r8   zOptional[dict[str, Any]])Ecollections.abcr   copyr   rm   sentry_sdk.constsr   sentry_sdk.integrationsr   r   r   sentry_sdk.integrations.asgir	   sentry_sdk.integrations.loggingr
   sentry_sdk.scoper   sentry_sdk.tracingr   r   sentry_sdk.utilsr   r   r   r*   r   r   litestar.handlers.baser   litestar.middlewarer   litestar.routes.httpr   litestar.data_extractorsr   litestar.exceptionsr   ImportErrortypingr   r   r   r   litestar.types.asgi_typesr   litestar.typesr   r   r   r    r!   r"   r   r#   r$   r%   sentry_sdk._typesr&   r'   r   r)   rA   r3   r4   r`   r5   r   rR   rX   r6   r1   r/   <module>r      s         
 > 9 4 B 4*74.@1 !++1	 	 	 7-6 "+ "6#7 ,*0
EIX=&@ /0/9 /_ / / 1/K  4
2
334s   &C( (C6