Ë
    õ�Dj*  ã                   óä  — d dl Z d dlmZ d dlZd dlmZ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 d dlmZmZmZmZ d dlmZ erad 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$ d dlm%Z% d dlm&Z& d dl'm(Z(m)Z)  e$d«      Z* e$d«      Z+ e$d«      Z, G d„ de%«      Z- ed«      Z.d(d„Z/d)d„Z0 G d„ d «      Z1	 d*d!„Z2d"„ Z3d#„ Z4d$„ Z5 G d%„ d&«      Z6d'„ Z7y)+é    N)Úpartial)Úget_hostÚ_get_headers)Úcontinue_trace)ÚOP©Úshould_send_default_pii)ÚDEFAULT_HTTP_METHODS_TO_CAPTUREÚ_filter_headersÚnullcontext)Útrack_session)Úuse_isolation_scope)ÚTransactionÚTRANSACTION_SOURCE_ROUTE)Ú
ContextVarÚcapture_internal_exceptionsÚevent_from_exceptionÚreraise)ÚTYPE_CHECKING)ÚCallable)ÚDict)ÚIterator)ÚAny)ÚTuple)ÚOptional)ÚTypeVar)ÚProtocol)ÚExcInfo)ÚEventÚEventProcessorÚWsgiResponseIterÚWsgiResponseHeadersÚWsgiExcInfoc                   ó   — e Zd Zdd„Zy)ÚStartResponseNc                  ó   — y ©N© )ÚselfÚstatusÚresponse_headersÚexc_infos       ú`C:\Crop_Prediction\Backend\crop-ai-system\venv\Lib\site-packages\sentry_sdk/integrations/wsgi.pyÚ__call__zStartResponse.__call__,   s   € àó    r'   )Ú__name__Ú
__module__Ú__qualname__r.   r(   r/   r-   r%   r%   +   s   „ ô	r/   r%   Úsentry_wsgi_middleware_appliedc                 óD   — | j                  d«      j                  ||«      S )NÚlatin1)ÚencodeÚdecode)ÚsÚcharsetÚerrorss      r-   Úwsgi_decoding_dancer;   4   s   € à�8‰8�HÓ×$Ñ$ W¨fÓ5Ð5r/   c                 ó
  — | j                  dd«      j                  d«      }| j                  dd«      j                  d«      }|› d|› �}| j                  d«      ›dt        | |«      ›dt	        |«      j                  d«      ›�S )zPReturn the absolute URL without query string for the given WSGI
    environment.ÚSCRIPT_NAMEÚ ú/Ú	PATH_INFOzwsgi.url_schemez://)ÚgetÚrstripÚlstripr   r;   )ÚenvironÚuse_x_forwarded_forÚscript_nameÚ	path_infoÚpaths        r-   Úget_request_urlrI   9   s�   € ð —+‘+˜m¨RÓ0×7Ñ7¸Ó<€KØ—‘˜K¨Ó,×3Ñ3°CÓ8€IØˆ]˜!˜I˜;Ð'€Dð 	�‰Ð%Õ&Ü�Ð-Õ.Ü˜DÓ!×(Ñ(¨Ô-ðð r/   c                   ó$   — e Zd ZdZddefd„Zd„ Zy)ÚSentryWsgiMiddleware©ÚapprE   Úspan_originÚhttp_methods_to_captureFÚmanualc                 ó<   — || _         || _        || _        || _        y r'   rL   )r)   rM   rE   rN   rO   s        r-   Ú__init__zSentryWsgiMiddleware.__init__P   s#   € ð ˆŒØ#6ˆÔ Ø&ˆÔØ'>ˆÕ$r/   c                 óì  — t         j                  d«      r| j                  ||«      S t         j                  d«       	 t	        j
                  «       5 }t        |d¬«      5  t        «       5  |j                  «        d|_	        |j                  t        || j                  «      «       d d d «       |j                  dd«      j                  «       }d }|| j                  v r,t        |t         j"                  dt$        | j&                  ¬	«      }|�t	        j(                  |d
|i¬«      n	t+        «       5  	 | j                  |t-        t.        ||«      «      }d d d «       d d d «       d d d «       t         j                  d«       t7        «      S # 1 sw Y   ŒæxY w# t0        $ r t3        t5        «       Ž  Y Œ`w xY w# 1 sw Y   ŒexY w# 1 sw Y   ŒixY w# 1 sw Y   ŒmxY w# t         j                  d«       w xY w)NFTÚrequest)Úsession_modeÚwsgiÚREQUEST_METHODr>   zgeneric WSGI request)ÚopÚnameÚsourceÚoriginÚwsgi_environ)Úcustom_sampling_context)Ú_wsgi_middleware_appliedrA   rM   ÚsetÚ
sentry_sdkÚisolation_scoper   r   Úclear_breadcrumbsÚ_nameÚadd_event_processorÚ_make_wsgi_event_processorrE   ÚupperrO   r   r   ÚHTTP_SERVERr   rN   Ústart_transactionr   r   Ú_sentry_start_responseÚBaseExceptionr   Ú_capture_exceptionÚ_ScopedResponse)r)   rD   Ústart_responseÚscopeÚmethodÚtransactionÚresponses          r-   r.   zSentryWsgiMiddleware.__call__]   sÉ  € ä#×'Ñ'¨Ô.Ø—8‘8˜G ^Ó4Ð4ä ×$Ñ$ TÔ*ð)	0Ü×+Ñ+Ó-ð &;°Ü" 5°yÔAñ %;Ü4Ó6ñ Ø×/Ñ/Ô1Ø&,˜œØ×1Ñ1Ü6Ø '¨×)AÑ)Aóô÷ð %Ÿ[™[Ð)9¸2Ó>×DÑDÓF�FØ"&�KØ ×!=Ñ!=Ñ=Ü&4Ø#Ü!Ÿ~™~Ø!7Ü#;Ø#'×#3Ñ#3ô'˜ð 'Ð2ô	 #×4Ñ4Ø'Ø5CÀWÐ4Mõô
 )›]ñ;ð;Ø'+§x¡xØ 'Ü 'Ü$:¸NÈKó!"ó(˜H÷;÷+%;÷&;ôP %×(Ñ(¨Ô/ä˜u hÓ/Ð/÷Qð ûôF  -ò ;Ü#Ô%7Ó%9Ó:ð;ú÷;ð ;ú÷+%;ð %;ú÷&;ð &;ûôP %×(Ñ(¨Õ/úsŠ   ¾G ÁGÁ GÁ+=FÂ(B	GÄ1F8Ä3!FÅGÅGÅ$G ÆFÆGÆF5	Æ2F8Æ4F5	Æ5F8Æ8GÆ=GÇG	Ç	GÇGÇG ÇG3N)r0   r1   r2   Ú	__slots__r
   rR   r.   r(   r/   r-   rK   rK   H   s   „ ð€Ið "ØØ ?ó?ó10r/   rK   c                 óÌ   — t        «       5  t        |j                  dd«      d   «      }|�|j                  |«       d d d «       |€	 | ||«      S  | |||«      S # 1 sw Y   ŒxY w)Nú é   r   )r   ÚintÚsplitÚset_http_status)Úold_start_responserp   r*   r+   r,   Ú
status_ints         r-   ri   ri   ‘   su   € ô 
%Ó	&ñ 4Ü˜Ÿ™ c¨1Ó-¨aÑ0Ó1ˆ
ØÐ"Ø×'Ñ'¨
Ô3÷4ð
 Ðñ " &Ð*:Ó;Ð;á! &Ð*:¸HÓEÐE÷4ð 4ús   ‹2AÁA#c              #   ó^   K  — ddg}t        «       r|dgz  }|D ]  }|| v sŒ|| |   f–— Œ y­w)z�
    Returns our explicitly included environment variables we want to
    capture (server name, port and remote addr if pii is enabled).
    ÚSERVER_NAMEÚSERVER_PORTÚREMOTE_ADDRNr   )rD   ÚkeysÚkeys      r-   Ú_get_environr�   §   sK   è ø€ ð ˜=Ð)€DÜÔ ð 	��Ñˆàò $ˆØ�'Š>Ø�w˜s‘|Ð#Ó#ñ$ùs   ‚-¡-c                 óÄ   — 	 | d   j                  d«      d   j                  «       S # t        t        f$ r Y nw xY w	 | d   S # t        $ r Y nw xY w| j	                  d«      S )zÏ
    Infer the user IP address from various headers. This cannot be used in
    security sensitive situations since the value may be forged from a client,
    but it's good enough for the event payload.
    ÚHTTP_X_FORWARDED_FORú,r   ÚHTTP_X_REAL_IPr~   )rw   ÚstripÚKeyErrorÚ
