o
    0 i$"                     @   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 Z0dd Z1dd Z2G dd deZ3dd Z4ee/d d! Z5d"d# Z6d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                   @   s8   e Zd ZdZde ZdZdefddZedd Z	d	S )
FlaskIntegrationflaskz
auto.http. r    c                 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
ValueErrortransaction_styletuplemapstrupperhttp_methods_to_capture)selfr'   r,    r.   i/home/app/PaddleOCR-VL-test/.venv_paddleocr/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  fdd}|t_d S )Nr   )Quartz?This is not a Flask app but rather Quart pretending to be Flaskr#   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.   r/   <lambda>h   s    zNFlaskIntegration.setup_once.<locals>.sentry_patched_wsgi_app.<locals>.<lambda>)Zspan_originr,   )
sentry_sdk
get_clientget_integrationr"   r   originr,   r   )r-   environZstart_responseintegrationZ
middlewarer5   r-   r/   sentry_patched_wsgi_app`   s   
	z<FlaskIntegration.setup_once.<locals>.sentry_patched_wsgi_app)Zquartr1   r   r   ImportErrorr   r   r"   r   connect_add_sentry_tracer   _request_startedr   _capture_exception__call__)r1   versionr?   r.   r=   r/   
setup_onceH   s$   




zFlaskIntegration.setup_onceN)
__name__
__module____qualname__
identifierr:   r'   r   r0   staticmethodrG   r.   r.   r.   r/   r"   4   s    

r"   c                 K   s4   d|v rd S t  }t| }||d< ||d< d S )NZsentry_traceZsentry_trace_meta)r7   get_current_scoper   Ztrace_propagation_meta)sendertemplatecontextextrascopeZ
trace_metar.   r.   r/   rB   u   s   rB   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)Zurl_ruleruler    Zset_transaction_namer	   	Exception)rR   r'   r   Zname_for_styler.   r.   r/    _set_transaction_name_and_source   s   rV   c                 K   sV   t  t}|d u rd S t }tt  |j| t 	 }t
| ||}|| d S r2   )r7   r8   r9   r"   flask_requestZ_get_current_objectrV   rM   r'   Zget_isolation_scope_make_request_event_processorZadd_event_processor)appkwargsr<   r   rR   Zevt_processorr.   r.   r/   rC      s   rC   c                   @   sL   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dS )FlaskRequestExtractorc                 C      | j jS r2   )r   r;   r>   r.   r.   r/   env      zFlaskRequestExtractor.envc                 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.   r/   
<dictcomp>   s    "z1FlaskRequestExtractor.cookies.<locals>.<dictcomp>)r   cookiesitemsr>   r.   r.   r/   rg      s   
zFlaskRequestExtractor.cookiesc                 C   s
   | j  S r2   )r   get_datar>   r.   r.   r/   raw_data   s   
zFlaskRequestExtractor.raw_datac                 C   r\   r2   )r   formr>   r.   r.   r/   rk      r^   zFlaskRequestExtractor.formc                 C   r\   r2   )r   filesr>   r.   r.   r/   rl      r^   zFlaskRequestExtractor.filesc                 C   r\   r2   )r   is_jsonr>   r.   r.   r/   rm      r^   zFlaskRequestExtractor.is_jsonc                 C   s   | j jddS )NT)Zsilent)r   Zget_jsonr>   r.   r.   r/   json   s   zFlaskRequestExtractor.jsonc                 C   s   |j S r2   )content_length)r-   filer.   r.   r/   size_of_file   s   z"FlaskRequestExtractor.size_of_fileN)rH   rI   rJ   r]   rg   rj   rk   rl   rm   rn   rq   r.   r.   r.   r/   r[      s    r[   c                    s    fdd}|S )Nc                    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 r2   )r
   r[   Zextract_into_eventr   _add_user_to_event)eventhintr   r.   r/   inner   s   

z,_make_request_event_processor.<locals>.innerr.   )rY   r   r<   ru   r.   r   r/   rX      s   rX   c                 K   s0   t |t jdddd\}}tj||d d S )Nr#   F)typeZhandled)Zclient_optionsZ	mechanism)rt   )r   r7   r8   optionsZcapture_event)rN   	exceptionrZ   rs   rt   r.   r.   r/   rD      s   
rD   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
   
setdefaultZget_idAttributeErrorr{   rU   r|   )rs   ry   Z	user_infor.   r.   r/   rr      s4   "rr   )7r7   Zsentry_sdk.integrationsr   r   r   Z$sentry_sdk.integrations._wsgi_commonr   r   Zsentry_sdk.integrations.wsgir   Zsentry_sdk.scoper   Zsentry_sdk.tracingr	   Zsentry_sdk.utilsr
   r   r   r   typingr   r   r   r   r   Zsentry_sdk._typesr   r   r   Zwerkzeug.datastructuresr   r   r}   r@   r#   r   r   r   rW   Zflask.signalsr   r   r   Z
markupsafer   Zblinkerr%   r"   rB   rV   rC   r[   rX   rD   rr   r.   r.   r.   r/   <module>   sR    A%
