Ë
    S>{iˆ.  ã                   óZ  — d 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	m
Z
 ddlm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mZ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r&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*m+Z+  ed«      Z,dZ-dZ.dd„Z/d„ Z0 G d„ d«      Z1y)ze
An ASGI middleware.

Based on Tom Christie's `sentry-asgi <https://github.com/encode/sentry-asgi>`.
é    N)Údeepcopy)Úpartial)ÚTYPE_CHECKING)Úcontinue_trace)ÚOP)ÚHub)Ú_get_headersÚ_get_request_dataÚ_get_url)Ú_get_installed_modules)Úauto_session_tracking)ÚSOURCE_FOR_STYLEÚTRANSACTION_SOURCE_ROUTEÚTRANSACTION_SOURCE_URLÚTRANSACTION_SOURCE_COMPONENT)Ú
ContextVarÚevent_from_exceptionÚHAS_REAL_CONTEXTVARSÚCONTEXTVARS_ERROR_MESSAGEÚloggerÚtransaction_from_function)ÚTransaction)ÚAny)ÚCallable)ÚDict)ÚOptional)ÚTuple)ÚEventÚHintÚsentry_asgi_middleware_appliedzgeneric ASGI request)ÚendpointÚurlc                 ó”   — | j                   �<t        || j                   j                  |ddœ¬«      \  }}| j                  ||¬«       y y )NF)ÚtypeÚhandled)Úclient_optionsÚ	mechanism)Úhint)Úclientr   ÚoptionsÚcapture_event)ÚhubÚexcÚmechanism_typeÚeventr(   s        úZ/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/sentry_sdk/integrations/asgi.pyÚ_capture_exceptionr1   9   sN   € ð ‡z�zÐÜ*ØØŸ:™:×-Ñ-Ø-¸%Ñ@ô
‰ˆˆtð
 	×Ñ˜% dÐÕ+ð ó    c                 óÜ   — t        j                  | «      rt        | d«      S t        j                  | «      rt	        j
                  | «      S t        | dd«      }t	        j
                  |«      S )zŠ
    Try to figure out if an application object supports ASGI3.

    This is how uvicorn figures out the application version as well.
    Ú	__await__Ú__call__N)ÚinspectÚisclassÚhasattrÚ
isfunctionÚasyncioÚiscoroutinefunctionÚgetattr)ÚappÚcalls     r0   Ú_looks_like_asgi3r?   F   s[   € ô ‡��sÔÜ�s˜KÓ(Ð(Ü	×	Ñ	˜CÔ	 Ü×*Ñ*¨3Ó/Ð/ä�s˜J¨Ó-ˆÜ×*Ñ*¨4Ó0Ð0r2   c                   ó<   — e Zd ZdZ	 	 	 d	d„Zd„ Zd„ Zd„ Zd„ Zd„ Z	y)
ÚSentryAsgiMiddleware)r=   r5   Útransaction_styler.   c                 óN  — |st         st        dt        z   «      ‚|t        vrt	        d|›dt        ›d�«      ‚|dk(  xr dt        «       v }|rt        j                  d«       || _        || _	        || _
        t        |«      r| j                  | _        y| j                  | _        y)	ab  
        Instrument an ASGI application with Sentry. Provides HTTP/websocket
        data to sent events and basic handling for exceptions bubbling up
        through the middleware.

        :param unsafe_context_data: Disable errors when a proper contextvars installation could not be found. We do not recommend changing this from the default.
        zRThe ASGI middleware for Sentry requires Python 3.7+ or the aiocontextvars package.z%Invalid value for transaction_style: z (must be in ú)ÚasgiÚ	starlettezæThe Sentry Python SDK can now automatically support ASGI frameworks like Starlette and FastAPI. Please remove 'SentryAsgiMiddleware' from your project. See https://docs.sentry.io/platforms/python/guides/asgi/ for more information.N)r   ÚRuntimeErrorr   ÚTRANSACTION_STYLE_VALUESÚ