IndexErrorrA   )rD   s    r-   Úget_client_ipr‰   ¸   sw   € ðØÐ-Ñ.×4Ñ4°SÓ9¸!Ñ<×BÑBÓDÐDøÜ”jÐ!ò ÙðúðØÐ'Ñ(Ð(øÜò Ùðúð �;‰;�}Ó%Ð%s   ‚$' §9¸9½A Á	AÁAc                  ó
  — t        j                  «       } | d   }t        |t        «      xr |j                  dv }|sGt        | t        j                  «       j                  dddœ¬«      \  }}t        j                  ||¬«       | S )z€
    Captures the current exception and sends it to Sentry.
    Returns the ExcInfo tuple to it can be reraised afterwards.
    ru   )r   NrV   F)ÚtypeÚhandled)Úclient_optionsÚ	mechanism)Úhint)
Úsysr,   Ú
isinstanceÚ
SystemExitÚcoder   r`   Ú
get_clientÚoptionsÚcapture_event)r,   ÚeÚshould_skip_captureÚeventr�   s        r-   rk   rk   Ì   sz   € ô �|‰|‹~€HØ�‰€Aô % Q¬
Ó3ÒK¸¿¹À)Ð8KÐÙÜ*ØÜ%×0Ñ0Ó2×:Ñ:Ø%°%Ñ8ô
‰ˆˆtô
 	× Ñ  ¨TÕ2à€Or/   c                   ó&   — e Zd ZdZdZd„ Zd„ Zd„ Zy)rl   aY  
    Users a separate scope for each response chunk.

    This will make WSGI apps more tolerant against:
    - WSGI servers streaming responses from a different thread/from
      different threads than the one that called start_response
    - close() not being called
    - WSGI servers streaming responses interleaved from the same thread
    )Ú	_responseÚ_scopec                 ó    — || _         || _        y r'   )rœ   r›   )r)   rn   rq   s      r-   rR   z_ScopedResponse.__init__ï   s   € àˆŒØ!ˆ�r/   c              #   ó  K  — t        | j                  «      }	 t        | j                  «      5  	 t	        |«      }d d d «       –— Œ/# t
        $ r Y d d d «       y t        $ r t        t        «       Ž  Y Œ:w xY w# 1 sw Y   Œ?xY w­wr'   )	Úiterr›   r   rœ   ÚnextÚStopIterationrj   r   rk   )r)   ÚiteratorÚchunks      r-   Ú__iter__z_ScopedResponse.__iter__ô   s…   è ø€ ä˜Ÿ™Ó'ˆàÜ$ T§[¡[Ó1ñ 3ð3Ü  ›N�E÷3ð ŠKð øô %ò Ø÷	3ð 3ô
 %ò 3ÜÔ/Ó1Ó2ð3ú÷3ð 3üsJ   ‚,B®A9°A»BÁ	A6ÁA9Á	BÁA6Á3A9Á5A6Á6A9Á9BÁ>Bc                 óà   — t        | j                  «      5  	 | j                  j                  «        d d d «       y # t        $ r Y Œt
        $ r t        t        «       Ž  Y Œ.w xY w# 1 sw Y   y xY wr'   )r   rœ   r›   ÚcloseÚAttributeErrorrj   r   rk   )r)   s    r-   r¦   z_ScopedResponse.close  se   € ä  §¡Ó-ñ 	/ð/Ø—‘×$Ñ$Ô&÷	/ð 	/øô "ò ÙÜ ò /ÜÔ+Ó-Ó.ð/ú÷	/ð 	/ús2   –A$˜;»	A!ÁA$ÁA!ÁA$Á A!Á!A$Á$A-N)r0   r1   r2   Ú__doc__rr   rR   r¤   r¦   r(   r/   r-   rl   rl   â   s   „ ñð (€Iò"ò
ó/r/   rl   c                 óú   ‡‡‡‡‡‡— t        | «      Št        | |«      Š| j                  d«      Š| j                  d«      Št        t	        | «      «      Št        t        t        | «      «      «      Šˆˆˆˆˆˆfd„}|S )NÚQUERY_STRINGrW   c                 óþ   •— t        «       5  | j                  di «      }t        «       r&| j                  di «      }‰r|j                  d‰«       ‰	|d<   ‰|d<   ‰|d<   ‰|d<   ‰|d<   d d d «       | S # 1 sw Y   | S xY w)	NrT   ÚuserÚ
ip_addressÚurlÚquery_stringro   ÚenvÚheaders)r   Ú
setdefaultr	   )
r™   r�   Úrequest_infoÚ	user_infoÚ	client_ipr°   r±   ro   r¯   Úrequest_urls
       €€€€€€r-   Úevent_processorz3_make_wsgi_event_processor.<locals>.event_processor#  s–   ø€ ä(Ó*ñ 	.à ×+Ñ+¨I°rÓ:ˆLä&Ô(Ø!×,Ñ,¨V°RÓ8�	ÙØ×(Ñ(¨°yÔAà"-ˆL˜ÑØ+7ˆL˜Ñ(Ø%+ˆL˜Ñ"Ø"%ˆL˜ÑØ&-ˆL˜Ñ#÷	.ð ˆ÷	.ð ˆús   ŒAA2Á2A<)r‰   rI   rA   Údictr�   r   r   )	rD   rE   r·   rµ   r°   r±   ro   r¯   r¶   s	      @@@@@@r-   re   re     sn   ý€ ô ˜gÓ&€IÜ! 'Ð+>Ó?€KØ—;‘;˜~Ó.€LØ�[‰[Ð)Ó*€FÜ
Œ|˜GÓ$Ó
%€CÜœd¤<°Ó#8Ó9Ó:€G÷ñ ð& Ðr/   )zutf-8Úreplace)Fr'   )8r�   Ú	functoolsr   r`   Úsentry_sdk._werkzeugr   r   Úsentry_sdk.apir   Úsentry_sdk.constsr   Úsentry_sdk.scoper	   Ú$sentry_sdk.integrations._wsgi_commonr
   r   r   Úsentry_sdk.sessionsr   r   Úsentry_sdk.tracingr   r   Úsentry_sdk.utilsr   r   r   r   Útypingr   r   r   r   r   r   r   r   r   r   Úsentry_sdk._typesr   r    r!   r"   r#   r%   r^   r;   rI   rK   ri   r�   r‰   rk   rl   re   r(   r/   r-   ú<module>rÅ      sÜ   ðÛ 
Ý ã ß 7Ý )Ý  Ý 4÷ñ õ
 .Ý 0ß D÷ó õ !áÝÝÝÝÝÝÝÝå(ß7áÐ1Ó2ÐÙ!Ð"7Ó8ÐÙ˜-Ó(€Kô˜ô ñ &Ð&FÓGÐ ó6ó
÷F0ñ F0ð\ óFò,$ò"&ò(÷,)/ñ )/óX(r/   