Ë
    çÞËjm   ã                   ó^  — 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„ Z!d„ Z"d„ Z#d„ Z$d„ Z%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    ú`/var/www/photos/backend/venv/lib/python3.12/site-packages/sentry_sdk/integrations/django/asgi.pyr   r   1   s   € Ü$×/Ñ/×=Ñ=ˆÔØˆó    c                 ó   ‡ — ˆ 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_processor8   s‘   ø€ ÷
	
ð
 ˆ?ØˆLä�‹=œKÒ'ØˆLä(Ó*ñ 	FÙ" 7Ó+×>Ñ>¸uÔE÷	Fô #Ô$Ü,Ó.ñ /Ù˜w¨Ô.÷/ð ˆˆuˆ÷	Fð 	Fú÷/ð ˆús   ¬A6Á 
BÁ6A?ÂB© )r&   r'   s   ` r   Ú"_make_asgi_request_event_processorr)   6   s   ø€ ôð2 (Ð'r   c                 ó¸   ‡ ‡‡‡— ddl mŠ ‰ j                  Šˆˆ ˆfd„}|‰ _        t        ‰ d«      }|r(‰ j                  Št        ‰‰«      ˆ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__Úoriginr1   Ú
_run_asgi3)	ÚselfÚscopeÚreceiveÚsendÚintegrationÚ
middlewarer,   ÚclsÚold_apps	         €€€r   Úsentry_patched_asgi_handlerzCpatch_django_asgi_handler_impl.<locals>.sentry_patched_asgi_handler[   s‘   øè ø€ ä ×+Ñ+Ó-×=Ñ=Ð>OÓPˆØÐÙ   u¨g°tÓ<×<Ð<ä)Ø�O‰O˜D #Ó&Ø $Ø)×0Ñ0Ø$/×$GÑ$Gô	
÷
 ‰*ð 	ñ    w°Ó5×5Ð5ð =øð 6ús"   ƒ4B·B¸ABÂBÂBÂBÚcreate_requestc                 ó†   •—  ‰| g|¢­i |¤Ž\  }}t        j                  «       }|j                  t        |«      «       ||fS r   )r2   Úget_isolation_scopeÚadd_event_processorr)   )r8   ÚargsÚkwargsr&   Úerror_responser9   Úold_create_requests         €r   Úsentry_patched_create_requestzEpatch_django_asgi_handler_impl.<locals>.sentry_patched_create_requestp   sK   ø€ ñ '9¸Ð&OÀÒ&OÈÑ&OÑ#ˆG�^Ü×2Ñ2Ó4ˆEØ×%Ñ%Ô&HÈÓ&QÔRà˜NÐ*Ð*r   )r!   r,   Ú__call__ÚhasattrrA   r   )r>   r@   Úmodern_django_asgi_supportrI   r,   r?   rH   s   `   @@@r   Úpatch_django_asgi_handler_implrM   T   sh   û€ õ Aà�l‰l€Gö6ð /€C„Lä!(¨Ð.>Ó!?ÐÙ!Ø ×/Ñ/Ðä	#Ð$5Ð7IÓ	Jó	+ó 
