o
    Á¿i5  ã                   @   sÆ  d 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 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 d dlmZ d dlmZ d dlmZ eeƒZe  d¡Zeƒ dedefdd„ƒZdededefdd„Z deeef dedee fdd„Z!dZ"d5deeef de#defdd „Z$								!	"d6d#ed$ed%ee d&ee d'ee d(ee d)ee d*e#d+ee d,e#d-efd.d/„Z%d0ed+ed1ed2eddf
d3d4„Z&dS )7é    N)ÚAny)ÚMapping)ÚOptional)ÚSpan)Úhttp)Úuser)Úcore)Ú
get_logger)Úconfig)ÚIntegrationConfig)Úcached)Únormalize_header_name)Ú
redact_url)Ústrip_query_stringz([^a-z0-9_\-:/]){1}Úheader_nameÚreturnc                 C   s   t  dt| ƒ¡S )NÚ_)ÚNORMALIZE_PATTERNÚsubr   )r   © r   ú]/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/contrib/internal/trace_utils_base.pyÚ_normalized_header_name   s   r   Úrequest_or_responsec                 C   s   t |ƒ}d | |¡S )aþ  
    Given a tag name, e.g. 'Content-Type', returns a corresponding normalized tag name, i.e
    'http.request.headers.content_type'. Rules applied actual header name are:
    - any letter is converted to lowercase
    - any digit is left unchanged
    - any block of any length of different ASCII chars is converted to a single underscore '_'
    :param request_or_response: The context of the headers: request|response
    :param header_name: The header's name
    :type header_name: str
    :rtype: str
    zhttp.{}.headers.{})r   Úformat)r   r   Únormalized_namer   r   r   Ú_normalize_tag_name   s   r   ÚheadersÚkeynamec                 C   sH   |   |¡}|dur|S |  ¡ D ]\}}| ¡  dd¡|kr!|  S qdS )z©
    Get a header in a case insensitive way. This function is meant for frameworks
    like Django < 2.2 that don't store the headers in a case insensitive mapping.
    Nr   ú-)ÚgetÚitemsÚlowerÚreplace)r   r   Úshortcut_valueÚkeyÚvaluer   r   r   Ú"_get_header_value_case_insensitive6   s   
ÿr&   )zhttp-user-agentz
user-agentFÚheaders_are_case_sensitivec                 C   s4   t D ]}|s|  |¡}nt| |ƒ}|r|  S qdS )zŒGet user agent from request headers
    :param headers: A dict of http headers to be stored in the span
    :type headers: dict or list
    Ú )ÚUSER_AGENT_PATTERNSr   r&   )r   r'   Úkey_patternÚ
user_agentr   r   r   Ú_get_request_header_user_agentK   s   
ÿr,   TÚsdkÚtracerÚuser_idÚnameÚemailÚscopeÚroleÚ
session_idÚ	propagateÚspanÚ	may_blockÚmodec                 C   sÞ   |du rt  ¡ }|rh|rt|ƒ}| tj|¡ |r||j_|r&| tj|¡ |r/| tj	|¡ |r8| tj
|¡ |rA| tj|¡ |rJ| tj|¡ |	sP|
dkrdtjrbt  d||
|g¡jj}|rf|‚dS dS dS t d¡ dS )z÷Set user tags.
    https://docs.datadoghq.com/logs/log_configuration/attributes_naming_convention/#user-related-attributes
    https://docs.datadoghq.com/security_platform/application_security/setup_and_configure/?tab=set_tag&code-lang=python
    NÚautoÚset_user_for_asmzÍNo root span in the current execution. Skipping set_user tags. See https://docs.datadoghq.com/security_platform/application_security/setup_and_configure/?tab=set_user&code-lang=python for more information.)r   Úget_root_spanÚstrÚ_set_tag_strr   ÚIDÚcontextÚ
dd_user_idÚNAMEÚEMAILÚSCOPEÚROLEÚ
SESSION_IDÚ
asm_configÚ_asm_enabledÚdispatch_with_resultsÚ
block_userÚ	exceptionÚlogÚwarning)r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   Ústr_user_idÚexcr   r   r   Úset_user[   s>   
ÿþûÿrO   Úintegration_configÚurlÚqueryc                 C   s‚   | j s| tjt|ƒ¡ d S tjr| tj|¡ d S tjd u s(ttjdd ƒdkr3| tjt|ƒ¡ d S | tjt	|tj|ƒ¡ d S )NÚpatternó    )
Úhttp_tag_query_stringr=   r   ÚURLr   r
   Ú)_global_query_string_obfuscation_disabledÚ!_obfuscation_query_string_patternÚgetattrr   )rP   r6   rQ   rR   r   r   r   Ú_set_url_tag‘   s   
rZ   )F)	NNNNNFNTr-   )'ÚreÚtypingr   r   r   Úddtrace._trace.spanr   Úddtrace.extr   r   Úddtrace.internalr   Úddtrace.internal.loggerr	   Ú!ddtrace.internal.settings._configr
   Úddtrace.internal.settings.asmrF   Ú%ddtrace.internal.settings.integrationr   Úddtrace.internal.utils.cacher   Úddtrace.internal.utils.httpr   r   r   Ú__name__rK   Úcompiler   r<   r   r   r&   r)   Úboolr,   rO   rZ   r   r   r   r   Ú<module>   sr    
" õÿþýüûúùø	÷
ö
õ"6