
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<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    
!