o
    Zhb%                     @   s  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
 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 d d
lmZmZ d dlmZ d dlmZ erd 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 de%Z,edZ-erd3dd Z.nd3d!d Z.d4d#d$Z/G d%d& d&e0Z1	d5d'd(Z2d)d* Z3d+d, Z4d-d. Z5G d/d0 d0e0Z6d1d2 Z7dS )6    N)PY2reraise)partial)TYPE_CHECKING)get_host_get_headers)continue_trace)OP)Hub_should_send_default_pii)
ContextVarcapture_internal_exceptionsevent_from_exception)TransactionTRANSACTION_SOURCE_ROUTE)auto_session_tracking)_filter_headers)Callable)Dict)Iterator)Any)Tuple)Optional)TypeVar)Protocol)ExcInfo)EventEventProcessorWsgiResponseIterWsgiResponseHeadersWsgiExcInfoc                   @   s   e Zd ZdddZdS )StartResponseNc                 C   s   d S N )selfstatusresponse_headersexc_infor#   r#   S/var/www/html/lang_env/lib/python3.10/site-packages/sentry_sdk/integrations/wsgi.py__call__%   s   zStartResponse.__call__r"   )__name__
__module____qualname__r)   r#   r#   r#   r(   r!   $   s    r!   Zsentry_wsgi_middleware_appliedutf-8replacec                 C   s   |  ||S r"   )decodescharseterrorsr#   r#   r(   wsgi_decoding_dance/   s   r4   c                 C   s   |  d||S )Nlatin1)encoder/   r0   r#   r#   r(   r4   5   s   Fc                 C   s.   d|  dt| |t|  dpddf S )zPReturn the absolute URL without query string for the given WSGI
    environment.z
%s://%s/%szwsgi.url_schemeZ	PATH_INFO /)getr   r4   lstrip)environuse_x_forwarded_forr#   r#   r(   get_request_url:   s
   r=   c                   @   s"   e Zd ZdZdddZdd ZdS )	SentryWsgiMiddlewareappr<   Fc                 C      || _ || _d S r"   r?   )r$   r@   r<   r#   r#   r(   __init__H      
zSentryWsgiMiddleware.__init__c                 C   s  t dr| ||S t d zttj}t|dd |} t , | }|	  d|_
|t|| j W d    n1 sCw   Y  W d    n1 sRw   Y  t|tjdtd}|j|d|id	$ z| |tt||}W n ty   tt|  Y nw W d    n1 sw   Y  W d    n1 sw   Y  W d    n1 sw   Y  W t d nt d w t||S )
NFTrequest)Zsession_modewsgizgeneric WSGI request)opnamesourceZwsgi_environ)Zcustom_sampling_context)_wsgi_middleware_appliedr9   r@   setr
   currentr   r   Zconfigure_scopeZclear_breadcrumbs_nameZadd_event_processor_make_wsgi_event_processorr<   r   r	   ZHTTP_SERVERr   Zstart_transactionr   _sentry_start_responseBaseExceptionr   _capture_exception_ScopedResponse)r$   r;   Zstart_responsehubscopetransactionrvr#   r#   r(   r)   M   s^   




 
zSentryWsgiMiddleware.__call__NF)r*   r+   r,   	__slots__rB   r)   r#   r#   r#   r(   r>   E   s    
r>   c                 C   sb   t   t|ddd }|| W d    n1 sw   Y  |d u r+| ||S | |||S )N    r   )r   intsplitZset_http_status)Zold_start_responserT   r%   r&   r'   Z
status_intr#   r#   r(   rN   z   s   
rN   c                 c   s>    ddg}t  r|dg7 }|D ]}|| v r|| | fV  qdS )z
    Returns our explicitly included environment variables we want to
    capture (server name, port and remote addr if pii is enabled).
    ZSERVER_NAMEZSERVER_PORTREMOTE_ADDRN)r   )r;   keyskeyr#   r#   r(   _get_environ   s   
r_   c              	   C   sX   z| d  dd  W S  ttfy   Y nw z| d W S  ty&   Y n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.
    ZHTTP_X_FORWARDED_FOR,r   ZHTTP_X_REAL_IPr\   )r[   stripKeyError
IndexErrorr9   )r;   r#   r#   r(   get_client_ip   s   

rd   c                 C   s`   t  }| jd ur.|d }t|to|jdv }|s.t|| jjdddd\}}| j||d |S )NrY   )r   NrE   F)typeZhandled)Zclient_optionsZ	mechanism)hint)	sysr'   client
isinstance
SystemExitcoder   optionsZcapture_event)rR   r'   eZshould_skip_captureeventrf   r#   r#   r(   rP      s   

rP   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	rQ   )	_response_hubc                 C   rA   r"   )rp   ro   )r$   rR   responser#   r#   r(   rB      rC   z_ScopedResponse.__init__c              	   c   s    t | j}	 | j. zt|}W n ty!   Y W d    d S  ty0   tt| j  Y nw W d    n1 s;w   Y  |V  qr"   )iterro   rp   nextStopIterationrO   r   rP   )r$   iteratorchunkr#   r#   r(   __iter__   s    
z_ScopedResponse.__iter__c              	   C   s   | j 9 z| j  W n ty   Y n ty#   tt| j   Y nw W d    d S W d    d S W d    d S 1 s?w   Y  d S r"   )rp   ro   closeAttributeErrorrO   r   rP   )r$   r#   r#   r(   rx      s   "z_ScopedResponse.closeN)r*   r+   r,   rW   rB   rw   rx   r#   r#   r#   r(   rQ      s
    rQ   c                    s\   t |  t| || d| dtt| ttt|  fdd}|S )NZQUERY_STRINGREQUEST_METHODc                    s   t  4 | di }t r| di } r|d  |d< |d< |d< |d< |d< W d    | S 1 s:w   Y  | S )	NrD   user
ip_addressurlquery_stringmethodenvheaders)r   
setdefaultr   )rn   rf   Zrequest_infoZ	user_infoZ	client_ipr   r   r   r~   request_urlr#   r(   event_processor   s   

z3_make_wsgi_event_processor.<locals>.event_processor)rd   r=   r9   dictr_   r   r   )r;   r<   r   r#   r   r(   rM      s   


rM   )r-   r.   rV   r"   )8rg   Zsentry_sdk._compatr   r   Zsentry_sdk._functoolsr   Zsentry_sdk._typesr   Zsentry_sdk._werkzeugr   r   Zsentry_sdk.apir   Zsentry_sdk.constsr	   Zsentry_sdk.hubr
   r   Zsentry_sdk.utilsr   r   r   Zsentry_sdk.tracingr   r   Zsentry_sdk.sessionsr   Z$sentry_sdk.integrations._wsgi_commonr   typingr   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   rI   r4   r=   objectr>   rN   r_   rd   rP   rQ   rM   r#   r#   r#   r(   <module>   sP    

:
"