
    \j                      r   d Z ddlZddlZddlZddlmZ ddl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 er/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  ededef         Z eed      rej>                  Zej@                  Z nej>                  ZddZ ddZ!ddZ"ddZ#ddZ$ddZ%	 	 	 	 ddZ&y)z
Instrumentation for Django 3.0

Since this file contains `async def` it is conditionally imported in
`sentry_sdk.integrations.django` (depending on the existence of
`django.core.handlers.asgi`.
    N)WSGIRequest)OP)SentryAsgiMiddleware)should_send_default_pii)capture_internal_exceptionsensure_integration_enabled)TYPE_CHECKING)AnyCallableUnionTypeVar)ASGIRequest)HttpResponse)EventEventProcessor_F.)boundmarkcoroutinefunctionc                 D    t         j                  j                  | _        | S N)asyncio
coroutines_is_coroutine)funcs    M/root/env/lib/python3.12/site-packages/sentry_sdk/integrations/django/asgi.pyr   r   1   s    $//==    c                      d fd}|S )Nc                    ddl m}m} | S t              t        k(  r| S t               5   |      j                  |        d d d        t               rt               5   ||        d d d        | S | S # 1 sw Y   3xY w# 1 sw Y   | S xY w)Nr   )DjangoRequestExtractor_set_user_info)sentry_sdk.integrations.djangor   r    typer   r   extract_into_eventr   )eventhintr   r    requests       r   asgi_request_event_processorzH_make_asgi_request_event_processor.<locals>.asgi_request_event_processor7   s    	

 ?L=K'L(* 	F"7+>>uE	F #$,. /w./ u	F 	F/ s   A6 
B6A?B)r$   r   r%   zdict[str, Any]returnr    )r&   r'   s   ` r   "_make_asgi_request_event_processorr*   6   s    0 ('r   c                      ddl m  j                  	 	 	 	 	 	 	 	 	 	 d fd}| _        t         d      }|r1 j                  t              	 	 	 	 	 	 	 	 dfd       }| _        y y )Nr   DjangoIntegrationc                 "  K   t        j                         j                        }| | |||       d {   S t        j	                  |       dj
                  |j                        j                  } ||||       d {   S 7 S7 w)NTunsafe_context_dataspan_originhttp_methods_to_capture)
sentry_sdk
get_clientget_integrationr   __get__originr2   
_run_asgi3)	selfscopereceivesendintegration
middlewarer-   clsold_apps	         r   sentry_patched_asgi_handlerzCpatch_django_asgi_handler_impl.<locals>.sentry_patched_asgi_handlerW   s      !++-==>OP ugt<<<)OOD#& $)00$/$G$G	

 * 	  w555 = 6s"   4BBABBBBcreate_requestc                      | g|i |\  }}t        j                         }|j                  t        |             ||fS r   )r3   get_isolation_scopeadd_event_processorr*   )r9   argskwargsr&   error_responser:   old_create_requests         r   sentry_patched_create_requestzEpatch_django_asgi_handler_impl.<locals>.sentry_patched_create_requestm   sK     '9&O&O&O#G^224E%%&H&QRN**r   )
