a
    xd+                     @   s  d dl 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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 er.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! d dlm"Z" edZ#edZ$edZ%G dd de Z&edZ'erHd5ddZ(n
d6ddZ(d7d!d"Z)d8d#d$Z*G d%d& d&e+Z,d9d'd(Z-d)d* Z.d+d, Z/d-d. Z0d/d0 Z1G d1d2 d2e+Z2d3d4 Z3dS ):    N)partial)Hub_should_send_default_pii)
ContextVarcapture_internal_exceptionsevent_from_exception)PY2reraise	iteritems)Transaction)auto_session_tracking)_filter_headers)	profiling)MYPY)Callable)Dict)Iterator)Any)Tuple)Optional)TypeVar)Protocol)ExcInfo)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   T/var/www/html/Ranjet/env/lib/python3.9/site-packages/sentry_sdk/integrations/wsgi.py__call__$   s    zStartResponse.__call__)N)__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    r0   c                 C   s   |  d||S )Nlatin1)encoder+   r,   r   r   r$   r0   4   s    Fc                 C   s   |r\d| v r\| d }| d dkr8| dr8|dd }q| d dkr| dr|dd	 }n| d
r| d
 }| d dkr| dr|dd }q| d dkr| dr|dd	 }n<| dr| d }| d | d fdvr|d| d  7 }nd}|S )zEReturn the host for the given WSGI environment. Yanked from Werkzeug.ZHTTP_X_FORWARDED_HOSTwsgi.url_schemehttpz:80Nhttpsz:443Z	HTTP_HOSTSERVER_NAMESERVER_PORT))r6   443)r4   80:unknown)endswithget)environuse_x_forwarded_forrvr   r   r$   get_host9   s$    

rC   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/%sr3   Z	PATH_INFO /)r?   rC   r0   lstrip)r@   rA   r   r   r$   get_request_urlV   s
    rG   c                   @   s"   e Zd ZdZdddZdd ZdS )	SentryWsgiMiddlewareapprA   Fc                 C   s   || _ || _d S r   rI   )r    rJ   rA   r   r   r$   __init__d   s    zSentryWsgiMiddleware.__init__c                 C   s  t dr| ||S t d zttj}t|ddP |( t X | 0}|	  d|_
|t|| j W d    n1 s0    Y  W d    n1 s0    Y  tj|ddd}|j|d	|id
v t||J z| |tt||}W n  ty   tt|  Y n0 W d    n1 s40    Y  W d    n1 sT0    Y  W d    n1 st0    Y  W d    n1 s0    Y  W t d nt d 0 t||S )NFTrequest)Zsession_modewsgizhttp.serverzgeneric WSGI request)opnameZwsgi_environ)Zcustom_sampling_context)_wsgi_middleware_appliedr?   rJ   setr   currentr   r   Zconfigure_scopeZclear_breadcrumbs_nameZadd_event_processor_make_wsgi_event_processorrA   r   Zcontinue_from_environZstart_transactionr   r   _sentry_start_responseBaseExceptionr	   _capture_exception_ScopedResponse)r    r@   Zstart_responsehubZscopetransactionrB   r   r   r$   r%   i   sF    



@zSentryWsgiMiddleware.__call__N)F)r&   r'   r(   	__slots__rK   r%   r   r   r   r$   rH   a   s   
rH   c                 C   sf   t  . t|ddd }|| W d    n1 s:0    Y  |d u rV| ||S | |||S d S )N    r   )r   intsplitZset_http_status)Zold_start_responserZ   r!   r"   r#   Z
status_intr   r   r$   rU      s    (
rU   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).
    r8   r9   REMOTE_ADDRN)r   )r@   keyskeyr   r   r$   _get_environ   s    
rc   c                 c   sn   t | D ]`\}}t|}|drJ|dvrJ|dd dd |fV  q|dv r|dd |fV  qdS )z,
    Returns only proper HTTP headers.

    ZHTTP_)ZHTTP_CONTENT_TYPEZHTTP_CONTENT_LENGTH   N_-)CONTENT_TYPECONTENT_LENGTH)r
   str
startswithr*   title)r@   rb   valuer   r   r$   _get_headers   s     rm   c              	   C   sX   z| d  dd  W S  ttfy.   Y n0 z
| d W S  tyL   Y n0 | 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
IndexErrorr?   )r@   r   r   r$   get_client_ip   s    
rr   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 )Nr]   )r   NrM   F)typeZhandled)Zclient_optionsZ	mechanism)hint)	sysr#   client
isinstance
SystemExitcoder   optionsZcapture_event)rY   r#   eZshould_skip_captureeventrt   r   r   r$   rW      s    

rW   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	rX   )	_response_hubc                 C   s   || _ || _d S r   )r~   r}   )r    rY   responser   r   r$   rK      s    z_ScopedResponse.__init__c              	   c   s   t | j}| j^ zt|}W n@ ty@   Y W d    qY n  ty^   tt| j  Y n0 W d    n1 st0    Y  |V  q
d S r   )iterr}   r~   nextStopIterationrV   r	   rW   )r    iteratorchunkr   r   r$   __iter__   s    
2z_ScopedResponse.__iter__c              	   C   sj   | j P z| j  W n0 ty(   Y n  tyF   tt| j   Y n0 W d    n1 s\0    Y  d S r   )r~   r}   closeAttributeErrorrV   r	   rW   )r    r   r   r$   r     s    z_ScopedResponse.closeN)r&   r'   r(   r[   rK   r   r   r   r   r   r$   rX      s   rX   c                    s\   t |  t| || d| dtt| ttt|  fdd}|S )NQUERY_STRINGREQUEST_METHODc                    s   t  f | di }t r6| di } r6|d  |d< |d< |d< |d< |d< W d    n1 sr0    Y  | S )	NrL   user
ip_addressurlquery_stringmethodenvheaders)r   
setdefaultr   )r|   rt   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)rr   rG   r?   dictrc   r   rm   )r@   rA   r   r   r   r$   rT     s    


rT   )r)   r*   )r)   r*   )F)F)N)4ru   Zsentry_sdk._functoolsr   Zsentry_sdk.hubr   r   Zsentry_sdk.utilsr   r   r   Zsentry_sdk._compatr   r	   r
   Zsentry_sdk.tracingr   Zsentry_sdk.sessionsr   Z$sentry_sdk.integrations._wsgi_commonr   Zsentry_sdk.profilerr   Zsentry_sdk._typesr   typingr   r   r   r   r   r   r   r   r   r   r   r   r   r   rP   r0   rC   rG   objectrH   rU   rc   rm   rr   rW   rX   rT   r   r   r   r$   <module>   sN   


7 
"