o
    ٰiG!                     @   s  d dl Z d dlmZmZmZ d dlmZ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 d dlmZ er^d d	lmZmZmZmZ d d
lmZmZ d dlmZ d dlmZmZ zd dl Z W n e!yo   dZ Y nw z d dl"m#Z#m$Z$ d dl"m%Z& d dl'm(Z(m)Z)m*Z* d dl+m,Z, W n e!y   edw zd dl-Z-W n e!y   edw dZ.G dd deZ/										d:ddZ0d d!d"e1d#d$ddfd%d&Z2d;d)d*Z3G d+d, d,eZ4	'		#	-	.			/d<d0d1Z5ee/			2	3	(			d=d4d5Z6d>d8d9Z7dS )?    N)_check_minimum_versionDidNotEnableIntegration)DEFAULT_HTTP_METHODS_TO_CAPTURERequestExtractor)SentryWsgiMiddleware)should_send_default_pii)SOURCE_FOR_STYLE)capture_internal_exceptionsensure_integration_enabledevent_from_exceptionpackage_version)TYPE_CHECKING)AnyCallableDictUnion)EventEventProcessor)_ScopedResponse)FileStorageImmutableMultiDict)FlaskRequestrequest)before_render_templategot_request_exceptionrequest_started)MarkupzFlask is not installedzblinker is not installed)endpointurlc                   @   sH   e Zd ZdZde ZdZdefdedddd	fd
dZe	dddZ
d	S )FlaskIntegrationflaskz
auto.http. r    transaction_stylehttp_methods_to_captureztuple[str, ...]returnNc                 C   s4   |t vrtd|t f || _tttj|| _d S )Nz7Invalid value for transaction_style: %s (must be in %s))TRANSACTION_STYLE_VALUES
ValueErrorr%   tuplemapstrupperr&   )selfr%   r&    r/   Q/home/ubuntu/.local/lib/python3.10/site-packages/sentry_sdk/integrations/flask.py__init__:   s   zFlaskIntegration.__init__c                     s   zddl m}  t| krtdW n	 ty   Y nw td}tt| t	t
 t	t t	t tj 							
		d fdd}|t_d S )Nr   )Quartz?This is not a Flask app but rather Quart pretending to be Flaskr#   r.   r   environDict[str, str]start_responseCallable[..., Any]r'   r   c                    sZ   t  td u r ||S t  t}t fddtj|r$|jntd}|||S )Nc                     s    g| R i |S Nr/   )akw)old_appr.   r/   r0   <lambda>g   s    zNFlaskIntegration.setup_once.<locals>.sentry_patched_wsgi_app.<locals>.<lambda>)span_originr&   )
sentry_sdk
get_clientget_integrationr"   r   originr&   r   )r.   r3   r5   integration
middlewarer:   r.   r0   sentry_patched_wsgi_app^   s   
	z<FlaskIntegration.setup_once.<locals>.sentry_patched_wsgi_app)r.   r   r3   r4   r5   r6   r'   r   )quartr2   r   r   ImportErrorr   r   r"   r   connect_add_sentry_tracer   _request_startedr   _capture_exception__call__)r2   versionrE   r/   rC   r0   
setup_onceG   s4   




zFlaskIntegration.setup_once)r'   N)__name__
__module____qualname__
identifierr@   r%   r   r,   r1   staticmethodrN   r/   r/   r/   r0   r"   4   s    