ValueErrorr   r   ÚwarningrB   r.   r=   r?   Ú
_run_asgi3r5   Ú
_run_asgi2)Úselfr=   Úunsafe_context_datarB   r.   Ú0asgi_middleware_while_using_starlette_or_fastapis         r0   Ú__init__zSentryAsgiMiddleware.__init__Y   s¶   € ñ #Õ+?ô ð1Ü3LñMóð ð Ô$<Ñ<Ýâ$Ö&>ð@óð ð ˜fÑ$ÒP¨Ô8NÓ8PÐ)Pð 	9ñ <Ü�N‰Nðaôð "3ˆÔØ,ˆÔØˆŒä˜SÔ!Ø ŸO™OˆD�Mà ŸO™OˆD�Mr2   c                 ó   ‡ ‡— ˆˆ fd„}|S )Nc              “   óJ   •K  — ‰j                  ‰| |d¬«      ƒ d {  –—† S 7 Œ­w)Né   ©Úasgi_version©Ú_run_app)ÚreceiveÚsendÚscoperM   s     €€r0   Úinnerz.SentryAsgiMiddleware._run_asgi2.<locals>.innerŠ   s$   øè ø€ àŸ™ u¨g°tÈ!˜ÓL×LÐLÐLús   ƒ#œ!�#© )rM   rZ   r[   s   `` r0   rL   zSentryAsgiMiddleware._run_asgi2ˆ   s   ù€ õ	Mð ˆr2   c              ƒ   óH   K  — | j                  |||d¬«      ƒ d {  –—† S 7 Œ­w)Né   rT   rV   )rM   rZ   rX   rY   s       r0   rK   zSentryAsgiMiddleware._run_asgi3�   s#   è ø€ à—]‘] 5¨'°4Àa�]ÓH×HÐHÐHús   ‚"› œ"c           	   ƒ   ó  ‡‡K  — t         j                  d«      }|d   dk(  }|s|rA	 |dk(  r  | j                  |«      |‰«      ƒ d {  –—† S | j                  ||‰«      ƒ d {  –—† S t         j                  d«       	 t        t
        j                  «      }t        |d¬«      5  |5  |j                  «       5 }	|	j                  «        d	|	_        t        | j                  |¬
«      }
|	j                  |
«       d d d «       |d   }| j!                  | j"                  |«      \  }}|dv r>t%        t'        |«      dj)                  |«      ||¬«      Št+        j,                  d‰«       n2t/        t0        j2                  ||¬«      Št+        j,                  d‰«       ‰j5                  d|«       t+        j,                  d‰j6                  ‰j8                  «       |j;                  ‰d|i¬«      5  t+        j,                  d‰«       	 ˆˆfd„}|dk(  rP | j                  |«      ||«      ƒ d {  –—† cd d d «       cd d d «       cd d d «       t         j                  d«       S | j                  |||«      ƒ d {  –—† cd d d «       cd d d «       cd d d «       t         j                  d«       S 7 �Œ`7 �ŒH# t        $ r.}t	        t
        j                  || j                  ¬«       |d ‚d }~ww xY w# 1 sw Y   �ŒòxY w7 ŒÌ7 Œƒ# t        $ r }t	        ||| j                  ¬«       |d ‚d }~ww xY w# 1 sw Y   nxY w	 d d d «       n# 1 sw Y   nxY wd d d «       n# 1 sw Y   nxY wt         j                  d«       y # t         j                  d«       w xY w­w)NFr$   ÚlifespanrS   )r.   TÚrequest)Úsession_moderE   )Ú
