a
    xdj;                     @   s  d dl Z d dlZd dlZd dlZd dlmZ d dlZd dlmZm	Z	m
Z
mZmZmZmZ d dlmZmZ d dlmZ erd dlmZ d dlmZmZ nd dlmZ d dlmZmZ erd 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  e !dZ"dZ#dZ$e !dj%e$dZ&e !dZ'G dd deZ(dd Z)dd Z*ej+dd Z,dd Z-dd Z.dd  Z/d!d" Z0d#d$ Z1d%d& Z2d'd( Z3d0d)d*Z4d+d, Z5G d-d. d.e6Z7erd d/l8m9Z9 dS )1    N)Real)capture_internal_exceptionsDsnloggersafe_str	to_base64	to_stringfrom_base64)PY2	iteritems)MYPY)Mapping)quoteunquote)	Generator)Optional)Any)Dict)Unionz5^[ 	]*([0-9a-f]{32})?-?([0-9a-f]{16})?-?([01])?[ 	]*$z(([a-zA-Z0-9+/]{4})*([a-zA-Z0-9+/]{2,3})?z[^=]+=[^=]+z^({te})+(,|$))tez (?:^|.+,)(sentry=[^,]*)(?:,.+|$)c                   @   s.   e Zd ZdddZdd Zdd Zdd	 Zd
S )EnvironHeadersHTTP_c                 C   s   || _ || _d S N)environprefix)selfr   r    r   P/var/www/html/Ranjet/env/lib/python3.9/site-packages/sentry_sdk/tracing_utils.py__init__Q   s    zEnvironHeaders.__init__c                 C   s   | j | j|dd   S N-_)r   r   replaceupper)r   keyr   r   r   __getitem__Z   s    zEnvironHeaders.__getitem__c                 C   s   t dd t| D S )Nc                 s   s   | ]
}d V  qdS )   Nr   ).0r!   r   r   r   	<genexpr>`       z)EnvironHeaders.__len__.<locals>.<genexpr>)sumiterr   r   r   r   __len__^   s    zEnvironHeaders.__len__c                 c   sN   | j D ]B}t|tsq|dd }|| js4q|t| jd  V  qd S r   )r   
isinstancestrr"   r#   
startswithr   len)r   kr   r   r   __iter__b   s    

zEnvironHeaders.__iter__N)r   )__name__
__module____qualname__r   r%   r-   r3   r   r   r   r   r   P   s
    
	r   c                 C   s    t | ddup| dduS )zf
    Returns True if either traces_sample_rate or traces_sampler is
    defined, False otherwise.
    Ztraces_sample_rateNZtraces_sampler)boolget)optionsr   r   r   has_tracing_enabledo   s    r:   c                 C   sb   t | trt| r0tdj| t| d dS t| } | dk sH| dkr^tdj| d dS dS )	z
    Checks the given sample rate to make sure it is valid type and value (a
    boolean or a number between 0 and 1, inclusive).
    z}[Tracing] Given sample rate is invalid. Sample rate must be a boolean or a number between 0 and 1. Got {rate} of type {type}.)ratetypeFr   r&   zX[Tracing] Given sample rate is invalid. Sample rate must be between 0 and 1. Got {rate}.r;   T)	r.   r   mathisnanr   warningformatr<   floatr=   r   r   r   is_valid_sample_rate|   s     
rC   c           
      c   s  | j r:| j jd ddr:|r(|d gkr,d }|dkrBd}nd }d }t||}i }|d ur`||d< |d urp||d< |r|d|d	< t   | j|d
|d W d    n1 s0    Y  | jd|d4}| D ]\}}	|||	 q|V  W d    n1 s0    Y  d S )N_experimentsZrecord_sql_paramsFZpyformatrA   z	db.paramszdb.paramstyleTzdb.executemanyquery)messagecategorydatadb)opdescription)	clientr9   r8   _format_sqlr   add_breadcrumbZ
start_spanitemsset_data)
hubcursorrE   Zparams_listZ
paramstyleZexecutemanyrH   spanr2   vr   r   r   record_sql_queries   s.    
.rU   c                 C   sd   |j dkr"| j|jdd|jd n>|j dkr@| jdd|jd n |j dkr`| jdd|j|jd d S )NZredis)rF   r<   rG   rH   httphttplib)r<   rG   rH   
subprocess)r<   rG   rF   rH   )rJ   rN   rK   Z_tags_data)rQ   rS   r   r   r   "maybe_create_breadcrumbs_from_span   s    


rZ   c                 C   s   | sdS |  dr(| dr(| dd } t| }|s:dS | \}}}d}|r`dt|d}|rtdt|d}|r|d	k}|||d
S )zL
    Given a `sentry-trace` header string, return a dictionary of data.
    Nz00-z-00   z{:032x}   z{:016x}0)trace_idparent_span_idparent_sampled)r0   endswithSENTRY_TRACE_REGEXmatchgroupsrA   int)headerrd   r_   r`   Zsampled_strra   r   r   r   extract_sentrytrace_data   s&    
