o
    ٰi,                  	   @   s  d dl Z d dlZd dlmZ d dl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mZmZ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 zd dlmZ  d dl!m"Z"m#Z# d dl$m%Z% W n e&yu   edw 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/m0Z0 G dd deZ1ej2d+ddZ3ee1de4de5d d!ddfd"d#Z6	$	%		&d,d'd(Z7G d)d* d*eZ8dS )-    N)iscoroutinefunction)continue_trace)OP)should_send_default_pii)TransactionSource)HAS_REAL_CONTEXTVARSCONTEXTVARS_ERROR_MESSAGEensure_integration_enabledevent_from_exceptioncapture_internal_exceptionstransaction_from_function)_check_minimum_versionIntegrationDidNotEnable)RequestExtractor_filter_headers_is_json_content_type)ignore_logger)version_info)RequestHandler	HTTPError)	coroutinezTornado not installed)TYPE_CHECKING)Any)Optional)Dict)Callable)	Generator)EventEventProcessorc                   @   s(   e Zd ZdZde ZedddZdS )TornadoIntegrationtornadoz
auto.http.returnNc                     s   t tt tstdt td tj t	 } | r*								d fd	d
}nt
								d fdd
}|t_tjdddtdtddddddddffdd}|t_d S )NzUThe tornado integration for Sentry requires Python 3.7+ or the aiocontextvars packageztornado.accessselfr   argsr   kwargsr"   c                    sJ   t |   | g|R i |I d H W  d    S 1 sw   Y  d S N_handle_request_impl)r#   r$   r%   old_execute S/home/ubuntu/.local/lib/python3.10/site-packages/sentry_sdk/integrations/tornado.pysentry_execute_request_handlerF   s   
$zETornadoIntegration.setup_once.<locals>.sentry_execute_request_handlerc                 ?   sN    t |   | g|R i |E d H }|W  d    S 1 s w   Y  d S r&   r'   )r#   r$   r%   resultr)   r+   r,   r-   N   s
   
