
    tni)                         d dl Z d dlm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mZmZ d dlmZ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 erQd dlmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z% d dl&m'Z'm(Z( d dlm)Z)  e%d          Z* e%d          Z+ e%d          Z, G d de#          Z- ed          Z.d5de/de/de/de/fdZ0	 d6ddde1de/fd Z2 G d! d"          Z3	 d7d#dd$d%d&e/d'dd(d)ddfd*Z4d8d,Z5d9d.Z6d:d0Z7 G d1 d2          Z8ddde1dd3fd4Z9dS );    N)partial)TYPE_CHECKING)_get_headersget_host)continue_trace)OP)DEFAULT_HTTP_METHODS_TO_CAPTURE_filter_headersnullcontext)should_send_default_piiuse_isolation_scope)track_session)TransactionTransactionSource)
ContextVarcapture_internal_exceptionsevent_from_exceptionreraise)AnyCallableDictIteratorOptionalProtocolTupleTypeVar)EventEventProcessor)ExcInfoWsgiResponseIterWsgiResponseHeadersWsgiExcInfoc            	       *    e Zd Z	 d
deddddddfd	ZdS )StartResponseNstatusresponse_headersr!   exc_infoOptional[WsgiExcInfo]returnr    c                     d S N )selfr%   r&   r'   s       Y/var/www/html/gpu-tools/venv/lib/python3.11/site-packages/sentry_sdk/integrations/wsgi.py__call__zStartResponse.__call__#   s	     D    r+   )__name__
__module____qualname__strr/   r,   r0   r.   r$   r$   "   sX        
 15		 		 4	 .		
  	 	 	 	 	 	r0   r$   sentry_wsgi_middleware_appliedutf-8replacescharseterrorsr)   c                 T    |                      d                              ||          S )Nlatin1)encodedecode)r8   r9   r:   s      r.   wsgi_decoding_dancer?   /   s$    88H$$Wf555r0   FenvironDict[str, str]use_x_forwarded_forc                 J   |                      dd                              d          }|                      dd                              d          }| d| }|                      d          dt          | |          dt	          |                              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?   )r@   rB   script_name	path_infopaths        r.   get_request_urlrN   3   s    
 ++mR0077<<KK,,33C88I''I''D 	%&&&&-....D!!((--- r0   c                   J    e Zd ZdZddefdddededd	d
df
dZ	 	 	 	 	 	 ddZdS )SentryWsgiMiddlewareapprB   span_originhttp_methods_to_captureFmanualrR   z3Callable[[Dict[str, str], Callable[..., Any]], Any]rB   rS   rT   zTuple[str, ...]r)   Nc                 >    || _         || _        || _        || _        d S r+   rQ   )r-   rR   rB   rS   rT   s        r.   __init__zSentryWsgiMiddleware.__init__K   s)     #6 &'>$$$r0   r@   rA   start_responseCallable[..., Any]_ScopedResponsec                    t                               d          r|                     ||          S t                               d           	 t	          j                    5 }t          |d          5  t                      5  |                                 d|_	        |
                    t          || j                             d d d            n# 1 swxY w Y   |                    dd                                          }d }|| j        v r-t          |t           j        dt$          j        | j        	          }|t	          j        |d
|i          nt-                      }|5  	 |                     |t/          t0          ||                    }n%# t2          $ r t5          t7                        Y nw xY wd d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   t                               d           n# t                               d           w xY wt9          ||          S )NFTrequest)session_modewsgiREQUEST_METHODrE   zgeneric WSGI request)opnamesourceoriginwsgi_environ)custom_sampling_context)_wsgi_middleware_appliedrH   rR   set
sentry_sdkisolation_scoper   r   clear_breadcrumbs_nameadd_event_processor_make_wsgi_event_processorrB   upperrT   r   r   HTTP_SERVERr   ROUTErS   start_transactionr   r   _sentry_start_responseBaseExceptionr   _capture_exceptionrZ   )r-   r@   rX   scopemethodtransactiontransaction_contextresponses           r.   r/   zSentryWsgiMiddleware.__call__W   s\    $''.. 	588G^444 $$T****	0+-- ';"5yAAA &; &;466  //111&,116 ')A                  %[[)92>>DDFFF"&K!===&4#!~!7#4#:#'#3' ' ' '2	 #4'5CW4M   
 )]] ( - 	; 	;;'+xx ' '$:NK!" !"( (HH  - ; ; ;#%7%9%9::::;	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	;;&; &; &; &; &; &; &; &; &; &; &; &; &; &; &;'; '; '; '; '; '; '; '; '; '; '; '; '; '; ';R %((////$((////uh///s   H G11G ACGCGCBG%G'*FGF4	1G3F4	4G7GGG
GGG1G	G1!G	"G1%H 1G55H 8G59H H3)r@   rA   rX   rY   r)   rZ   )	r1   r2   r3   	__slots__r	   boolr4   rW   r/   r,   r0   r.   rP   rP   C   s        I %*#5T
? 
?B
? "
? 	
?
 "3
? 

? 
? 
? 
?30'309M30	30 30 30 30 30 30r0   rP   old_start_responserw   zOptional[Transaction]r%   r&   r'   r(   c                    t                      5  t          |                    dd          d                   }||                    |           d d d            n# 1 swxY w Y   | | ||          S  | |||          S )N    r   )r   intsplitset_http_status)r|   rw   r%   r&   r'   
status_ints         r.   rr   rr      s     
%	&	& 4 4c1--a011
"''
3334 4 4 4 4 4 4 4 4 4 4 4 4 4 4
  "!&*:;;;!!&*:HEEEs   AAA #A Iterator[Tuple[str, str]]c              #   d   K   ddg}t                      r|dgz  }|D ]}|| v r|| |         fV  dS )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_ADDRN)r   )r@   keyskeys      r.   _get_environr      sf      
 =)D     	 $ $'>>ws|####$ $r0   Optional[Any]c                     	 | d                              d          d                                         S # t          t          f$ r Y nw xY w	 | d         S # t          $ r Y nw xY w|                     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   )r   stripKeyError
IndexErrorrH   )r@   s    r.   get_client_ipr      s    -.44S99!<BBDDDj!   '((    ;;}%%%s!   25 A	A	A 
A"!A"r   c                     t          j                    } | d         }t          |t                    o|j        dv }|sDt          | 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.
    r   )r   Nr^   F)typehandled)client_options	mechanism)hint)