r9   r
   r:   r
   r;   r
   r<   r
   r(   r
   )r9   r
   rF   r
   rG   r
   r(   r
   )r!   r-   __call__hasattrrB   r   )r?   rA   modern_django_asgi_supportrJ   r-   r@   rI   s   `   @@@r   patch_django_asgi_handler_implrN   R   s    @llG66!6,169>6	6  /CL!(.>!?! //	#$57I	J	+	+ %	+16	+	+ 
K	+ ; "r   c                 H    | j                   	 	 	 	 	 	 dfd}|| _         y )Nc                 B   K    |        | |       d {   S 7 wr   r)   )r9   r&   _before_get_responseold_get_response_asyncs     r   !sentry_patched_get_response_asynczCpatch_get_response_async.<locals>.sentry_patched_get_response_async}   s$      	W%+D'::::s   )r9   r
   r&   r
   r(   z"Union[HttpResponse, BaseException])get_response_async)r?   rQ   rS   rR   s    ` @r   patch_get_response_asyncrU   z   s6     33;;#;	-; ?Cr   c                      dd l }ddlm |j                  dk  r$ j                  	 	 	 	 	 	 	 	 d fd}| _        y t                y )Nr   r,   z3.0.0c                    K   t        j                         j                        }|  ||       d {   S t         fddj                  |j
                        }  | j                        ||       d {   S 7 M7 w)Nc                 (    j                        S r   )r6   )_scoper?   r@   r9   s    r   <lambda>zWpatch_channels_asgi_handler_impl.<locals>.sentry_patched_asgi_handler.<locals>.<lambda>   s    wtS9 r   Tr/   )r3   r4   r5   r   r7   r2   r:   )r9   r;   r<   r=   r>   r-   r?   r@   s   `    r   rA   zEpatch_channels_asgi_handler_impl.<locals>.sentry_patched_asgi_handler   s      %//1AABSTK"$T7D999-9$(-44(3(K(K	J 0DJJ/>>> : ?s"   3B	BAB	 BB	B	)r9   r
   r;   r
   r<   r
   r(   r
   )channelsr!   r-   __version__rK   rN   )r?   r[   rA   r-   r@   s   `  @@r    patch_channels_asgi_handler_implr]      sX    @g%,,	?	?"'	?/4	?	?  3
 	's+r   c                 d     ddl m t        j                         	 	 	 	 	 	 	 	 d fd       }|S )Nr   r,   c                 b  K   t        j                         }|j                  |j                  j                          t        j                         }|j
                  |j
                  j                          t        j                         j                        }|r|j                  s | g|i | d {   S t        j                  t        j                  | j                  j                  j                        5   | g|i | d {   cd d d        S 7 f7 # 1 sw Y   y xY ww)N)opnamer7   )r3   get_current_scopetransactionupdate_active_threadrD   profileupdate_active_thread_idr4   r5   middleware_spans
start_spanr   VIEW_RENDERresolver_match	view_namer7   )r&   rF   rG   current_scopesentry_scoper=   r-   callbacks         r   sentry_wrapped_callbackz0wrap_async_view.<locals>.sentry_wrapped_callback   s     #446$$0%%::<!557+  88: ++-==>OP+">">!';D;F;;;""~~''11$++
 	<
 "';D;F;;	< 	< < <	< 	<s=   B5D/8D9AD/D#D!D#D/!D##D,(D/)r&   r
   rF   r
   rG   r
   r(   r
   )r!   r-   	functoolswraps)rn   ro   r-   s   ` @r   wrap_async_viewrr      sI    @__X<<$<05<	< <, #"r   c                        G  fdd      }|S )zh
    Mixin class factory that generates a middleware mixin for handling requests
    in async mode.
    c                   >    e Zd ZerdZddZddZdefdZd	 fdZ	y)
7_asgi_middleware_mixin_factory.<locals>.SentryASGIMixinNr(   c                 @    || _         d | _        | j                          y r   )get_response_acall_method_async_check)r9   rw   s     r   __init__z@_asgi_middleware_mixin_factory.<locals>.SentryASGIMixin.__init__   s     ,D!%Dr   c                 F    t        | j                        rt        |        yy)z
            If get_response is a coroutine function, turns us into async mode so
            a thread is not consumed during a whole request.
            Taken from django.utils.deprecation::MiddlewareMixin._async_check
            N)iscoroutinefunctionrw   r   r9   s    r   ry   zD_asgi_middleware_mixin_factory.<locals>.SentryASGIMixin._async_check   s     #4#4#45%d+ 6r   c                 ,    t        | j                        S )z
            Function that checks if we are in async mode,
            and if we are forwards the handling of requests to __acall__
            )r|   rw   r}   s    r   async_route_checkzI_asgi_middleware_mixin_factory.<locals>.SentryASGIMixin.async_route_check   s    
 't'8'899r   c                 D  K   | j                   }|Gt        | j                  d      r| j                  j                  x| _         }n| j                  x| _         } |      }| ||i | d {   S |5   ||i | d {   cd d d        S 7  7 # 1 sw Y   y xY ww)N	__acall__)
old_method)rx   rL   _innerr   )r9   rF   rG   fmiddleware_span_check_middleware_spans        r   r   zA_asgi_middleware_mixin_factory.<locals>.SentryASGIMixin.__acall__   s     ""Ay4;;4-1[[-B-BBD&-1[[8D&4BO&////  0///0 0 0 00 0s<   A,B /B0B 6BBBB BBB )rw   Callable[..., Any]r(   N)r(   N)rF   r
   rG   r
   r(   r
   )
__name__
__module____qualname__r	   r   rz   ry   boolr   r   )r   s   r   SentryASGIMixinru      s&    F	 
	,	:t 	:	0r   r   r)   )r   r   s   ` r   _asgi_middleware_mixin_factoryr      s    '0 '0R r   )r   r   r(   r   )r&   r   r(   r   )r?   r
   r(   N)r?   r
   rQ   r
   r(   N)rn   r
   r(   r
   )r   r   r(   r
   )'__doc__r   rp   inspectdjango.core.handlers.wsgir   r3   sentry_sdk.constsr   sentry_sdk.integrations.asgir   sentry_sdk.scoper   sentry_sdk.utilsr   r   typingr	   r
   r   r   r   django.core.handlers.asgir   django.http.responser   sentry_sdk._typesr   r   r   rL   r|   r   r*   rN   rU   r]   rr   r   r)   r   r   <module>r      s       1    = 4
 !44517	Xc3h/	0B 7+,!55#99!55
(8%;P	?,@#:101
1r   