o
    h                     @   s  d dl mZ d dlmZ d dl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 d d	lmZmZmZ er`d d
lmZmZmZmZ d dlmZ d dlmZ d dlmZmZ zd dl Z W n e!yq   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! Z4d"d# Z5d$d% Z6dS )&    )absolute_import)TYPE_CHECKING)Hub_should_send_default_pii)DidNotEnableIntegration)RequestExtractor)SentryWsgiMiddleware)Scope)SOURCE_FOR_STYLE)capture_internal_exceptionsevent_from_exceptionpackage_version)AnyCallableDictUnion)EventProcessor)_ScopedResponse)FileStorageImmutableMultiDictN)FlaskRequestrequest)before_render_templategot_request_exceptionrequest_started)MarkupzFlask is not installedzblinker is not installed)endpointurlc                   @   s*   e Zd ZdZdZd	ddZedd ZdS )
FlaskIntegrationflask r   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)selfr&    r(   `/var/www/html/aiguide_backend/venv/lib/python3.10/site-packages/sentry_sdk/integrations/flask.py__init__6   s   
zFlaskIntegration.__init__c                     sb   t d} | d u rtd| dk rtdtt tt tt t	j
  fdd}|t	_
d S )Nr"   zUnparsable Flask version.)r   
   z Flask 0.10 or newer is required.c                    s4   t jtd u r ||S t fdd||S )Nc                     s    g| R i |S Nr(   )akw)old_appr'   r(   r)   <lambda>U   s    zNFlaskIntegration.setup_once.<locals>.sentry_patched_wsgi_app.<locals>.<lambda>)r   currentget_integrationr!   r	   )r'   environstart_responser/   r'   r)   sentry_patched_wsgi_appP   s
   z<FlaskIntegration.setup_once.<locals>.sentry_patched_wsgi_app)r   r   r   connect_add_sentry_tracer   _request_startedr   _capture_exceptionr   __call__)versionr7   r(   r5   r)   
setup_once?   s   



	zFlaskIntegration.setup_onceN)r   )__name__
__module____qualname__
identifierr&   r*   staticmethodr>   r(   r(   r(   r)   r!   1   s    
	r!   c                 K   s2   d|v rd S t j}t| }||d< ||d< d S )Nsentry_tracesentry_trace_meta)r   r1   r   trace_propagation_meta)sendertemplatecontextextrahub
trace_metar(   r(   r)   r9   \   s   r9   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)scoper&   r   name_for_styler(   r(   r)    _set_transaction_name_and_sourceg   s   rT   c                 K   sv   t j}|t}|d u rd S | }t }t||j| t	| ||}|
| W d    d S 1 s4w   Y  d S r,   )r   r1   r2   r!   configure_scopeflask_request_get_current_objectrT   r&   _make_request_event_processoradd_event_processor)appkwargsrK   integrationrR   r   evt_processorr(   r(   r)   r:   v   s   

"r:   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 r,   )r   r3   r6   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itemsr6   r(   r(   r)   rj      s   
zFlaskRequestExtractor.cookiesc                 C   s
   | j  S r,   )r   get_datar6   r(   r(   r)   raw_data   s   
zFlaskRequestExtractor.raw_datac                 C   r_   r,   )r   formr6   r(   r(   r)   rn      ra   zFlaskRequestExtractor.formc                 C   r_   r,   )r   filesr6   r(   r(   r)   ro      ra   zFlaskRequestExtractor.filesc                 C   r_   r,   )r   is_jsonr6   r(   r(   r)   rp      ra   zFlaskRequestExtractor.is_jsonc                 C   s   | j jddS )NT)silent)r   get_jsonr6   r(   r(   r)   json   s   zFlaskRequestExtractor.jsonc                 C   s   |j S r,   )content_length)r'   filer(   r(   r)   size_of_file   s   z"FlaskRequestExtractor.size_of_fileN)r?   r@   rA   r`   rj   rm   rn   ro   rp   rs   rv   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 r,   )r   r^   extract_into_eventr   _add_user_to_event)eventhintr   r(   r)   inner   s   

z,_make_request_event_processor.<locals>.innerr(   )rZ   r   r\   r{   r(   r   r)   rX      s   rX   c                 K   sJ   t j}|td u rd S |j}t||jdddd\}}|j||d d S )Nr"   F)typehandled)client_options	mechanism)rz   )r   r1   r2   r!   clientr   optionscapture_event)rG   	exceptionr[   rK   r   ry   rz   r(   r(   r)   r;      s   
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   rQ   r   )ry   r   	user_infor(   r(   r)   rx      s4   "rx   )7
__future__r   sentry_sdk._typesr   sentry_sdk.hubr   r   sentry_sdk.integrationsr   r   $sentry_sdk.integrations._wsgi_commonr   sentry_sdk.integrations.wsgir	   sentry_sdk.scoper
   sentry_sdk.tracingr   sentry_sdk.utilsr   r   r   typingr   r   r   r   r   r   werkzeug.datastructuresr   r   r   ImportErrorr"   r   r   r   rV   flask.signalsr   r   r   
markupsafer   blinkerr$   r!   r9   rT   r:   r^   rX   r;   rx   r(   r(   r(   r)   <module>   sR    +%