o
    i\!                     @   s  d dl Z d dlmZ d dlZd dlZd dlmZ 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% d dl&m'Z' dZ(ee(dej)dZ(ee*Z+e
,de#ej-ddde
j.d de/fddZ0de1e/e/f fddZ2dd  Z3d!d" Z4d#d$ Z5d%d& Z6d'd( Z7d)d* Z8d+d, Z9d-d. Z:d/d0 Z;dS )1    N)parse)config)Pin)	SPAN_KIND)trace_utils)unwrap)SpanKind)	SpanTypes)_HTTPLIB_NO_TRACE_REQUEST)	COMPONENT)
get_logger)schematize_url_operation)SpanDirection)asbool)HTTPPropagator)tracerzhttp.client.requesthttp)protocol	directionhttplibDD_HTTPLIB_DISTRIBUTED_TRACINGT)default)distributed_tracingdefault_http_tag_query_stringreturnc                   C   s   dS )N  r   r   r   Z/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/contrib/internal/httplib/patch.pyget_version*   s   r   c                   C   s   ddiS )Nzhttp.client*r   r   r   r   r   _supported_versions.   s   r    c                 C   s"   t d tjd| | |i |S )N)service_config)r   r   r   onto)funcinstanceargskwargsr   r   r   
_wrap_init2   s   r(   c                 C   s  t |}|r| s| |i |S d }z>| |i |}|W z$t|dd }|rA|r6tj|tj|j|	 d |
  t|d W S W S  tyR   tjddd Y S w z$t|dd }|rv|rktj|tj|j|	 d |
  t|d W w W w  ty   tjddd Y w w )N_datadog_span)status_coderesponse_headerserror applying request tagsTexc_info)r   get_fromenabledgetattrr   set_http_metar   r   status
getheadersfinishdelattr	Exceptionlogdebug)r$   r%   r&   r'   pinrespspanr   r   r   _wrap_getresponse7   sB   
r=   c                 O   s   ddl m} || ||| d S )Nr   ) wrapped_request_D8CB81E472AF98A2)%ddtrace.appsec._common_module_patchesr>   )r$   r%   r&   r'   _wrap_request_asmr   r   r   _call_asm_wrapQ   s   rA   c           
      C   s@  t jrt jrtt| |}n| }t|}t||r!||i |S |j	}z9t
jttjd}|ttjj |ttj ||_|dr\t|dkrO|d }n|di }t|j| W n tyy   tj ddd t!|dd }|rw|"  Y nw z||i |W S  ty   t!|dd }t#$ }	|r|j%|	  |"   w )	N	span_typer      headerszerror configuring requestTr-   r)   )&
asm_config_asm_enabled_ep_enabled	functoolspartialrA   r   r/   should_skip_requestr"   r   trace	span_namer	   HTTP_set_tag_strr   r   r   integration_namer   r   CLIENTr)   getlen
setdefaultr   injectcontextr7   r8   r9   r1   r5   sysr.   set_exc_info)
r$   r%   r&   r'   func_to_callr:   cfgr<   rE   r.   r   r   r   _wrap_requestW   sF   




r[   c                 C   s  t |}t||r| |i |S zt|dr|j}ntjttj	d}|
ttjj |
ttj ||_|d d \}}t|tjrEdnd}dj|jd}	|dkrW|jdks`|dkrb|jd	krbd
}	dj||j|	|d}
t|
}t|j|j|j|jd |jf}tj |tj|||j|j!d W n t"y   t#j$ddd t%|dd }|r|&  Y nw z| |i |W S  t"y   t%|dd }t'( }|r|j)|  |&   w )Nr)   rB      httpsr   z:{port})portP   i  r   z{scheme}://{host}{port}{path})schemehostr^   path)methodurltarget_hostqueryr,   Tr-   )*r   r/   rK   hasattrr)   r   rL   rM   r	   rN   rO   r   r   r   rP   r   r   rQ   
isinstanceHTTPSConnectionformatr^   ra   r   urlparse
urlunparser`   netlocrb   paramsfragmentr   r2   rf   r7   r8   r9   r1   r5   rW   r.   rX   )r$   r%   r&   r'   r:   r<   rc   rb   r`   r^   rd   parsedsanitized_urlr.   r   r   r   _wrap_putrequest   sP   


$


rr   c                 C   s@   t |dd }|r|d |d i}tj|tj|d | |i |S )Nr)   r      )request_headers)r1   r   r2   r   r   )r$   r%   r&   r'   r<   rt   r   r   r   _wrap_putheader   s
   ru   c                 C   sP   t |tdrdS | r|  sdS tj}|r&t|}|j|jko%|j	|j	kS dS )z<Helper to determine if the provided request should be tracedFT)
r1   r
   r0   r   agent_trace_urlr   rk   ra   hostnamer^   )r:   request	agent_urlrp   r   r   r   rK      s   
rK   c                   C   s~   t tddrdS dt_ttjjttj_ttjjt	tj_ttjj
ttj_
ttjjttj_ttjjttj_dS )zDpatch the built-in urllib/httplib/httplib.client methods for tracing__datadog_patchFNT)r1   r   rz   wraptFunctionWrapperHTTPConnection__init__r(   getresponser=   rx   r[   
putrequestrr   	putheaderru   r   r   r   r   patch   s   r   c                   C   sV   t tddsdS dt_ttjd ttjd ttjd ttjd ttjd dS )	z&unpatch any previously patched modulesrz   FNr~   r   rx   r   r   )r1   r   rz   _ur}   r   r   r   r   unpatch   s   r   )<rI   http.clientclientr   osrW   urllibr   r{   ddtracer   ddtrace._trace.pinr   ddtrace.constantsr   ddtrace.contribr   $ddtrace.contrib.internal.trace_utilsr   r   ddtrace.extr   r	   ddtrace.internal.constantsr
   r   ddtrace.internal.loggerr   ddtrace.internal.schemar   -ddtrace.internal.schema.span_attribute_schemar   ddtrace.internal.settings.asmrF   ddtrace.internal.utils.formatsr   ddtrace.propagation.httpr   ddtrace.tracer   rM   OUTBOUND__name__r8   _addgetenv_http_client_tag_query_stringstrr   dictr    r(   r=   rA   r[   rr   ru   rK   r   r   r   r   r   r   <module>   sT    	09	