<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
U
    \                     @   s   d dl Z d dlmZmZ d dlmZmZ d dlmZm	Z	 d dl
mZ erTddd	Zn
dd
d	Zdd Zdd ZG dd deZdd Zdd Zdd Zdd ZG dd deZdd ZdS )    N)Hub_should_send_default_pii)capture_internal_exceptionsevent_from_exception)PY2reraise)_filter_headersutf-8replacec                 C   s   |  ||S N)decodescharseterrors r   M/opt/alt/python38/lib/python3.8/site-packages/sentry_sdk/integrations/wsgi.pywsgi_decoding_dance   s    r   c                 C   s   |  d||S )Nlatin1)encoder   r   r   r   r   r      s    c                 C   s   |  drZ| d }| d dkr6|dr6|dd }q| d dkr|dr|dd	 }n<|  d
r| d
 }| d | d fdkr|d| d  7 }nd}|S )zEReturn the host for the given WSGI environment. Yanked from Werkzeug.Z	HTTP_HOSTwsgi.url_schemehttpz:80Nhttpsz:443SERVER_NAMESERVER_PORT))r   Z443)r   Z80:unknown)getendswith)environrvr   r   r   get_host"   s    

r#   c                 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/%sr   Z	PATH_INFO /)r   r#   r   lstripr!   r   r   r   get_request_url9   s
    r(   c                   @   s    e Zd ZdZdd Zdd ZdS )SentryWsgiMiddlewareappc                 C   s
   || _ d S r   r*   )selfr+   r   r   r   __init__G   s    zSentryWsgiMiddleware.__init__c                 C   s   t t j}|z t 6 | "}|  d|_|t| W 5 Q R X W 5 Q R X z| ||}W n  t	k
r   t
t|  Y nX W 5 Q R X t||S )Nwsgi)r   currentr   Zconfigure_scopeZclear_breadcrumbs_nameZadd_event_processor_make_wsgi_event_processorr+   	Exceptionr   _capture_exception_ScopedResponse)r,   r!   Zstart_responsehubZscoper"   r   r   r   __call__K   s    

"zSentryWsgiMiddleware.__call__N)__name__
__module____qualname__	__slots__r-   r6   r   r   r   r   r)   D   s   r)   c                 c   s6   d}t  r|d7 }|D ]}|| kr|| | fV  qdS )z8
    Returns our whitelisted environment variables.
    )r   r   )REMOTE_ADDRN)r   )r!   keyskeyr   r   r   _get_environ^   s    r>   c                 c   sn   |   D ]`\}}t|}|drJ|dkrJ|dd dd |fV  q|dkr|dd |fV  qdS )z,
    Returns only proper HTTP headers.

    ZHTTP_)ZHTTP_CONTENT_TYPEZHTTP_CONTENT_LENGTH   N_-)ZCONTENT_TYPEZCONTENT_LENGTH)itemsstr
startswithr
   title)r!   r=   valuer   r   r   _get_headersp   s     rG   c              	   C   s@   z| d  dd  W S  ttfk
r:   | d Y S X dS )z
    Naively yank the first IP address in an X-Forwarded-For header
    and assume this is correct.

    Note: Don't use this in security sensitive situations since this
    value may be forged from a client.
    ZHTTP_X_FORWARDED_FOR,r   r;   N)splitstripKeyError
IndexErrorr   r'   r   r   r   get_client_ip   s    	rM   c                 C   s@   | j d k	r<t }t|| j jdddd\}}| j||d |S )Nr.   F)typeZhandled)Zclient_optionsZ	mechanism)hint)Zclientsysexc_infor   optionsZcapture_event)r5   rQ   eventrO   r   r   r   r3      s    

r3   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	r4   )	_response_hubc                 C   s   || _ || _d S r   )rU   rT   )r,   r5   Zresponser   r   r   r-      s    z_ScopedResponse.__init__c              	   c   sx   t | j}| jV zt|}W nB tk
r@   Y W 5 Q R  qtY n" tk
r`   tt| j  Y nX W 5 Q R X |V  q
d S r   )iterrT   rU   nextStopIterationr2   r   r3   )r,   iteratorchunkr   r   r   __iter__   s    
z_ScopedResponse.__iter__c              	   C   sZ   | j J z| j  W n4 tk
r*   Y n" tk
rJ   tt| j   Y nX W 5 Q R X d S r   )rU   rT   closeAttributeErrorr2   r   r3   )r,   r   r   r   r\      s    z_ScopedResponse.closeN)r7   r8   r9   r:   r-   r[   r\   r   r   r   r   r4      s   r4   c                    sZ   t |  t| | d| dtt| ttt|  fdd}|S )NZQUERY_STRINGZREQUEST_METHODc              	      sd   t  T | di }t r.| di } |d< |d< |d< |d< |d< |d< W 5 Q R X | S )	NZrequestuserZ
ip_addressZurlquery_stringmethodenvheaders)r   
setdefaultr   )rS   rO   Zrequest_infoZ	user_infoZ	client_ipra   rb   r`   r_   Zrequest_urlr   r   event_processor   s    z3_make_wsgi_event_processor.<locals>.event_processor)rM   r(   r   dictr>   r   rG   )r!   re   r   rd   r   r1      s    

r1   )r	   r
   )r	   r
   )rP   Zsentry_sdk.hubr   r   Zsentry_sdk.utilsr   r   Zsentry_sdk._compatr   r   Z$sentry_sdk.integrations._wsgi_commonr   CallableZDictZListIteratorZAnyZTupleZOptionalZExcInfor   r#   r(   objectr)   r>   rG   rM   r3   r4   r1   r   r   r   r   <module>   s    
!