Ë
    õ�Dj�1  ã                   ób  — d Z ddlZddl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 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mZmZ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# 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Z0dd„Z1d„ Z2 G d„ d«      Z3y)ze
An ASGI middleware.

Based on Tom Christie's `sentry-asgi <https://github.com/encode/sentry-asgi>`.
é    N)Údeepcopy)Úpartial)Úcontinue_trace)ÚOP)Ú_get_headersÚ_get_request_dataÚ_get_url)ÚDEFAULT_HTTP_METHODS_TO_CAPTUREÚnullcontext)Útrack_session)ÚSOURCE_FOR_STYLEÚTRANSACTION_SOURCE_ROUTEÚTRANSACTION_SOURCE_URLÚTRANSACTION_SOURCE_COMPONENTÚTRANSACTION_SOURCE_CUSTOM)Ú
ContextVarÚevent_from_exceptionÚHAS_REAL_CONTEXTVARSÚCONTEXTVARS_ERROR_MESSAGEÚloggerÚtransaction_from_functionÚ_get_installed_modules)ÚTransaction)ÚTYPE_CHECKING)ÚAny)ÚCallable)ÚDict)ÚOptional)ÚTuple)ÚEventÚHintÚsentry_asgi_middleware_appliedzgeneric ASGI request)ÚendpointÚurlc                 ó’   — t        | t        j                  «       j                  |ddœ¬«      \  }}t        j                  ||¬«       y )NF)ÚtypeÚhandled)Úclient_optionsÚ	mechanism)Úhint)r   Ú
sentry_sdkÚ
get_clientÚoptionsÚcapture_event)ÚexcÚmechanism_typeÚeventr*   s       ú`C:\Crop_Prediction\Backend\crop-ai-system\venv\Lib\site-packages\sentry_sdk/integrations/asgi.pyÚ_capture_exceptionr3   ?   sA   € ô 'ØÜ!×,Ñ,Ó.×6Ñ6Ø)°eÑ<ô�K€Eˆ4ô
 ×Ñ˜U¨Ö.ó    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     r2   Ú_looks_like_asgi3rA   J   s[   € ô ‡��sÔÜ�s˜KÓ(Ð(Ü	×	Ñ	˜CÔ	 Ü×*Ñ*¨3Ó/Ð/ä�s˜J¨Ó-ˆÜ×*Ñ*¨4Ó0Ð0r4   c                   ó@   — e Zd ZdZddddefd„Zd„ Zd„ Zd	„ Zd
„ Z	d„ Z
y)ÚSentryAsgiMiddleware)r?   r7   Útransaction_styler0   Úspan_originÚhttp_methods_to_captureFr#   ÚasgiÚmanualc                 ój  — |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 ú)rG   Ú	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   ÚwarningrD   r0   rE   r?   rF   rA   Ú
_run_asgi3r7   Ú
_run_asgi2)Úselfr?   Úunsafe_context_datarD   r0   rE   rF   Ú0asgi_middleware_while_using_starlette_or_fastapis           r2   Ú__init__zSentryAsgiMiddleware.__init__d   sÆ   € ñ" #Õ+?ô ð1Ü3LñMóð ð Ô$<Ñ<Ýâ$Ö&>ð@óð ð ˜fÑ$ÒP¨Ô8NÓ8PÐ)Pð 	9ñ <Ü�N‰Nðaôð "3ˆÔØ,ˆÔØ&ˆÔØˆŒØ'>ˆÔ$ä˜SÔ!Ø ŸO™OˆD�Mà ŸO™OˆD�Mr4   c                 ó   ‡ ‡— ˆˆ fd„}|S )Nc              “   óJ   •K  — ‰j                  ‰| |d¬«      ƒ d {  –—† S 7 Œ­w)Né   ©Úasgi_version©Ú_run_app)ÚreceiveÚsendÚscoperR   s     €€r2   Úinnerz.SentryAsgiMiddleware._run_asgi2.<locals>.inner™   s$   øè ø€ àŸ™ u¨g°tÈ!˜ÓL×LÐLÐLús   ƒ#œ!�#© )rR   r_   r`   s   `` r2   rQ   zSentryAsgiMiddleware._run_asgi2—   s   ù€ õ	Mð ˆr4   c              ƒ   óH   K  — | j                  |||d¬«      ƒ d {  –—† S 7 Œ­w)Né   rY   r[   )rR   r_   r]   r^   s       r2   rP   zSentryAsgiMiddleware._run_asgi3Ÿ   s#   è ø€ à—]‘] 5¨'°4Àa�]ÓH×HÐHÐHús   ‚"› œ"c           	   ƒ   óL  ‡‡K  — t         j                  d«      }|d   dk(  }|s|rA	 |dk(  r  | j                  |«      |‰«      ƒ d {  –—† S | j                  ||‰«      ƒ d {  –—† S t         j                  d«       	 t        j                  «       5 }t        |d¬«      5  |j                  «        d	|_        t        | j                  |¬
«      }	|j                  |	«       |d   }
| j                  | j                   |«      \  }}|j                  dd«      j#                  «       }d Š|| j$                  v rÇ|
dv rIt'        t)        |«      dj+                  |
«      ||| j,                  ¬«      Št/        j0                  d‰«       n=t3        t4        j6                  ||| j,                  ¬«      Št/        j0                  d‰«       ‰j9                  d|
«       t/        j0                  d‰j:                  ‰j<                  «       ‰�t        j>                  ‰d|i¬«      n	tA        «       5  t/        j0                  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 �Œ~# t        $ r}t	        || j
                  ¬«       |d ‚d }~ww xY w7 Œ°7 Œg# 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&   ÚlifespanrX   )r0   TÚrequest)Úsession_moderG   )Ú
