o
    ZhG-                     @   s  d dl Z d dl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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 d dlmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z% z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/ W n e0y   edw d dl1m2Z2 e2rd dl3m4Z4 d dl5m6Z6 d dl'm7Z7m8Z8 d dl9m: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l1mAZAmBZB dZCG dd deZDdd  ZEd!d" ZFd#d$ ZGd%ZHd&d' ZIdS )(    N)continue_trace)reraise)OPSPANDATA)Hub)IntegrationDidNotEnable)ignore_logger)auto_session_tracking)_filter_headersrequest_body_within_bounds)BAGGAGE_HEADER_NAMESOURCE_FOR_STYLETRANSACTION_SOURCE_ROUTE)should_propagate_trace)
capture_internal_exceptionsevent_from_exceptionlogger	parse_urlparse_versiontransaction_from_functionHAS_REAL_CONTEXTVARSCONTEXTVARS_ERROR_MESSAGESENSITIVE_DATA_SUBSTITUTEAnnotatedValue)__version__)ClientSessionTraceConfig)ApplicationHTTPExceptionUrlDispatcherzAIOHTTP not installed)TYPE_CHECKING)Request)UrlMappingMatchInfo)TraceRequestStartParamsTraceRequestEndParams)SimpleNamespace)Any)Optional)Tuple)Union)ExcInfo)EventEventProcessor)handler_namemethod_and_path_patternc                   @   s&   e Zd ZdZdddZedd ZdS )	AioHttpIntegrationaiohttpr.   c                 C   s"   |t vrtd|t f || _d S )Nz7Invalid value for transaction_style: %s (must be in %s))TRANSACTION_STYLE_VALUES
ValueErrortransaction_style)selfr4    r6   V/var/www/html/lang_env/lib/python3.10/site-packages/sentry_sdk/integrations/aiohttp.py__init__A   s   
zAioHttpIntegration.__init__c                     s   t t} | d u rtdt| dk rtdtstdt td tjfdd}|t_t	j
fdd	}|t	_
tj  fd
d}|t_d S )NzUnparsable AIOHTTP version: {})      zAIOHTTP 3.4 or newer required.zSThe aiohttp integration for Sentry requires Python 3.7+  or aiocontextvars package.zaiohttp.serverc                    s  t j}|td u r | |g|R i |I d H S t|}t |}t|dd | }|  |	t
| W d    n1 sEw   Y  t|j}t|tjdtd}|j|d|idY z
 | |I d H }	W n0 ty }
 z||
j  d }
~
w tjtfy   |d   ty   tt|  Y nw ||	j |	W  d    W  d    W  d    S 1 sw   Y  W d    n1 sw   Y  W d    d S W d    d S 1 sw   Y  d S )Nrequest)Zsession_modezgeneric AIOHTTP request)opnamesourceZaiohttp_request)Zcustom_sampling_contextZ	cancelled)r   currentget_integrationr0   weakrefrefr
   configure_scopeZclear_breadcrumbsZadd_event_processor_make_request_processordictheadersr   r   ZHTTP_SERVERr   Zstart_transactionr   set_http_statusstatus_codeasyncioZCancelledErrorConnectionResetErrorZ
set_status	Exceptionr   _capture_exceptionstatus)r5   r;   argskwargshubweak_requestscoperF   Ztransactionresponsee)
old_handler6   r7   sentry_app_handleb   sX   




"z8AioHttpIntegration.setup_once.<locals>.sentry_app_handlec           	         s    | |I d H }t j}|t}d }z'|jdkrt|j}n|jdkr9| }|dp1|d}d	|j
|}W n	 tyC   Y nw |d urht j }|j|t|j d W d    |S 1 scw   Y  |S )Nr.   r/   path	formatterz{} {})r>   )r   r?   r@   r0   r4   r   handlerget_infogetformatmethodrK   rC   Zset_transaction_namer   )	r5   r;   rvrP   Zintegrationr=   Z
route_infopatternrR   )old_urldispatcher_resolver6   r7   sentry_urldispatcher_resolve   s4   



