o
    gs                     @  sn  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
 d dlmZ d dlmZmZmZ d dlmZmZ d d	lmZ d
ZdZdZdZejejejejejejejej hZ!ejejejejejhZ"G dd dZ#G dd dZ$dZ%d7ddZ&d8ddZ'd9ddZ(d:dd Z)d;d"d#Z*d;d$d%Z+ed<d'd(Z,ed=d*d(Z,d>d,d(Z,d?d.d/Z-d0d1 Z.d2d3 Z/d@d4d5Z0d6S )A    )annotations)Mapping)environ)
IGNORECASE)compile)search)CallableIterableoverload)urlparse
urlunparse)SpanAttributes9OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SANITIZE_FIELDS8OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_REQUEST9OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_RESPONSE4OTEL_PYTHON_INSTRUMENTATION_HTTP_CAPTURE_ALL_METHODSc                   @  s$   e Zd ZdZdddZdd
dZdS )ExcludeListzQClass to exclude certain paths (given as a list of regexes) from tracing requestsexcluded_urlsIterable[str]c                 C  s$   || _ | j rtd|| _d S d S N|)_excluded_urls
re_compilejoin_regex)selfr    r   W/var/www/visachat/venv/lib/python3.10/site-packages/opentelemetry/util/http/__init__.py__init__A   s   zExcludeList.__init__urlstrreturnboolc                 C  s   t | jo	t| j|S N)r"   r   r   r   )r   r   r   r   r   url_disabledF   s   zExcludeList.url_disabledN)r   r   )r   r    r!   r"   )__name__
__module____qualname____doc__r   r$   r   r   r   r   r   >   s    
r   c                   @  s.   e Zd ZdZdddZdd
dZdddZdS )SanitizeValuez[Class to sanitize (remove sensitive data from) certain headers (given as a list of regexes)sanitized_fieldsr   c                 C  s&   || _ | j rtd|t| _d S d S r   )_sanitized_fieldsr   r   RE_IGNORECASEr   )r   r*   r   r   r   r   M   s   zSanitizeValue.__init__headerr    valuer!   c                 C  s   | j rt| j|rdS |S )Nz
[REDACTED])r+   r   r   )r   r-   r.   r   r   r   sanitize_header_valueR   s   
z#SanitizeValue.sanitize_header_valueheadersMapping[str, str | list[str]]header_regexes	list[str]normalize_functionCallable[[str], str]dict[str, list[str]]c                   sz   i }|r;t d|t}| D ]*\ }| r:|  }t|tr. |g||< q fdd|D ||< q|S )Nr   c                   s   g | ]}  |qS r   )r/   ).0r.   header_namer   r   r   
<listcomp>q   s    
z8SanitizeValue.sanitize_header_values.<locals>.<listcomp>)	r   r   r,   items	fullmatchlower
isinstancer    r/   )r   r0   r2   r4   valuesheader_regexes_compiledheader_valuekeyr   r8   r   sanitize_header_valuesY   s&   



z$SanitizeValue.sanitize_header_valuesN)r*   r   )r-   r    r.   r    r!   r    )r0   r1   r2   r3   r4   r5   r!   r6   )r%   r&   r'   r(   r   r/   rC   r   r   r   r   r)   J   s
    

r)   zOTEL_PYTHON_{}instrumentationr    r!   r3   c                 C  s2   t t|  d}|rdd |dD S g S )N_TRACED_REQUEST_ATTRSc                 S     g | ]}|  qS r   strip)r7   traced_request_attrr   r   r   r:          z,get_traced_request_attrs.<locals>.<listcomp>,)r   get_rootformatsplit)rD   traced_request_attrsr   r   r   get_traced_request_attrs|   s   rQ   c                 C  s.   t t|  dt tdd}t|S )N_EXCLUDED_URLSEXCLUDED_URLS )r   rL   rM   rN   parse_excluded_urls)rD   r   r   r   r   get_excluded_urls   s
   rV   r   c                 C  s,   | rdd |  dD }t|S g }t|S )zI
    Small helper to put an arbitrary url list inside an ExcludeList
    c                 S  rF   r   rG   )r7   excluded_urlr   r   r   r:      s    z'parse_excluded_urls.<locals>.<listcomp>rK   )rO   r   )r   excluded_url_listr   r   r   rU      s   rU   r   c                 C  sn   z,t | }t|j|jgr*t | }|jd\}}}t|j||j|j|j|j	fW S W | S  t
y6   Y | S w )zNGiven a string url, remove the username and password only if it is a valid url@)r   allschemenetloc
rpartitionr   pathparamsqueryfragment
ValueError)r   parsed
parsed_url_r\   r   r   r   remove_url_credentials   s(   rf   r-   c                 C     |   dd}d| S )N-re   zhttp.request.header.r=   replacer-   rB   r   r   r   normalise_request_header_name      
rl   c                 C  rg   )Nrh   re   zhttp.response.header.ri   rk   r   r   r   normalise_response_header_name   rm   rn   methodc                 C     d S r#   r   ro   r   r   r   sanitize_method      rr   Nonec                 C  rp   r#   r   rq   r   r   r   rr      rs   
str | Nonec                 C  s.   | d u rd S |   } tts| dv r| S dS )N)	GETHEADPOSTPUTDELETECONNECTOPTIONSTRACEPATCH_OTHER)upperr   rL   r   rq   r   r   r   rr      s   env_varc                 C  s(   t | d }|rdd |dD S g S )Nc                 S  rF   r   rG   )r7   custom_headersr   r   r   r:      rJ   z&get_custom_headers.<locals>.<listcomp>rK   )r   rL   rO   )r   r   r   r   r   get_custom_headers   s   r   c                        fddt   D }|S )Nc                      i | ]}| | qS r   r   r7   rB   	req_attrsr   r   
<dictcomp>       z5_parse_active_request_count_attrs.<locals>.<dictcomp>)_active_requests_count_attrsintersectionkeys)r   active_requests_count_attrsr   r   r   !_parse_active_request_count_attrs      
r   c                   r   )Nc                   r   r   r   r   r   r   r   r      r   z)_parse_duration_attrs.<locals>.<dictcomp>)_duration_attrsr   r   )r   duration_attrsr   r   r   _parse_duration_attrs   r   r   c                 C  s   t | }|j}|j}||fS r#   )r   r^   r`   )r   rd   r^   query_paramsr   r   r   _parse_url_query   s   r   N)rD   r    r!   r3   )rD   r    r!   r   )r   r    r!   r   )r   r    r!   r    )r-   r    r!   r    )ro   r    r!   r    )ro   rt   r!   rt   )ro   ru   r!   ru   )r   r    r!   r3   )r   r    )1
__future__r   collections.abcr   osr   rer   r,   r   r   r   typingr   r	   r
   urllib.parser   r   opentelemetry.semconv.tracer   r   r   r   r   HTTP_METHOD	HTTP_HOSTHTTP_SCHEMEHTTP_STATUS_CODEHTTP_FLAVORHTTP_SERVER_NAMENET_HOST_NAMENET_HOST_PORTr   r   r   r)   rM   rQ   rV   rU   rf   rl   rn   rr   r   r   r   r   r   r   r   r   <module>   sd   	/