asgi_scopeÚmethodÚ )ÚhttpÚ	websocketz	{}.server)ÚopÚnameÚsourceÚoriginz1[ASGI] Created transaction (continuing trace): %sz$[ASGI] Created transaction (new): %sz	asgi.typezB[ASGI] Set transaction name and source on transaction: '%s' / '%s'rh   )Úcustom_sampling_contextz[ASGI] Started transaction: %sc              “   ó”   •K  — ‰�0| j                  d«      dk(  xr d| v }|r‰j                  | d   «        ‰| «      ƒ d {  –—† S 7 Œ­w)Nr&   zhttp.response.startÚstatus)ÚgetÚset_http_status)r1   Úis_http_responser^   Útransactions     €€r2   Ú_sentry_wrapped_sendz;SentryAsgiMiddleware._run_app.<locals>._sentry_wrapped_sendð   sX   øè ø€ à#.Ð#:à(-¯	©	°&Ó(9Ð=RÑ(Rò )>Ø,4¸Ð,=ð %5ñ (8Ø(3×(CÑ(CÀEÈ(ÁOÔ(Tá-1°%«[×'8Ð 8Ð'8ús   ƒ>AÁAÁA)!Ú_asgi_middleware_appliedrt   r?   Ú	Exceptionr3   r0   Úsetr+   Úisolation_scoper   Úclear_breadcrumbsÚ_namer   Úevent_processorÚadd_event_processorÚ _get_transaction_name_and_sourcerD   ÚupperrF   r   r   ÚformatrE   r   Údebugr   r   ÚHTTP_SERVERÚset_tagrn   ro   Ústart_transactionr   )rR   r_   r]   r^   rZ   Úis_recursive_asgi_middlewareÚis_lifespanr/   Úsentry_scopeÚ	processorÚtyÚtransaction_nameÚtransaction_sourceri   rx   rw   s      `           @r2   r\   zSentryAsgiMiddleware._run_app£   sœ  ùè ø€ ä'?×'CÑ'CÀEÓ'JÐ$Ø˜F‘m zÑ1ˆÙ'©;ð$Ø 1Ò$Ø!0 §¡¨%£°¸$Ó!?×?Ð?à!%§¡¨%°¸$Ó!?×?Ð?ô 	!×$Ñ$ TÔ*ðU	0Ü×+Ñ+Ó-ð R0°Ü" <¸iÔHñ Q0Ø ×2Ñ2Ô4Ø)/�LÔ&Ü '¨×(<Ñ(<ÈÔ O�IØ ×4Ñ4°YÔ?à˜v™�Bð ×=Ñ=Ø×.Ñ.ØóñØ(Ø*ð #ŸY™Y x°Ó4×:Ñ:Ó<�FØ"&�KØ ×!=Ñ!=Ñ=ØÐ!6Ñ6Ü*8Ü ,¨UÓ 3Ø#.×#5Ñ#5°bÓ#9Ø%5Ø'9Ø'+×'7Ñ'7ô+˜Kô #ŸL™LØ SØ +õô
 +6Ü#%§>¡>Ø%5Ø'9Ø'+×'7Ñ'7ô	+˜Kô #ŸL™LØ FÈôð $×+Ñ+¨K¸Ô<ÜŸ™Ø`Ø'×,Ñ,Ø'×.Ñ.ôð 'Ð2ô	 #×4Ñ4Ø'Ø5AÀ5Ð4Iõô
 )›]ñ!0ô Ÿ™Ð%EÀ{ÔSð0õ
9ð  ,¨qÒ0Ø-<¨T¯X©X°e«_Ø$+Ð-Aó."÷ ("÷1!0ð !0÷aQ0ð Q0÷R0ð R0ôh %×(Ñ(¨Õ/ð .2¯X©XØ$)¨7Ð4Hó."÷ ("÷9!0ð !0÷aQ0ð Q0÷R0ð R0ôh %×(Ñ(¨Õ/ð} @ùà?úäò $Ü" 3°t×7JÑ7JÕKØ˜tÐ#ûð$úð^("øð("ùô  )ò 0Ü.¨sÀ4×CVÑCVÕWØ"%¨4Ð/ûð0ú÷?!0ð !0úð !0÷aQ0÷ Q0ñ Q0ú÷R0÷ R0ñ R0úôh %×(Ñ(¨Õ/øÔ$×(Ñ(¨Õ/üs+  „"N$§ K# ÁKÁK# ÁN$ÁK# Á"K Á#K# Á&N$Á=N
 ÂM(ÂF MÈL=È7&LÉL
ÉLÉ!	MÉ*	M(É3	N
 É<N$ÊLÊ(L
Ê)LÊ,	MÊ5	M(Ê>	N
 ËN$ËK# Ë K# Ë#	LË,LÌLÌN$ÌLÌLÌ	L:	ÌL5	Ì5L:	Ì:L=Ì=MÍMÍ
	M(ÍM	ÍM(Í	N
 Í(M1Í-N
 Í4N$Î
N!Î!N$c                 óz  — |j                  di «      }|j                  t        |«      «       t        |«      |d<   |d   t        k7  xr% |d   j                  d«      t
        t        t        fv }|sK| j                  | j                  |«      \  }}||d<   d|i|d<   t        j                  d|d   |d   d   «       |S )Nrf   rw   Útransaction_inforo   zF[ASGI] Set transaction name and source in event_processor: '%s' / '%s')rt   Úupdater   r   Ú_DEFAULT_TRANSACTION_NAMEr   r   r   r�   rD   r   r„   )rR   r1   r*   rh   Úrequest_dataÚalready_setrn   ro   s           r2   r   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ôð ˆr4   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#   rj   rk   Úws)Úhostr$   ÚrouteÚpath)r   rt   r   r	   r   r>   r’   r   )	rR   rD   rh   rn   ro   rŒ   r#   r˜   r™   s	            r2   r�   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ˆ|Ðr4   N)Ú__name__Ú
__module__Ú__qualname__Ú	__slots__r
   rU   rQ   rP   r\   r   r�   ra   r4   r2   rC   rC   Z   s=   „ ð€Ið "Ø$ØØØ ?ó1,òfòIòe0òNóF"r4   rC   )rG   )4Ú__doc__r<   r8   Úcopyr   Ú	functoolsr   r+   Úsentry_sdk.apir   Úsentry_sdk.constsr   Ú$sentry_sdk.integrations._asgi_commonr   r   r	   Ú$sentry_sdk.integrations._wsgi_commonr
   r   Úsentry_sdk.sessionsr   Úsentry_sdk.tracingr   r   r   r   r   Úsentry_sdk.utilsr   r   r   r   r   r   r   r   Útypingr   r   r   r   r   r   Úsentry_sdk._typesr    r!   ry   r’   rM   r3   rA   rC   ra   r4   r2   ú<module>rª      s›   ðñó Û Ý Ý ã Ý )Ý  ÷ñ ÷
õ .÷õ ÷÷ ñ õ +å  áÝÝÝÝÝç-ñ &Ð&FÓGÐ à2Ð à.Ð ó/ò1÷ uò ur4   