o
    Zh                     @   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rbd 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"ys   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	Z0dd Z1dd Z2dd Z3G dd deZ4d d! Z5d"d# Z6d$d% Z7d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)Event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)   T/var/www/html/lang_env/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(   environZstart_responser0   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 )NZsentry_traceZsentry_trace_meta)r   r2   r   Ztrace_propagation_meta)sendertemplatecontextextrahubZ
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)Zurl_ruleruler    Zset_transaction_namer   	Exception)scoper'   r   Zname_for_styler)   r)   r*    _set_transaction_name_and_sourceg   s   rM   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   r2   r3   r"   Zconfigure_scopeflask_requestZ_get_current_objectrM   r'   _make_request_event_processorZadd_event_processor)appkwargsrH   integrationrL   r   Z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   r4   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*   r_      s   
zFlaskRequestExtractor.cookiesc                 C   s
   | j  S r-   )r   get_datar6   r)   r)   r*   raw_data   s   
zFlaskRequestExtractor.raw_datac                 C   rT   r-   )r   formr6   r)   r)   r*   rc      rV   zFlaskRequestExtractor.formc                 C   rT   r-   )r   filesr6   r)   r)   r*   rd      rV   zFlaskRequestExtractor.filesc                 C   rT   r-   )r   is_jsonr6   r)   r)   r*   re      rV   zFlaskRequestExtractor.is_jsonc                 C   s   | j jddS )NT)Zsilent)r   Z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   rU   r_   rb   rc   rd   re   rf   ri   r)   r)   r)   r*   rS      s    rS   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   rS   Zextract_into_eventr   _add_user_to_event)eventhintr   r)   r*   inner   s   

z,_make_request_event_processor.<locals>.innerr)   )rP   r   rR   rm   r)   r   r*   rO      s   rO   c                 K   sJ   t j}|td u rd S |j}t||jdddd\}}|j||d d S )Nr#   F)typeZhandled)Zclient_optionsZ	mechanism)rl   )r   r2   r3   r"   clientr   optionsZcapture_event)rD   	exceptionrQ   rH   ro   rk   rl   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   
setdefaultZget_idAttributeErrorrt   rK   ru   )rk   rr   Z	user_infor)   r)   r*   rj      s4   "rj   )8
__future__r   Zsentry_sdk._typesr   Zsentry_sdk.hubr   r   Zsentry_sdk.integrationsr   r   Z$sentry_sdk.integrations._wsgi_commonr   Zsentry_sdk.integrations.wsgir	   Zsentry_sdk.scoper
   Zsentry_sdk.tracingr   Zsentry_sdk.utilsr   r   r   typingr   r   r   r   r   r   r   Zwerkzeug.datastructuresr   r   rv   ImportErrorr#   r   r   r   rN   Zflask.signalsr   r   r   Z
markupsafer   Zblinkerr%   r"   r9   rM   r:   rS   rO   r;   rj   r)   r)   r)   r*   <module>   sR    +%