$tyvaluetbzOptional[Any]c                    s(   t |||  | |||g|R i |S r&   )_capture_exception)r#   r/   r0   r1   r$   r%   )old_log_exceptionr+   r,   sentry_log_exceptionZ   s   z;TornadoIntegration.setup_once.<locals>.sentry_log_exception)r#   r   r$   r   r%   r   r"   r   )r   r    TORNADO_VERSIONr   r   r   r   r   _executer   r   log_exceptiontypeBaseException)	awaitabler-   r4   r+   )r*   r3   r,   
setup_once1   s`   

zTornadoIntegration.setup_once)r"   N)__name__
__module____qualname__
identifieroriginstaticmethodr;   r+   r+   r+   r,   r    -   s
    
r    r#   r   r"   Generator[None, None, None]c              	   c   s    t  t}|d u rd V  t| }t  K}| jj}|	  t
|}|| t|tjdtjtjd}t j|d| jid d V  W d    n1 sNw   Y  W d    d S W d    d S 1 sfw   Y  d S )Nzgeneric Tornado request)opnamesourcer@   tornado_request)custom_sampling_context)
sentry_sdk
get_clientget_integrationr    weakrefrefisolation_scoperequestheadersclear_breadcrumbs_make_event_processoradd_event_processorr   r   HTTP_SERVERr   ROUTEr@   start_transaction)r#   integrationweak_handlerscoperO   	processortransactionr+   r+   r,   r(   h   s2   



"r(   r/   r0   r1   r   c                 C   sD   t |trd S t| ||ft jdddd\}}tj||d d S )Nr!   F)r8   handled)client_options	mechanism)hint)
isinstancer   r
   rH   rI   optionscapture_event)r/   r0   r1   eventr^   r+   r+   r,   r2      s   

r2   rW   Callable[[], RequestHandler]r   c                    s   d fdd}|S )	Nrb   r   r^   dict[str, Any]r"   c                    s>    }|d u r	| S |j }t   t||j j }t|pd| d< dtji| d< W d    n1 s2w   Y  t ; t|}|	|  | d }d|j
|j|jf |d< |j|d< |j|d	< d
|ji|d< tt|j|d< W d    n1 sxw   Y  t rz|j}W n ty   d }Y nw |r| di dd | S )N rZ   rE   transaction_inforN   z	%s://%s%surlquery_stringmethodREMOTE_ADDRenvrO   useris_authenticatedT)rN   r   getattrri   lowerr   r   	COMPONENTTornadoRequestExtractorextract_into_eventprotocolhostpathquery	remote_ipr   dictrO   r   current_user	Exception
setdefault)rb   r^   handlerrN   ri   	extractorrequest_infory   rW   r+   r,   tornado_processor   s@   




z0_make_event_processor.<locals>.tornado_processor)rb   r   r^   rd   r"   r   r+   )rW   r   r+   r   r,   rQ      s   (rQ   c                   @   sf   e Zd ZdefddZdddZdefddZdd
dZde	fddZ
dddZdddefddZdS )rq   r"   c                 C   s   | j jd u rdS t| j jS )Nr   )rN   bodylenr#   r+   r+   r,   content_length   s   z&TornadoRequestExtractor.content_lengthDict[str, str]c                 C      dd | j j D S )Nc                 S   s   i | ]\}}||j qS r+   )r0   .0kvr+   r+   r,   
<dictcomp>       z3TornadoRequestExtractor.cookies.<locals>.<dictcomp>)rN   cookiesitemsr   r+   r+   r,   r         zTornadoRequestExtractor.cookiesc                 C   s   | j jS r&   )rN   r   r   r+   r+   r,   raw_data   s   z TornadoRequestExtractor.raw_dataDict[str, Any]c                 C   r   )Nc                 S   s    i | ]\}}|d d |D qS )c                 S   s   g | ]}| d dqS )latin1replace)decode)r   r   r+   r+   r,   
<listcomp>   r   z;TornadoRequestExtractor.form.<locals>.<dictcomp>.<listcomp>r+   )r   r   vsr+   r+   r,   r      s    z0TornadoRequestExtractor.form.<locals>.<dictcomp>)rN   body_argumentsr   r   r+   r+   r,   form   s   
zTornadoRequestExtractor.formc                 C   s   t | jjdS )Nzcontent-type)r   rN   rO   getr   r+   r+   r,   is_json   s   zTornadoRequestExtractor.is_jsonc                 C   r   )Nc                 S   s   i | ]\}}|r||d  qS )r   r+   r   r+   r+   r,   r      s    z1TornadoRequestExtractor.files.<locals>.<dictcomp>)rN   filesr   r   r+   r+   r,   r      r   zTornadoRequestExtractor.filesfiler   c                 C   s   t |jpdS )Nr+   )r   r   )r#   r   r+   r+   r,   size_of_file   s   z$TornadoRequestExtractor.size_of_fileN)r"   r   )r"   r   )r<   r=   r>   intr   r   bytesr   r   boolr   r   r   r+   r+   r+   r,   rq      s    


rq   )r#   r   r"   rB   )rW   rc   r"   r   )9rK   
contextlibinspectr   rH   sentry_sdk.apir   sentry_sdk.constsr   sentry_sdk.scoper   sentry_sdk.tracingr   sentry_sdk.utilsr   r   r	   r
   r   r   sentry_sdk.integrationsr   r   r   $sentry_sdk.integrations._wsgi_commonr   r   r   sentry_sdk.integrations.loggingr   r!   r   r5   tornado.webr   r   tornado.genr   ImportErrortypingr   r   r   r   r   r   sentry_sdk._typesr   r   r    contextmanagerr(   r8   r9   r2   rQ   rq   r+   r+   r+   r,   <module>   sL     ;!
.