asgi_scope)ÚhttpÚ	websocketz	{}.server)ÚopÚnameÚsourcez1[ASGI] Created transaction (continuing trace): %sz$[ASGI] Created transaction (new): %sz	asgi.typezB[ASGI] Set transaction name and source on transaction: '%s' / '%s'rc   )Úcustom_sampling_contextz[ASGI] Started transaction: %sc              “   óœ   •K  — | j                  d«      dk(  xr
 ‰d uxr d| v }|r‰j                  | d   «        ‰| «      ƒ d {  –—† S 7 Œ­w)Nr$   zhttp.response.startÚstatus)ÚgetÚset_http_status)r/   Úis_http_responserY   Útransactions     €€r0   Ú_sentry_wrapped_sendz;SentryAsgiMiddleware._run_app.<locals>._sentry_wrapped_sendÙ   sa   øè ø€ ð %*§I¡I¨fÓ$5Ð9NÑ$Nò %:Ø(3¸4Ð(?ò%:à(0°EÐ(9ð !1ñ
 $4Ø$/×$?Ñ$?ÀÀhÁÔ$Pá-1°%«[×'8Ð 8Ð'8ús   ƒAAÁA
ÁA)Ú_asgi_middleware_appliedrl   r=   Ú	Exceptionr1   r   Úcurrentr.   Úsetr   Úconfigure_scopeÚclear_breadcrumbsÚ_namer   Úevent_processorÚadd_event_processorÚ _get_transaction_name_and_sourcerB   r   r	   Úformatr   Údebugr   r   ÚHTTP_SERVERÚset_tagrg   rh   Ústart_transaction)rM   rZ   rX   rY   rU   Úis_recursive_asgi_middlewareÚis_lifespanr-   r,   Úsentry_scopeÚ	processorÚtyÚtransaction_nameÚtransaction_sourcerp   ro   s      `           @r0   rW   zSentryAsgiMiddleware._run_app”   sŒ  ùè ø€ ä'?×'CÑ'CÀEÓ'JÐ$Ø˜F‘m zÑ1ˆÙ'©;ð$Ø 1Ò$Ø!0 §¡¨%£°¸$Ó!?×?Ð?à!%§¡¨%°¸$Ó!?×?Ð?ô 	!×$Ñ$ TÔ*ðO	0Ü”c—k‘kÓ"ˆCÜ& s¸ÔCñ K0Øñ J0Ø×,Ñ,Ó.ð D°,Ø$×6Ñ6Ô8Ø-3˜Ô*Ü$+¨D×,@Ñ,@ÈUÔ$S˜	Ø$×8Ñ8¸ÔC÷	Dð ˜v™�Bð ×=Ñ=Ø×.Ñ.ØóñØ(Ø*ð Ð2Ñ2Ü&4Ü(¨Ó/Ø*×1Ñ1°"Ó5Ø!1Ø#5ô	'˜ô Ÿ™ØOØ'õô
 '2Ü!Ÿ~™~Ø!1Ø#5ô'˜ô
 Ÿ™ØBÀKôð  ×'Ñ'¨°RÔ8Ü—L‘LØ\Ø#×(Ñ(Ø#×*Ñ*ôð ×.Ñ.Ø#¸lÈEÐ=Rð /ó ñ 0ô Ÿ™Ð%EÀ{ÔSð0õ
9ð  ,¨qÒ0Ø-<¨T¯X©X°e«_Ø$+Ð-Aó."÷ ("÷'0ð 0÷YJ0ð J0÷K0ð K0ôZ %×(Ñ(¨Õ/ð .2¯X©XØ$)¨7Ð4Hó."÷ ("÷/0ð 0÷YJ0ð J0÷K0ð K0ôZ %×(Ñ(¨Õ/ðq @ùà?úäò $Ü"¤3§;¡;°ÀD×DWÑDWÕXØ˜tÐ#ûð$ú÷Dñ Dúð|("øð("ùô  )ò 0Ü.Ø # S¸×9LÑ9Lõð #&¨4Ð/ûð	0ú÷50ð 0úð 0÷YJ0÷ J0ñ J0ú÷K0÷ K0ñ K0úôZ %×(Ñ(¨Õ/øÔ$×(Ñ(¨Õ/üsD  „"N§ J- ÁJ'ÁJ- ÁNÁJ- Á"J*Á#J- Á&NÁ=&M1 Â#MÂ&L:Â7A K'Ã7C2L:Ç)L$È&K8È'K4
È(K8È+	L:È4	MÈ=	M1 ÉNÉK8É2K6
É3K8É6	L:É?	MÊ	M1 ÊNÊ'J- Ê*J- Ê-	K$Ê6)KËK$Ë$NË'K1Ë,L:Ë4K8Ë6K8Ë8	L!	ÌL	ÌL!	Ì!L$Ì$L-Ì)L:Ì1	MÌ:M	Ì?MÍ	M1 ÍMÍM1 ÍNÍ1NÎNc                 óp  — |j                  di «      }|j                  t        |«      «       t        |«      |d<   |d   t        k7  xr  |d   j                  d«      t
        t        fv }|sK| j                  | j                  |«      \  }}||d<   d|i|d<   t        j                  d|d   |d   d   «       |S )Nra   ro   Útransaction_inforh   zF[ASGI] Set transaction name and source in event_processor: '%s' / '%s')rl   Úupdater
   r   Ú_DEFAULT_TRANSACTION_NAMEr   r   rz   rB   r   r|   )rM   r/   r(   rc   Úrequest_dataÚalready_setrg   rh   s           r0   rx   z$SentryAsgiMiddleware.event_processorõ   sÝ   € à—y‘y ¨BÓ/ˆØ×ÑÔ-¨jÓ9Ô:Ü# LÓ1ˆˆiÑð ˜MÑ*Ô.GÑGò 
ÈEØñM
ç
‰#ˆh‹-Ü(Ü$ð
ðM
ˆñ Ø×@Ñ@Ø×&Ñ&¨
ó‰LˆD�&ð $(ˆE�-Ñ Ø)1°6Ð(:ˆEÐ$Ñ%ä�L‰LØXØ�mÑ$ØÐ(Ñ)¨(Ñ3ôð ˆr2   c                 óx  — d }t         |   }|j                  d«      }|dk(  r?|j                  d«      }|rt        |«      xs d}nat        ||dk(  rdndd ¬«      }t        }nE|dk(  r@|j                  d«      }|rt        |d	d «      }|�|}nt        ||dk(  rdndd ¬«      }t        }|€t        }t        }||fS ||fS )
Nr$   r!   Ú rd   Úws)Úhostr"   ÚrouteÚpath)r   rl   r   r   r   r<   rŠ   r   )	rM   rB   rc   rg   rh   r„   r!   r‘   r’   s	            r0   rz   z5SentryAsgiMiddleware._get_transaction_name_and_source  sÙ   € àˆÜ!Ð"3Ñ4ˆØ�^‰^˜FÓ#ˆà 
Ò*Ø!—~‘~ jÓ1ˆHñ Ü0°Ó:Ò@¸b‘ä 
°b¸F²l©FÈÐSWÔX�Ü/‘à %Ò'ð —N‘N 7Ó+ˆEÙÜ˜u f¨dÓ3�ØÐ#Ø‘Dä 
°b¸F²l©FÈÐSWÔX�Ü/�àˆ<Ü,ˆDÜ-ˆFØ˜�<Ðà�Vˆ|Ðr2   N)Fr!   rE   )
Ú__name__Ú
__module__Ú__qualname__Ú	__slots__rP   rL   rK   rW   rx   rz   r\   r2   r0   rA   rA   V   s5   „ ØJ€Ið
 "Ø$Øó-,ò^òIò_0òBóD"r2   rA   )rE   )2Ú__doc__r:   r6   Úcopyr   Úsentry_sdk._functoolsr   Úsentry_sdk._typesr   Úsentry_sdk.apir   Úsentry_sdk.constsr   Úsentry_sdk.hubr   Ú$sentry_sdk.integrations._asgi_commonr	   r
   r   Úsentry_sdk.integrations.modulesr   Úsentry_sdk.sessionsr   Úsentry_sdk.tracingr   r   r   r   Úsentry_sdk.utilsr   r   r   r   r   r   r   Útypingr   r   r   r   r   r   r   rq   rŠ   rH   r1   r?   rA   r\   r2   r0   ú<module>r¤      s•   ðñó Û Ý å )Ý +Ý )Ý  Ý ÷ñ õ
 CÝ 5÷ó ÷÷ õ +áÝÝÝÝÝç-ñ &Ð&FÓGÐ à2Ð à.Ð ó
,ò1÷ cò cr2   