Kð	+ð ;ˆÕð "r   c                 ó:   ‡‡— | j                   Šˆˆfd„}|| _         y )Nc              “   óB   •K  —  ‰|«        ‰| |«      ƒ d {  –—† S 7 Œ­wr   r(   )r8   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   ƒ˜™)Úget_response_async)r>   rP   rR   rQ   s    ` @r   Úpatch_get_response_asyncrT   |   s   ù€ à ×3Ñ3Ðõ;ð
 ?€CÕr   c                 óˆ   ‡ ‡‡— dd l }ddlmŠ |j                  dk  r‰ j                  Šˆˆ ˆ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   )r5   )Ú_scoper>   r?   r8   s    €€€r   ú<lambda>zWpatch_channels_asgi_handler_impl.<locals>.sentry_patched_asgi_handler.<locals>.<lambda>˜   s   ø€ ˜wŸ™¨t°SÓ9€ r   Tr.   )r2   r3   r4   r   r6   r1   r9   )r8   r:   r;   r<   r=   r,   r>   r?   s   `    €€€r   r@   zEpatch_channels_asgi_handler_impl.<locals>.sentry_patched_asgi_handler‘   sƒ   ùè ø€ ä$×/Ñ/Ó1×AÑAÐBSÓTˆKØÐ"Ù$ T¨7°DÓ9×9Ð9ä-Ý9Ø$(Ø-×4Ñ4Ø(3×(KÑ(Kô	ˆJð 0™ D§J¡JÓ/°¸Ó>×>Ð>ð :øð ?ús"   „3B	·B¸AB	Â BÂB	ÂB	)Úchannelsr!   r,   Ú__version__rJ   rM   )r>   rZ   r@   r,   r?   s   `  @@r   Ú patch_channels_asgi_handler_implr\   ˆ   s8   ú€ ãå@à×Ñ˜gÒ%Ø—,‘,ˆö	?ð 3ˆ�ô
 	' sÕ+r   c                 óR   ‡ ‡— ddl mŠ t        j                  ‰ «      ˆˆ fd„«       }|S )Nr   r+   c              Ÿ   óÔ  •K  — t        j                  «       }|j                  �|j                  j                  «        t        j                  «       }|j
                  �|j
                  j                  «        t        j                  t        j                  | j                  j                  ‰j                  ¬«      5   ‰| g|¢­i |¤Žƒ d {  –—† cd d d «       S 7 Œ# 1 sw Y   y xY w­w)N)ÚopÚnamer6   )r2   Úget_current_scopeÚtransactionÚupdate_active_threadrC   ÚprofileÚupdate_active_thread_idÚ
start_spanr   ÚVIEW_RENDERÚresolver_matchÚ	view_namer6   )r&   rE   rF   Úcurrent_scopeÚsentry_scoper,   Úcallbacks        €€r   Úsentry_wrapped_callbackz0wrap_async_view.<locals>.sentry_wrapped_callback¬   sÄ   øè ø€ ô #×4Ñ4Ó6ˆØ×$Ñ$Ð0Ø×%Ñ%×:Ñ:Ô<ä!×5Ñ5Ó7ˆØ×ÑÐ+Ø× Ñ ×8Ñ8Ô:ä×"Ñ"Ü�~‰~Ø×'Ñ'×1Ñ1Ø$×+Ñ+ô
ñ 	<ñ
 " 'Ð;¨DÒ;°FÑ;×;÷	<ñ 	<ð
 <ø÷	<ð 	<üs0   ƒB9C(Â<CÃCÃCÃ
C(ÃCÃC%Ã!C()r!   r,   Ú	functoolsÚwraps)rl   rm   r,   s   ` @r   Úwrap_async_viewrp   ¨   s)   ù€ å@ä‡_�_�XÓô<ó ð<ð" #Ð"r   c                 ó    ‡ —  G ˆ fd„d«      }|S )zh
    Mixin class factory that generates a middleware mixin for handling requests
    in async mode.
    c                   ó2   •— e Zd ZerdZd„ Zd„ Zd„ Zˆ fd„Zy)ú7_asgi_middleware_mixin_factory.<locals>.SentryASGIMixinNc                 ó@   — || _         d | _        | j                  «        y r   )Úget_responseÚ_acall_methodÚ_async_check)r8   ru   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)Úiscoroutinefunctionru   r   ©r8   s    r   rw   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__
            )rz   ru   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)rv   rK   Ú_innerr   )r8   rE   rF   ÚfÚmiddleware_spanÚ_check_middleware_spans        €r   r   zA_asgi_middleware_mixin_factory.<locals>.SentryASGIMixin.__acall__ä   s¨   øè ø€ à×"Ñ"ˆAØˆyÜ˜4Ÿ;™;¨Ô4Ø-1¯[©[×-BÑ-BÐB�DÔ&©à-1¯[©[Ð8�DÔ&¨á4ÀÔBˆOàÐ&Ù Ð/¨Ñ/×/Ð/à ñ 0Ù Ð/¨Ñ/×/÷0ñ 0ð 0øð 0ø÷0ð 0üs<   ƒA,B Á/BÁ0B Á6BÂBÂBÂB ÂBÂBÂB )	Ú__name__Ú
__module__Ú__qualname__r	   r�   rx   rw   r}   r   )r„   s   €r   ÚSentryASGIMixinrs   È   s   ø„ ÙØˆFò	 ò	,ò	:õ	0r   rˆ   r(   )r„   rˆ   s   ` r   Ú_asgi_middleware_mixin_factoryr‰   Á   s   ø€ ÷+0ó +0ðZ Ðr   )r   r   Úreturnr   )'Ú__doc__r   rn   ÚinspectÚdjango.core.handlers.wsgir   r2   Ú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   rK   rz   r   r)   rM   rT   r\   rp   r‰   r(   r   r   ú<module>r–      s«   ðñó Û Û å 1ã Ý  å =Ý 4÷õ
 !áß4Ó4å5Ý1ç7á	�˜X c¨3 hÑ/Ô	0€Bñ ˆ7Ð+Ô,Ø!×5Ñ5ÐØ#×9Ñ9Ñà!×5Ñ5Ðóò
(ò<%;òP	?ò,ò@#ó24r   