zCAioHttpIntegration.setup_once.<locals>.sentry_urldispatcher_resolvec                     sZ   t j}|td u r | i |S t|dpd}t }|| ||d<  | i |S )NZtrace_configsr6   )r   r?   r@   r0   listr[   create_trace_configappend)rN   rO   rP   Zclient_trace_configstrace_config)old_client_session_initr6   r7   init   s   
z+AioHttpIntegration.setup_once.<locals>.init)r   AIOHTTP_VERSIONr   r\   r   r   r	   r   Z_handler    resolver   r8   )versionrV   ra   rg   r6   )rf   rU   r`   r7   
setup_onceJ   s*   -
zAioHttpIntegration.setup_onceN)r.   )__name__
__module____qualname__
identifierr8   staticmethodrk   r6   r6   r6   r7   r0   >   s
    
	r0   c                  C   s2   dd } dd }t  }|j|  |j| |S )Nc           	         sB  t j}|td u rd S |j }d }t  tt|j	dd}W d    n1 s+w   Y  |j
tjd||r;|j	ntf d}|tj| |d urc|d|j	 |tj|j |tj|j t|t|j	r||D ]+\}}tdj|||j	d |tkr|jtr|j|  d| 7  < qp||j|< qp||_d S )	NF)sanitizez%s %s)r<   descriptionurlzE[Tracing] Adding `{key}` header {value} to outgoing request to {url}.)keyvaluers   ,)r   r?   r@   r0   r]   upperr   r   strrs   Z
start_spanr   ZHTTP_CLIENTr   set_datar   ZHTTP_METHODZ
HTTP_QUERYqueryZHTTP_FRAGMENTfragmentr   Ziter_trace_propagation_headersr   debugr\   r   rF   r[   span)	sessiontrace_config_ctxparamsrP   r]   
parsed_urlr}   rt   ru   r6   r6   r7   on_request_start   sB   

z-create_trace_config.<locals>.on_request_startc                    sD   |j d u rd S |j }|t|jj |d|jj |  d S )Nreason)r}   rG   intrS   rM   ry   r   finish)r~   r   r   r}   r6   r6   r7   on_request_end   s   
z+create_trace_config.<locals>.on_request_end)r   r   rd   r   )r   r   re   r6   r6   r7   rc      s   (
rc   c                    s    fdd}|S )Nc                    s     }|d u r	| S t  ? | di }d|j|j|jf |d< |j|d< |j|d< d|ji|d< tj	}t
t|j|d< t|||d	< W d    | S 1 sNw   Y  | S )
Nr;   z	%s://%s%srs   query_stringr]   ZREMOTE_ADDRenvrF   data)r   
setdefaultschemehostrW   r   r]   remoter   r?   r   rE   rF   get_aiohttp_request_data)eventhintr;   Zrequest_inforP   rQ   r6   r7   aiohttp_processor  s(   



z2_make_request_processor.<locals>.aiohttp_processorr6   )rQ   r   r6   r   r7   rD      s    rD   c                 C   s6   t  }t|| jjdddd\}}| j||d |S )Nr1   F)typeZhandled)Zclient_optionsZ	mechanism)r   )sysexc_infor   clientoptionsZcapture_event)rP   r   r   r   r6   r6   r7   rL   $  s   
rL   z8[Can't show request body due to implementation details.]c                 C   sJ   |j }|d urt| jt|st S |jpd}||dS |jr#t	S d S )Nzutf-8replace)
Z_read_bytesr   r   lenr   Zremoved_because_over_size_limitcharsetdecodeZcan_read_bodyBODY_NOT_READ_MESSAGE)rP   r;   Z
bytes_bodyencodingr6   r6   r7   r   3  s   
r   )Jr   rA   Zsentry_sdk.apir   Zsentry_sdk._compatr   Zsentry_sdk.constsr   r   Zsentry_sdk.hubr   Zsentry_sdk.integrationsr   r   Zsentry_sdk.integrations.loggingr	   Zsentry_sdk.sessionsr
   Z$sentry_sdk.integrations._wsgi_commonr   r   Zsentry_sdk.tracingr   r   r   Zsentry_sdk.tracing_utilsr   Zsentry_sdk.utilsr   r   r   r   r   r   r   r   r   r   rI   r1   r   rh   r   r   Zaiohttp.webr   r   r    ImportErrorZsentry_sdk._typesr!   Zaiohttp.web_requestr"   Zaiohttp.web_urldispatcherr#   r$   r%   typesr&   typingr'   r(   r)   r*   r+   r,   r-   r2   r0   rc   rD   rL   r   r   r6   r6   r6   r7   <module>   sR    0 <%