§
    xÅjf/  ã            
       ó  — d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	m
Z
mZ d dlmZ d dlZerd dlmZmZmZmZmZ d dlmZ d dlmZmZ d dlmZ  ej        d¦  «        Zd	Zd
Z G d„ d¦  «        Z	 d dlm Z  d dl!m"Z"m#Z#m$Z$ d dl%m&Z& dZ'dZ(dZ)dZ*dZ+ e,d„  e e-e+ .                    ¦   «         e+ /                    ¦   «         ¦  «        Ž D ¦   «         ¦  «        Z0 G d„ de&¦  «        Z1n# e2$ r dZ Y nw xY w	 	 	 	 	 	 d"d„Z3d#d!„Z4dS )$é    N)ÚchainÚproduct)ÚTYPE_CHECKING)ÚAnyÚCallableÚDictÚOptionalÚSelf)ÚEnvelope)Úcapture_internal_exceptionsÚenv_to_bool)ÚloggerÚ	spotlightzhttp://localhost:8969/streamz(sentry_sdk.spotlight.SpotlightMiddlewarec                   ó2   — e Zd ZdZdZdZdeddfd„Zdd
„ZdS )ÚSpotlightClientaY  
    A client for sending envelopes to Sentry Spotlight.

    Implements exponential backoff retry logic per the SDK spec:
    - Logs error at least once when server is unreachable
    - Does not log for every failed envelope
    - Uses exponential backoff to avoid hammering an unavailable server
    - Never blocks normal Sentry operation
    g      ð?g      N@ÚurlÚreturnNc                 ój   — || _         t          j        ¦   «         | _        | j        | _        d| _        d S )Nç        )r   Úurllib3ÚPoolManagerÚhttpÚINITIAL_RETRY_DELAYÚ_retry_delayÚ_last_error_time)Úselfr   s     úEC:\Projects\Historical\venv\Lib\site-packages\sentry_sdk/spotlight.pyÚ__init__zSpotlightClient.__init__0   s2   € ØˆŒÝÔ'Ñ)Ô)ˆŒ	Ø Ô4ˆÔØ'*ˆÔÐÐó    Úenveloper   c                 ó`  — | j         dk    r(t          j        ¦   «         | j         z
  }|| j        k     rd S t          j        ¦   «         }|                     |¦  «         	 | j                             | j        | 	                    ¦   «         dddi¬¦  «        }| 
                    ¦   «          | j        | _        d| _         d S # t          $ rf}t          j        ¦   «         | _         t          | j        dz  | j        ¦  «        | _        t          j        d| j        || j        ¦  «         Y d }~d S d }~ww xY w)	Nr   ÚPOSTúContent-Typezapplication/x-sentry-envelope)r   ÚbodyÚmethodÚheadersr   é   zNFailed to send envelope to Spotlight at %s: %s. Will retry after %.1f seconds.)r   Útimer   ÚioÚBytesIOÚserialize_intor   Úrequestr   ÚgetvalueÚcloser   Ú	ExceptionÚminÚMAX_RETRY_DELAYÚsentry_loggerÚwarning)r   r    Útime_since_errorr$   ÚreqÚes         r   Úcapture_envelopez SpotlightClient.capture_envelope6   sQ  € àÔ  1Ò$Ð$Ý#œy™{œ{¨TÔ-BÑBÐØ $Ô"3Ò3Ð3à�åŒz‰|Œ|ˆØ×Ò Ñ%Ô%Ð%ð	Ø”)×#Ò#Ø”HØ—]’]‘_”_Øà"Ð$Cðð	 $ñ ô ˆCð �IŠI‰KŒKˆKà $Ô 8ˆDÔØ$'ˆDÔ!Ð!Ð!øÝð 	ð 	ð 	Ý$(¤I¡K¤KˆDÔ!õ !$ DÔ$5¸Ñ$9¸4Ô;OÑ PÔ PˆDÔõ Ô!ð1à”ØØÔ!ñô ð ð ð ð ð ð ð øøøøð	øøøs   ÁAB= Â=
D-ÃAD(Ä(D-)r    r   r   N)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r1   Ústrr   r7   © r   r   r   r   !   sa   € € € € € ðð ð ÐØ€Oð+˜Cð + Dð +ð +ð +ð +ð$ð $ð $ð $ð $ð $r   r   )Úsettings)ÚHttpRequestÚHttpResponseÚHttpResponseServerError)ÚMiddlewareMixinz/assets/main.jsz´<script>window.__spotlight = {{ initOptions: {{ sidecarUrl: '{spotlight_url}', fullPage: false }} }};</script>
<script type="module" crossorigin src="{spotlight_js_url}"></script>
z“<html><base href="{spotlight_url}">
<script>window.__spotlight = {{ initOptions: {{ fullPage: true, startFrom: "/errors/{event_id}" }}}};</script>
zcharset=r$   c              #   óf   K  — | ],}d                       d                     |¦  «        ¦  «        V — Œ-dS )z</{}>Ú N)ÚformatÚjoin)Ú.0Úcharss     r   ú	<genexpr>rI   m   sL   è è € ð )ð )àð 	�Š�r—w’w˜u‘~”~Ñ&Ô&ð)ð )ð )ð )ð )ð )r   c                   ó†   ‡ — e Zd ZU dZded<   dZded<   dˆ fd
„Zedd„¦   «         Z	 	 	 	 	 	 	 	 dd„Z	ddddde
d	dfd„Zˆ xZS )ÚSpotlightMiddlewareNúOptional[str]Ú_spotlight_scriptÚ_spotlight_urlr   r
   Úget_responseúCallable[..., HttpResponse]r   c                 ó*  •— t          ¦   «                              |¦  «         dd l}|j        | _        | j                             ¦   «         j        }|€t          j        d¦  «         d S t          j
                             |j        d¦  «        | _        d S )Nr   zPCannot find Spotlight client from SpotlightMiddleware, disabling the middleware.z../)Úsuperr   Úsentry_sdk.apiÚapiÚ
sentry_sdkÚ
get_clientr   r2   r3   ÚurllibÚparseÚurljoinr   rN   )r   rO   rU   Úspotlight_clientÚ	__class__s       €r   r   zSpotlightMiddleware.__init__v   s�   ø€ Ý‰GŒG×Ò˜\Ñ*Ô*Ð*à!Ð!Ð!Ð!à(œnˆDŒOà#œ×9Ò9Ñ;Ô;ÔEÐØÐ'ÝÔ%Øfñô ð ð �tå"(¤,×"6Ò"6Ð7GÔ7KÈUÑ"SÔ"SˆDÔÐÐr   c                 óÀ  — | j         �Ñ| j        €Ê	 t          j                             | j         t
          ¦  «        }t          j                             |d¬¦  «        }t          j                             |¦  «         t           
                    | j         |¬¦  «        | _        n8# t          j        j        $ r!}t          j        d||¬¦  «         Y d }~nd }~ww xY w| j        S )NÚHEAD)r%   )Úspotlight_urlÚspotlight_js_urlzUCannot get Spotlight JS to inject at %s. SpotlightMiddleware will not be very useful.)Úexc_info)rN   rM   rW   rX   rY   ÚSPOTLIGHT_JS_ENTRY_PATHr,   ÚRequestÚurlopenÚSPOTLIGHT_JS_SNIPPET_PATTERNrE   ÚerrorÚURLErrorr2   Údebug)r   r_   r5   Úerrs       r   Úspotlight_scriptz$SpotlightMiddleware.spotlight_script†   s  € àÔ"Ð.°4Ô3IÐ3QðÝ'-¤|×';Ò';ØÔ+Õ-Dñ(ô (Ð$õ !œ.×0Ò0Ø(Ø%ð 1ñ ô �Cõ ”N×*Ò*¨3Ñ/Ô/Ð/Ý-I×-PÒ-PØ&*Ô&9Ø)9ð .Qñ .ô .�DÔ*Ð*øõ ”|Ô,ð ð ð Ý!Ô'ØoØ(Ø!$ðñ ô ð ð ð ð ð ð øøøøðøøøð Ô)Ð)s   �BB! Â!CÂ5CÃCÚ_requestr?   Úresponser@   úOptional[HttpResponse]c                 ó   ‡‡— t          d„ ‰j                             dd¦  «                             ¦   «                              d¦  «        D ¦   «         ¦  «        }|d         }t          |¦  «        dk    rC|d                              t          ¦  «        r#|d         t          t          ¦  «        d …         ŠndŠ| j        �½‰j	        s¶|dk    r°t          ‰j
        ¦  «        }| j                             ‰¦  «        }t          d	„ ˆˆfd
„t          D ¦   «         D ¦   «         |¦  «        }‰j
        d |…         |z   ‰j
        |d …         z   ‰_
        ‰                     d¦  «        r|t          |¦  «        z   ‰j        d<   ‰S )Nc              3   ó>   K  — | ]}|                      ¦   «         V — Œd S ©N)Ústrip)rG   Úps     r   rI   z7SpotlightMiddleware.process_response.<locals>.<genexpr>¢   s>   è è € ð (ð (àð —’‘	”	ð(ð (ð (ð (ð (ð (r   r#   rD   ú;r   é   úutf-8z	text/htmlc              3   ó&   K  — | ]}|d k    ¯|V — ŒdS )éÿÿÿÿNr=   )rG   Úidxs     r   rI   z7SpotlightMiddleware.process_response.<locals>.<genexpr>¶   s8   è è € ð ð àð  š8˜8ð ð
 $˜8˜8˜8ðð r   c              3   ór   •K  — | ]1}‰j                              |                     ‰¦  «        ¦  «        V — Œ2d S ro   )ÚcontentÚrfindÚencode)rG   Úbody_variantÚencodingrk   s     €€r   rI   z7SpotlightMiddleware.process_response.<locals>.<genexpr>¸   sV   øè è € ð $ð $à ,ð %Ô,×2Ò2°<×3FÒ3FÀxÑ3PÔ3PÑQÔQð$ð $ð $ð $ð $ð $r   zContent-Length)Útupler&   ÚgetÚlowerÚsplitÚlenÚ
startswithÚCHARSET_PREFIXri   Ú	streamingry   r{   ÚnextÚBODY_CLOSE_TAG_POSSIBILITIESÚ
has_header)	r   rj   rk   Úcontent_type_headerÚcontent_typeÚcontent_lengthÚ	injectionÚinjection_siter}   s	     `     @r   Úprocess_responsez$SpotlightMiddleware.process_responseŸ   sÐ  øø€ õ #(ð (ð (à!Ô)×-Ò-¨n¸bÑAÔA×GÒGÑIÔI×OÒOÐPSÑTÔTð(ñ (ô (ñ #ô #Ðð /¨qÔ1ˆLÝÐ&Ñ'Ô'¨!Ò+Ð+Ð0CÀAÔ0F×0QÒ0QÝñ1ô 1Ð+ð /¨qÔ1µ#µnÑ2EÔ2EÐ2GÐ2GÔH��à"�ð Ô%Ð1Ø Ô*ð 2à  KÒ/Ð/å!$ XÔ%5Ñ!6Ô!6�Ø Ô1×8Ò8¸ÑBÔB�	Ý!%ðð ð$ð $ð $ð $ð $å0Lð$ñ $ô $ðñ ô ð #ñ
"ô 
"�ð Ô$ _ n _Ô5Øñ àÔ& ~  Ô7ñ8ð Ô ð ×&Ò&Ð'7Ñ8Ô8ð YØ9GÍ#ÈiÉ.Ì.Ñ9X�HÔ$Ð%5Ñ6àˆOr   Ú	exceptionz!Optional[HttpResponseServerError]c           	      ó®  — t           j        r| j        sd S 	 t          j                             | j        ¦  «                             ¦   «                              d¦  «        }| j         	                    |¦  «        }t          |                     dt                               | j        |¬¦  «        ¦  «        ¦  «        S # t          j        j        $ r Y d S w xY w)Nrt   z<html>)r^   Úevent_id)r>   ÚDEBUGrN   rW   r,   rc   ÚreadÚdecoderU   Úcapture_exceptionrA   ÚreplaceÚSPOTLIGHT_ERROR_PAGE_SNIPPETrE   re   rf   )r   rj   r�   r   r‘   s        r   Úprocess_exceptionz%SpotlightMiddleware.process_exceptionÍ   sß   € õ ”>ð ¨Ô)<ð Ø�tðå”N×*Ò*¨4Ô+>Ñ?Ô?×DÒDÑFÔF×MÒMÈgÑVÔVð ð  œ?×<Ò<¸YÑGÔG�Ý.Ø×%Ò%Ø Ý4×;Ò;Ø*.Ô*=Èð <ñ ô ñô ñô ð øõ	 ”<Ô(ð ð ð Ø�t�tðøøøs   —A	B< Â<CÃC)r   r
   rO   rP   r   N)r   r
   r   rL   )r   r
   rj   r?   rk   r@   r   rl   )r8   r9   r:   rM   Ú__annotations__rN   r   Úpropertyri   rŽ   r/   r˜   Ú__classcell__)r[   s   @r   rK   rK   r   sï   ø€ € € € € € Ø-1Ð˜?Ð1Ð1Ñ1Ø*.ˆ˜Ð.Ð.Ñ.ð	Tð 	Tð 	Tð 	Tð 	Tð 	Tð  
ð	*ð 	*ð 	*ñ 
Œð	*ð0,	Øð,	Ø$1ð,	Ø=Kð,	à%ð,	ð ,	ð ,	ð ,	ð\	Øð	Ø$1ð	Ø>Gð	à0ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	r   rK   Úspotlight_configr   r2   r   rL   c                 óR  — t           j                             d¦  «        }d}d}|rt          |d¬¦  «        }|€d}|}n|}| du r|r |j        d¦  «         dS | du r|r|S t
          S t          | t          ¦  «        r|r|| k    r |j        d| |¦  «         | S | €|r|S |rt
          S dS )a  
    Resolve the Spotlight URL based on config and environment variable.

    Implements precedence rules per the SDK spec:
    https://develop.sentry.dev/sdk/expected-features/spotlight/

    Returns the resolved URL string, or None if Spotlight should be disabled.
    ÚSENTRY_SPOTLIGHTNT)ÚstrictFzhSpotlight is disabled via spotlight=False config option, ignoring SENTRY_SPOTLIGHT environment variable.z`Spotlight URL from config (%s) takes precedence over SENTRY_SPOTLIGHT environment variable (%s).)ÚosÚenvironr   r   r3   ÚDEFAULT_SPOTLIGHT_URLÚ
isinstancer<   )rœ   r2   Úspotlight_env_valueÚspotlight_from_envÚspotlight_env_urlÚparseds         r   Ú_resolve_spotlight_urlr¨   è   s0  € õ œ*Ÿ.š.Ð);Ñ<Ô<Ðð ,0ÐØ)-ÐØð (ÝÐ0¸Ð>Ñ>Ô>ˆØˆ>à!%ÐØ 3ÐÐà!'Ðð ˜5Ð Ð àð 	Ø!ˆMÔ!ðBñô ð ð ˆtØ	˜TÐ	!Ð	!ð ð 	)Ø$Ð$å(Ð(Ý	Ð$¥cÑ	*Ô	*ð )àð 	Ð#6Ð:JÒ#JÐ#JØ!ˆMÔ!ð>à Ø#ñ	ô ð ð  ÐØ	Ð	!àð 	)Ø$Ð$Øð 	)Ý(Ð(ð ˆ4r   ÚoptionsúDict[str, Any]úOptional[SpotlightClient]c                 ó²  — t          |                      d¦  «        t          ¦  «        }|€d S t          j        t
          j        ¦  «        }|                     t          j        d¦  «        ¦  «         t           
                    |¦  «         t                               t          j        ¦  «         || d<   t          ¦   «         5  t          �Ët          j        r¿t!          t"          j                             dd¦  «        ¦  «        r’t!          t"          j                             dd¦  «        ¦  «        ret          j        }t(          |vrP t+          |¦  «        t-          |t(          f¦  «        ¦  «        t          _        t                               d¦  «         d d d ¦  «         n# 1 swxY w Y   t1          |¦  «        }t                               d|¦  «         |S )Nr   z' [spotlight] %(levelname)s: %(message)sÚSENTRY_SPOTLIGHT_ON_ERRORÚ1ÚSENTRY_SPOTLIGHT_MIDDLEWAREz(Enabled Spotlight integration for Djangoz%Enabled Spotlight using sidecar at %s)r¨   r   r2   ÚloggingÚStreamHandlerÚsysÚstderrÚsetFormatterÚ	Formatterr   Ú
addHandlerÚsetLevelÚINFOr   r>   r’   r   r    r¡   Ú
MIDDLEWAREÚ DJANGO_SPOTLIGHT_MIDDLEWARE_PATHÚtyper   Úinfor   )r©   r   Ú_handlerÚ
middlewareÚclients        r   Úsetup_spotlightrÀ   '  sÕ  € Ý
  §¢¨[Ñ!9Ô!9½=Ñ
IÔ
I€Cà
€{Øˆtõ Ô$¥S¤ZÑ0Ô0€HØ×Ò�'Ô+Ð,UÑVÔVÑWÔWÐWÝ
×Ò�hÑÔÐÝ
‡O‚O•G”LÑ!Ô!Ð!ð €GˆKÑå	$Ñ	&Ô	&ð Hð HåÐ Ý”ð !å�BœJŸNšNÐ+FÈÑLÔLÑMÔMð !õ �BœJŸNšNÐ+HÈ#ÑNÔNÑOÔOð !õ
 "Ô,ˆJÝ/°zÐAÐAØ&6¥d¨:Ñ&6Ô&6Ý˜*Õ'GÐ&IÑJÔJñ'ô '•Ô#õ —’ÐFÑGÔGÐGðHð Hð Hñ Hô Hð Hð Hð Hð Hð Hð Høøøð Hð Hð Hð Hõ ˜SÑ!Ô!€FÝ
‡K‚KÐ7¸Ñ=Ô=Ð=à€Ms   ÃCF"Æ"F&Æ)F&)rœ   r   r2   r   r   rL   )r©   rª   r   r«   )5r)   r°   r    r²   r(   Úurllib.errorrW   Úurllib.parseÚurllib.requestÚ	itertoolsr   r   Útypingr   r   r   r   r   r	   r
   Úsentry_sdk.enveloper   Úsentry_sdk.utilsr   r   r   r2   Ú	getLoggerr¢   rº   r   Údjango.confr>   Údjango.httpr?   r@   rA   Údjango.utils.deprecationrB   ra   rd   r—   r„   ÚBODY_TAG_NAMEr~   ÚzipÚupperr€   r‡   rK   ÚImportErrorr¨   rÀ   r=   r   r   ú<module>rÐ      sÑ  ðØ 	€	€	€	Ø €€€Ø 	€	€	€	Ø 
€
€
€
Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ø Ð Ð Ð Ø $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ø  Ð  Ð  Ð  Ð  Ð  à €€€àð ;Ø:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:à (Ð (Ð (Ð (Ð (Ð (ðð ð ð ð ð ð ð ðð ð ð ð ð ð 
ˆÔ	˜;Ñ	'Ô	'€ð 7Ð Ø#MÐ  ð9ð 9ð 9ð 9ð 9ñ 9ô 9ð 9ðxHØ$Ð$Ð$Ð$Ð$Ð$ØNÐNÐNÐNÐNÐNÐNÐNÐNÐNØ8Ð8Ð8Ð8Ð8Ð8à/Ðð	Qð !ð
	{ð !ð  €NØ€MØ#( 5ð )ð )à�W˜c˜c -×"5Ò"5Ñ"7Ô"7¸×9LÒ9LÑ9NÔ9NÑOÔOÐPð)ñ )ô )ñ $ô $Ð ð
pð pð pð pð p˜oñ pô pð pð pøðd ð ð ð Ø€H€H€Hðøøøð<Øð<Ø,1ð<àð<ð <ð <ð <ð~ ð  ð  ð  ð  ð  s   Á9A4C. Ã.C8Ã7C8