o
    i#                     @  s  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mZmZ d d	lmZmZmZmZmZmZ d d
lmZmZ dZdZ dZ!dZ"eeeeeeeehZ#eeeeehZ$g dZ%G dd dZ&G dd dZ'dZ(d=ddZ)d>ddZ*d?ddZ+d@d!d"Z,dAd$d%Z-dAd&d'Z.edBd)d*Z/edCd,d*Z/dDd.d*Z/dEd0d1Z0d2d3 Z1d4d5 Z2dFd6d7Z3d@d8d9Z4d@d:d;Z5d<S )G    )annotations)Mapping)environ)
IGNORECASE)compile)search)CallableIterableoverload)parse_qs	urlencodeurlparse
urlunparse)HTTP_FLAVOR	HTTP_HOSTHTTP_METHODHTTP_SCHEMEHTTP_SERVER_NAMEHTTP_STATUS_CODE)NET_HOST_NAMENET_HOST_PORT9OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SANITIZE_FIELDS8OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_REQUEST9OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_RESPONSE4OTEL_PYTHON_INSTRUMENTATION_HTTP_CAPTURE_ALL_METHODS)AWSAccessKeyId	SignaturesigzX-Goog-Signaturec                   @  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(   f/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/opentelemetry/util/http/__init__.py__init__N   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_disabledS   s   zExcludeList.url_disabledN)r   r    )r+   r,   r-   r.   )__name__
__module____qualname____doc__r*   r0   r(   r(   r(   r)   r   K   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'   r6   r(   r(   r)   r*   Z   s   zSanitizeValue.__init__headerr,   valuer-   c                 C  s   | j rt| j|rdS |S )Nz
[REDACTED])r7   r   r&   )r'   r9   r:   r(   r(   r)   sanitize_header_value_   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>~   s    
z8SanitizeValue.sanitize_header_values.<locals>.<listcomp>)	r$   r%   r8   items	fullmatchlower
isinstancer,   r;   )r'   r<   r>   r@   valuesheader_regexes_compiledheader_valuekeyr(   rD   r)   sanitize_header_valuesf   s&   



z$SanitizeValue.sanitize_header_valuesN)r6   r    )r9   r,   r:   r,   r-   r,   )r<   r=   r>   r?   r@   rA   r-   rB   )r1   r2   r3   r4   r*   r;   rO   r(   r(   r(   r)   r5   W   s
    

r5   zOTEL_PYTHON_{}instrumentationr,   r-   r?   c                 C  s2   t t|  d}|rdd |dD S g S )N_TRACED_REQUEST_ATTRSc                 S     g | ]}|  qS r(   strip)rC   traced_request_attrr(   r(   r)   rF          z,get_traced_request_attrs.<locals>.<listcomp>,)r   get_rootformatsplit)rP   traced_request_attrsr(   r(   r)   get_traced_request_attrs   s   r]   c                 C  s.   t t|  dt tdd}t|S )N_EXCLUDED_URLSEXCLUDED_URLS )r   rX   rY   rZ   parse_excluded_urls)rP   r   r(   r(   r)   get_excluded_urls   s
   rb   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  rR   r(   rS   )rC   excluded_urlr(   r(   r)   rF      s    z'parse_excluded_urls.<locals>.<listcomp>rW   )r[   r   )r   excluded_url_listr(   r(   r)   ra      s   ra   r+   c                 C  s~   z4t | }t|j|jgr/d|jv r2|jd\}}}d| }t|j||j|j|j|j	fW S W | S W | S  t
y>   Y | S w )zkGiven a string url, replace the username and password with the keyword `REDACTED` only if it is a valid url@zREDACTED:REDACTED@)r   allschemenetloc
rpartitionr   pathparamsqueryfragment
ValueError)r+   parsed_host
new_netlocr(   r(   r)   remove_url_credentials   s.   
rs   r9   c                 C     |   dd}d| S )N-rp   zhttp.request.header.rI   replacer9   rN   r(   r(   r)   normalise_request_header_name      
ry   c                 C  rt   )Nru   rp   zhttp.response.header.rv   rx   r(   r(   r)   normalise_response_header_name   rz   r{   methodc                 C     d S r/   r(   r|   r(   r(   r)   sanitize_method      r   Nonec                 C  r}   r/   r(   r~   r(   r(   r)   r      r   
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   rX   r   r~   r(   r(   r)   r      s   env_varc                 C  s(   t | d }|rdd |dD S g S )Nc                 S  rR   r(   rS   )rC   custom_headersr(   r(   r)   rF      rV   z&get_custom_headers.<locals>.<listcomp>rW   )r   rX   r[   )r   r   r(   r(   r)   get_custom_headers   s   r   c                        fddt   D }|S )Nc                      i | ]}| | qS r(   r(   rC   rN   	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   rj   rl   )r+   
parsed_urlrj   query_paramsr(   r(   r)   _parse_url_query
  s   r   c              	     s   z?t | }|js| W S t|j t fddtD s| W S tD ]}| v r+dg |< q t|j|j|j|j	t
 dd|jfW S  tyJ   |  Y S w )z;Given a string url, redact sensitive query parameter valuesc                 3  s    | ]}| v V  qd S r/   r(   )rC   paramr   r(   r)   	<genexpr>  s    z*redact_query_parameters.<locals>.<genexpr>REDACTEDT)doseq)r   rl   r   anyPARAMS_TO_REDACTr   rg   rh   rj   rk   r   rm   rn   )r+   ro   r   r(   r   r)   redact_query_parameters  s.   



r   c                 C  s   t | } t| } | S )zORedact sensitive data from the URL, including credentials and query parameters.)rs   r   )r+   r(   r(   r)   
redact_url+  s   r   N)rP   r,   r-   r?   )rP   r,   r-   r   )r   r,   r-   r   )r+   r,   r-   r,   )r9   r,   r-   r,   )r|   r,   r-   r,   )r|   r   r-   r   )r|   r   r-   r   )r   r,   r-   r?   )r+   r,   )6
__future__r   collections.abcr   osr   rer   r8   r   r$   r   typingr   r	   r
   urllib.parser   r   r   r   <opentelemetry.semconv._incubating.attributes.http_attributesr   r   r   r   r   r   ;opentelemetry.semconv._incubating.attributes.net_attributesr   r   r   r   r   r   r   r   r   r   r5   rY   r]   rb   ra   rs   ry   r{   r   r   r   r   r   r   r   r(   r(   r(   r)   <module>   sl    /










