
    g                    0   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j2                  ej4                  ej6                  ej8                  ej:                  ej<                  ej>                  ej@                  hZ!ej2                  ej4                  ej6                  ej:                  ej<                  hZ" G d d      Z# G d d      Z$d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 Z.d Z/d%dZ0y)&    )annotations)Mapping)environ)
IGNORECASE)compile)search)CallableIterableOptional)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                       e Zd ZdZddZddZy)ExcludeListzQClass to exclude certain paths (given as a list of regexes) from tracing requestsc                j    || _         | j                   r t        dj                  |            | _        y y N|)_excluded_urls
re_compilejoin_regex)selfexcluded_urlss     U/var/www/openai/venv/lib/python3.12/site-packages/opentelemetry/util/http/__init__.py__init__zExcludeList.__init__A   s-    +$SXXm%<=DK     c                \    t        | j                  xr t        | j                  |            S N)boolr   r   r   )r   urls     r   url_disabledzExcludeList.url_disabledF   s#    D''DF4;;,DEEr    N)r   Iterable[str])r$   strreturnr#   )__name__
__module____qualname____doc__r   r%    r    r   r   r   >   s    [>
Fr    r   c                  8    e Zd ZdZddZddZ	 	 	 	 	 	 	 	 ddZy)	SanitizeValuez[Class to sanitize (remove sensitive data from) certain headers (given as a list of regexes)c                t    || _         | j                   r%t        dj                  |      t              | _        y y r   )_sanitized_fieldsr   r   RE_IGNORECASEr   )r   sanitized_fieldss     r   r   zSanitizeValue.__init__M   s0    !1!!$SXX.>%?ODK "r    c                N    | j                   rt        | j                  |      rdS |S )Nz
[REDACTED])r1   r   r   )r   headervalues      r   sanitize_header_valuez#SanitizeValue.sanitize_header_valueR   s.     &&6$++v+F 	
 	
r    c                j   i }|rt        dj                  |      t              }|j                         D ]w  \  }}|j	                  |      s ||j                               }t        |t              r| j                  ||      g||<   U|D 	cg c]  }	| j                  ||	       c}	||<   y |S c c}	w r   )	r   r   r2   items	fullmatchlower
isinstancer'   r7   )
r   headersheader_regexesnormalize_functionvaluesheader_regexes_compiledheader_nameheader_valuekeyr6   s
             r   sanitize_header_valuesz$SanitizeValue.sanitize_header_valuesY   s     (*&0('#
 .5]]_)\*44[A,[->->-@AC!,4 66 +\'s *6')5 !66{EJ)5's .= 's   B0N)r3   r&   )r5   r'   r6   r'   r(   r'   )r=   zMapping[str, str | list[str]]r>   	list[str]r?   zCallable[[str], str]r(   zdict[str, list[str]])r)   r*   r+   r,   r   r7   rE   r-   r    r   r/   r/   J   s;    eP

. " 1	
 
r    r/   zOTEL_PYTHON_{}c                    t        j                  t        j                  |  d      g       }|r,|j	                  d      D cg c]  }|j                          }}|S c c}w )N_TRACED_REQUEST_ATTRS,)r   get_rootformatsplitstrip)instrumentationtraced_request_attrstraced_request_attrs      r   get_traced_request_attrsrR   |   sq    ";;((=>?  (<'A'A#'F 
'F#  %%''F 	  

   
s   Ac                    t        j                  t        j                  |  d      t        j                  t        j                  d      d            }t	        |      S )N_EXCLUDED_URLSEXCLUDED_URLS )r   rJ   rK   rL   parse_excluded_urls)rO   r   s     r   get_excluded_urlsrX      sJ     KK(78ELL126M
 }--r    c                    | r7| j                  d      D cg c]  }|j                          }}t        |      S g }t        |      S c c}w )zI
    Small helper to put an arbitrary url list inside an ExcludeList
    rI   )rM   rN   r   )r   excluded_urlexcluded_url_lists      r   rW   rW      s_     5B5H5H5M
5M\L 5M 	 
 ()) ())
s   Ac                \   	 t        |       }t        |j                  |j                  g      rmt        |       }|j                  j	                  d      \  }}}t        |j                  ||j                  |j                  |j                  |j                  f      S 	 | S # t        $ r Y | S w xY 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`   s        r   remove_url_credentialsrj      s    #v}}-.!#J!==33C8LAq&%%OO%%$$''	 	 / J  Js   BB 	B+*B+c                L    | j                         j                  dd      }d| S )N-ri   zhttp.request.header.r;   replacer5   rD   s     r   normalise_request_header_namerp      s'    
,,.
 
 c
*C!#''r    c                L    | j                         j                  dd      }d| S )Nrl   ri   zhttp.response.header.rm   ro   s     r   normalise_response_header_namerr      s'    
,,.
 
 c
*C"3%((r    c                h    | y | j                         } t        j                  t              s| dv r| S y)N)	GETHEADPOSTPUTDELETECONNECTOPTIONSTRACEPATCH_OTHER)upperr   rJ   r   )methods    r   sanitize_methodr      s;    ~\\^FHI 	

	
 r    c                    t        j                  | d       }|r-|j                  d      D cg c]  }|j                          c}S g S c c}w )NrI   )r   rJ   rM   rN   )env_varcustom_headerss     r   get_custom_headersr      sW    [[$/N #1"6"6s";
";   "";
 	
 I	
s   Ac                x    t         j                  | j                               D ci c]  }|| |   
 }}|S c c}w r"   )_active_requests_count_attrsintersectionkeys)	req_attrsrD   active_requests_count_attrss      r   !_parse_active_request_count_attrsr      sL     0<<Y^^=MN#NC 	Ys^N   # '&	#   7c                x    t         j                  | j                               D ci c]  }|| |   
 }}|S c c}w r"   )_duration_attrsr   r   )r   rD   duration_attrss      r   _parse_duration_attrsr      sL     #//	0@AAC 	Ys^A   	r   c                P    t        |       }|j                  }|j                  }||fS r"   )r   rb   rd   )r$   rh   rb   query_paramss       r   _parse_url_queryr      s*    #J??D##Lr    N)rO   r'   r(   r   )r   r'   r(   r   )r$   r'   r(   r'   )r5   r'   r(   r'   )r   Optional[str]r(   r   )r   r'   r(   rF   )r$   r'   )1
__future__r   collections.abcr   osr   rer   r2   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/   rK   rR   rX   rW   rj   rp   rr   r   r   r   r   r   r-   r    r   <module>r      s,   # #  * $  / / - 6 @ : ? 9 @ :
 ; 5 ####    	 ##  	F 	F, ,^ 	 .*.(
)
2'r    