r"   senderr   templater   contextDict[str, Any]extrar'   c                 K   s4   d|v rd S t  }t| }||d< ||d< d S )Nsentry_tracesentry_trace_meta)r=   get_current_scoper   trace_propagation_meta)rT   rU   rV   rX   scope
trace_metar/   r/   r0   rI   t   s   rI   r]   zsentry_sdk.Scoper%   r   r   c                 C   sD   z|j j|j jd}| j|| t| d W d S  ty!   Y d S w )N)r!   r    )source)url_ruleruler    set_transaction_namer	   	Exception)r]   r%   r   name_for_styler/   r/   r0    _set_transaction_name_and_source   s   re   appkwargsc                 K   sV   t  t}|d u rd S t }tt  |j| t 	 }t
| ||}|| d S r7   )r=   r>   r?   r"   flask_request_get_current_objectre   r[   r%   get_isolation_scope_make_request_event_processoradd_event_processor)rf   rg   rA   r   r]   evt_processorr/   r/   r0   rJ      s   rJ   c                   @   sl   e Zd ZdddZdddZdefdd	Zd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 )FlaskRequestExtractorr'   r4   c                 C      | j jS r7   )r   r3   rD   r/   r/   r0   env      zFlaskRequestExtractor.envDict[Any, Any]c                 C   s   dd | j j D S )Nc                 S   s4   i | ]\}}|t |trt|d kr|d n|qS )   r   )
isinstancelistlen).0kvr/   r/   r0   
<dictcomp>   s    "z1FlaskRequestExtractor.cookies.<locals>.<dictcomp>)r   cookiesitemsrD   r/   r/   r0   r{      s   
zFlaskRequestExtractor.cookiesc                 C   s
   | j  S r7   )r   get_datarD   r/   r/   r0   raw_data   s   
zFlaskRequestExtractor.raw_dataImmutableMultiDict[str, Any]c                 C   ro   r7   )r   formrD   r/   r/   r0   r      rq   zFlaskRequestExtractor.formc                 C   ro   r7   )r   filesrD   r/   r/   r0   r      rq   zFlaskRequestExtractor.filesc                 C   ro   r7   )r   is_jsonrD   r/   r/   r0   r      rq   zFlaskRequestExtractor.is_jsonr   c                 C   s   | j jddS )NT)silent)r   get_jsonrD   r/   r/   r0   json   s   zFlaskRequestExtractor.jsonfiler   c                 C   s   |j S r7   )content_length)r.   r   r/   r/   r0   size_of_file   s   z"FlaskRequestExtractor.size_of_fileN)r'   r4   )r'   rr   )r'   r   )r'   r   )rO   rP   rQ   rp   r{   bytesr~   r   r   boolr   r   intr   r/   r/   r/   r0   rn      s    




rn   Callable[[], Request]rA   r   c                    s   d fdd}|S )	Neventr   hintdict[str, Any]r'   c                    sz    d u r| S t   t |  W d    n1 sw   Y  t r;t   t|  W d    | S 1 s6w   Y  | S r7   )r
   rn   extract_into_eventr   _add_user_to_event)r   r   r   r/   r0   inner   s   

z,_make_request_event_processor.<locals>.inner)r   r   r   r   r'   r   r/   )rf   r   rA   r   r/   r   r0   rk      s   rk   	exception Union[ValueError, BaseException]c                 K   s0   t |t jdddd\}}tj||d d S )Nr#   F)typehandled)client_options	mechanism)r   )r   r=   r>   optionscapture_event)rT   r   rg   r   r   r/   r/   r0   rK      s   
rK   r   r   c              	   C   s   t d u rd S t j}|d u rd S t Q | di }z
|d|  W n	 ty,   Y nw z	|d|j W n	 ty?   Y nw z	|d|j W n	 tyR   Y n	w W d    d S W d    d S 1 sfw   Y  d S )Nuseridemailusername)	flask_logincurrent_userr
   
setdefaultget_idAttributeErrorr   rc   r   )r   r   	user_infor/   r/   r0   r      s4   "r   )
rT   r   rU   r   rV   rW   rX   r   r'   N)rf   r   rg   r   r'   N)rf   r   r   r   rA   r"   r'   r   )rT   r   r   r   rg   r   r'   N)r   r   r'   N)8r=   sentry_sdk.integrationsr   r   r   $sentry_sdk.integrations._wsgi_commonr   r   sentry_sdk.integrations.wsgir   sentry_sdk.scoper   sentry_sdk.tracingr	   sentry_sdk.utilsr
   r   r   r   typingr   r   r   r   r   sentry_sdk._typesr   r   r   werkzeug.datastructuresr   r   r   rG   r#   r   r   r   rh   flask.signalsr   r   r   
markupsafer   blinkerr(   r"   rI   r,   re   rJ   rn   rk   rK   r   r/   r/   r/   r0   <module>   s    @