sysr'   
isinstance
SystemExitcoder   rh   
get_clientoptionscapture_event)r'   eshould_skip_captureeventr   s        r.   rt   rt      s    
 |~~HA %Q
33K)8K 3*%022:%%88
 
 
t
 	 T2222Or0   c                   :    e Zd ZdZdZ	 	 	 	 	 	 dd	Zdd
ZddZdS )rZ   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_scoperu   sentry_sdk.scope.Scopery   Iterator[bytes]r)   Nc                 "    || _         || _        d S r+   )r   r   )r-   ru   ry   s      r.   rW   z_ScopedResponse.__init__   s     !r0   c              #   ,  K   t          | j                  }	 t          | j                  5  	 t	          |          }n<# t
          $ r Y d d d            d S t          $ r t          t                        Y nw xY wd d d            n# 1 swxY w Y   |V  ~r+   )	iterr   r   r   nextStopIterationrs   r   rt   )r-   iteratorchunks      r.   __iter__z_ScopedResponse.__iter__   s     ''		$T[11 3 33 NNEE$   	3 3 3 3 3 3 3 3
 % 3 3 3/11222233 3 3 3 3 3 3 3 3 3 3 3 3 3 3 KKK		s=   B>B
A7BA74B6A77BB
B
c                     t          | j                  5  	 | j                                         n0# t          $ r Y n$t
          $ r t          t                        Y nw xY wd d d            d S # 1 swxY w Y   d S r+   )r   r   r   closeAttributeErrorrs   r   rt   )r-   s    r.   r   z_ScopedResponse.close   s     -- 	/ 	//$$&&&&!     / / /+--..../	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/s;   A.1A.
AA.AA.AA..A25A2)ru   r   ry   r   r)   N)r)   r   )r)   N)r1   r2   r3   __doc__rz   rW   r   r   r,   r0   r.   rZ   rZ      sy          (I"-"9J"	" " " "   / / / / / /r0   rZ   r   c                 D   t          |           t          | |          |                     d          |                     d          t          t	          |                     t          t          t          |                               d	fd}|S )
NQUERY_STRINGr_   r   r   r   Dict[str, Any]r)   c                 *   t                      5  |                     di           }t                      r.|                     di           }r|                    d           	|d<   |d<   |d<   |d<   |d<   d d d            n# 1 swxY w Y   | S )	Nr\   user
ip_addressurlquery_stringrv   envheaders)r   
setdefaultr   )
r   r   request_info	user_info	client_ipr   r   rv   r   request_urls
       r.   event_processorz3_make_wsgi_event_processor.<locals>.event_processor  s    (** 	. 	. ++Ir::L&(( B!,,VR88	 B((yAAA"-L+7L(%+L""%L&-L#	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. s   A,BBB)r   r   r   r   r)   r   )r   rN   rH   dictr   r
   r   )	r@   rB   r   r   r   r   rv   r   r   s	      @@@@@@r.   rm   rm     s     g&&I!'+>??K;;~..L[[)**F
|G$$
%
%Cd<#8#899::G          $ r0   )r6   r7   )Fr+   )r@   rA   r)   r   )r@   rA   r)   r   )r)   r   ):r   	functoolsr   typingr   rh   sentry_sdk._werkzeugr   r   sentry_sdk.apir   sentry_sdk.constsr   $sentry_sdk.integrations._wsgi_commonr	   r
   r   sentry_sdk.scoper   r   sentry_sdk.sessionsr   sentry_sdk.tracingr   r   sentry_sdk.utilsr   r   r   r   r   r   r   r   r   r   r   r   sentry_sdk._typesr   r   r   r    r!   r"   r$   rf   r4   r?   r{   rN   rP   rr   r   r   rt   rZ   rm   r,   r0   r.   <module>r      s   



                       7 7 7 7 7 7 7 7 ) ) ) ) ) )                     
 J I I I I I I I - - - - - - = = = = = = = =             XXXXXXXXXXXXXXXXXXXX77777777((((((w122!'"788'-((K        &:&FGG 6 63 6 6 6TW 6 6 6 6
 <A 48    G0 G0 G0 G0 G0 G0 G0 G0^ )-F F'F(F F ,	F
 &F F F F F*$ $ $ $ & & & &&   *(/ (/ (/ (/ (/ (/ (/ (/V((48(( ( ( ( ( (r0   