rh   c                 C   s   d }}d }}| rt | }|rj|d}tdd | |\}}|dd}tdjtd|snd}n| }d		t
tj||gpd}||d
S )z
    Extracts the sentry tracestate value and any third-party data from the given
    tracestate header, returning a dictionary of data.
    N r&   c                 S   s
   |  dS )N,)strip)sr   r   r   <lambda>	  r)   z)extract_tracestate_data.<locals>.<lambda>sentry=z^{b64}$)Zb64rj   )Zsentry_tracestateZthird_party_tracestate)SENTRY_TRACESTATE_ENTRY_REGEXsearchgroupmapsplitr"   rerA   base64_strippedjoinfilterTRACESTATE_ENTRIES_REGEX)rg   Zsentry_entryZthird_party_entrybeforeafterZsentry_matchZsentry_valuer   r   r   extract_tracestate_data   s     

r{   c                 C   s    t j| td}t|pddS )z
    Computes a new tracestate value using the given data.

    Note: Returns just the base64-encoded data, NOT the full `sentry=...`
    tracestate entry.
    )defaultri   =)jsondumpsr   r   rstrip)rH   tracestate_jsonr   r   r   compute_tracestate_value  s    	r   c                 C   s   i }| j ptjj}|j}|j}|r|jdr|j}|j}| j	|d |dt
|d jd}|r|dsv|dri }|dr|d |d< |dr|d |d< ||d< | jr| jj|d< d	t| S d
S )z
    Computes a new sentry tracestate for the span. Includes the `sentry=`.

    Will return `None` if there's no client and/or no DSN.
    Zdsnenvironmentrelease)r_   r   r   
public_keyidsegmentusertransactionrn   N)rQ   
sentry_sdkHubcurrentrL   scoper9   r8   _userr_   r   r   Zcontaining_transactionnamer   )rS   rH   rQ   rL   r   r9   r   	user_datar   r   r   compute_tracestate_entry2  s.    

r   c              
   C   sl   d}| rht | d }z|dus"J t|}W n8 tyf } z tdj|| d W Y d}~n
d}~0 0 |S )zo
    Given a sentry tracestate value in its encoded form, translate it back into
    a dictionary of data.
    Nz==zcUnable to attach tracestate data to envelope header: {err}
Tracestate value is {encoded_tracestate})errencoded_tracestate)r	   r~   loads	Exceptionr   r@   rA   )r   Zinflated_tracestater   r   r   r   r   reinflate_tracestate^  s    
r   c                 C   sX   d }z0t | dr2| |}t|tr2|| jj}W n tyJ   d }Y n0 |pVt|S )Nmogrify)	hasattrr   r.   bytesdecode
connectionencodingr   r   )rR   ZsqlZreal_sqlr   r   r   rM     s    



rM   c                 C   s4   | r
| j ptjjj}|o|j}t|o0|d dS )NrD   Zpropagate_tracestate)rQ   r   r   r   rL   r9   r7   r8   )rS   rL   r9   r   r   r   has_tracestate_enabled  s    
r   c                  C   s*   t jjj} | o| j}t|o&|d dS )NrD   Zcustom_measurements)r   r   r   rL   r9   r7   r8   )rL   r9   r   r   r   has_custom_measurements_enabled  s    

r   c                   @   sV   e Zd ZdZdZedZg dZdddZ	e
d	d
 Zdd Zdd ZdddZdS )Baggagesentry_itemsthird_party_itemsmutablezsentry-z^sentry-)r_   r   Zsample_rater   r   r   Zuser_idZuser_segmentri   Tc                 C   s   || _ || _|| _d S r   r   )r   r   r   r   r   r   r   r     s    zBaggage.__init__c           	      C   s   i }d}d}|r| dD ]h}d|vr(q| }| d\}}tj|rnt| dd }t|||< d}q||rxdnd| 7 }qt|||S )zF
        freeze if incoming header already has sentry baggage
        ri   Trj   r}   r    r&   F)rs   rk   r   SENTRY_PREFIX_REGEXrd   r   )	clsrg   r   r   r   itemr$   valZbaggage_keyr   r   r   from_incoming_header  s    zBaggage.from_incoming_headerc                 C   s
   d| _ d S )NF)r   r,   r   r   r   freeze  s    zBaggage.freezec                 C   s,   i }t jD ]}| j|}|r
|||< q
|S r   )r   DSC_KEYSr   r8   )r   rg   r$   r   r   r   r   dynamic_sampling_context  s    

z Baggage.dynamic_sampling_contextFc                 C   sV   g }t | jD ],\}}tjt| d t| }|| q|rL|| j d|S )Nr}   rj   )r   r   r   SENTRY_PREFIXr   appendr   rv   )r   Zinclude_third_partyrO   r$   r   r   r   r   r   	serialize  s    zBaggage.serializeN)ri   T)F)r4   r5   r6   	__slots__r   rt   compiler   r   r   classmethodr   r   r   r   r   r   r   r   r     s   
  


r   )Span)N):rt   
contextlibr~   r>   Znumbersr   r   Zsentry_sdk.utilsr   r   r   r   r   r   r	   Zsentry_sdk._compatr
   r   Zsentry_sdk._typesr   collectionsr   urllibr   r   collections.abcurllib.parsetypingr   r   r   r   r   r   rc   ru   Ztracestate_entryrA   rx   ro   r   r:   rC   contextmanagerrU   rZ   rh   r{   r   r   r   rM   r   r   objectr   Zsentry_sdk.tracingr   r   r   r   r   <module>   sf   $	
	
* (,"
	T