o
    i~&                  
   @   sr  U 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 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.m0Z0 d dl.m1Z1 d dl.mZ2 d dl.m3Z3 d d l4m5Z5 d d!l4m6Z6 d d"l4m7Z7 d#d$l8m9Z9 e'e:Z;ee-ej<Z=e-e>d%< d&e!j?fd'd(Z@d&e!j?fd)d*ZAd+ed,eBed-f d.eCeDef d/efd0d1ZEd+ed2eFd,eBed-f d.eCeDef d/ef
d3d4ZGd5ed6ed/dfd7d8ZHd5ed6ed/dfd9d:ZIdS );    N)FunctionType)
ModuleType)Any)Optional)cast)PermissionDenied)HttpResponse)config)Pin)	SPAN_KIND)trace_utils)span_from_scope)get_resolver)REQUEST_DEFAULT_RESOURCE)_after_request_tags)_before_request_tags)SpanKind)	SpanTypes)http)core)BlockingException)	COMPONENT)
get_logger)schematize_url_operation)SpanDirection)IntegrationConfig)Block_config)get_argument_value)get_blocked)set_blocked)is_wrapped_with)unwrap)wrap   )utilsconfig_djangoctxc              
   C   s   d }i }d}z-t jdt j| ji}t| }| jdd}|r&tj	r&||t j
< t|}|r2||t j< W n tyM } ztdt| W Y d }~nd }~ww td||t||f d S )N 403QUERY_STRINGz5Could not gather some metadata on blocked request: %szdjango.block_request_callback)r   STATUS_CODEMETHODmethodr$   get_request_uriMETAgetr%   trace_query_stringr)   r   _get_request_header_user_agent
USER_AGENT	Exceptionlogwarningstrr   dispatch)requestrequest_headersr&   urlmetadataquery
user_agente r?   \/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/contrib/internal/django/response.py_gather_block_metadata1   s$   




rA   c                 C   s   t   t| || t )N)r   rA   r   )r8   r9   r&   r?   r?   r@   _block_request_callableC   s   rB   funcargs.kwargsreturnc                    s  |d }t ||dddu r| |i |S t}t|tjdjd|dt	dd	t
jd
tjtttjttjttjit|dd. tdtt|  tjf d}dtf fdd}zt  }rr||}njdd}t}	|	dur|r|	d| 7 }	tt dd}
|
rz|
!j"j#}t$%d| W n t&y   d}Y nw td tj'tj(||	|f tdd t  }r||}n^z	| |i |}W nJ t)y! } z=t*|j+d  ||j+d }|W  Y d}~W td tj,|f t stdd t  }r||}W  d   S d}~ww t  }r,||}W td tj,|f t sLtdd t  }rL||}n td tj,|f t sltdd t  }rl||}w |W  d   S 1 szw   Y  dS )N  Trace django.core.handlers.base.BaseHandler.get_response() (or other implementations).

    This is the main entry point for requests.

    Django requests are handled by a Handler.get_response method (inherited from base.BaseHandler).
    This method invokes the middleware chain and returns the response generated by the chain.
    r   r#   r8   Nzdjango.traced_get_responseREMOTE_ADDRTzdjango.requestr   )protocol	direction)remote_addrheadersheaders_case_sensitive	span_nameresourceservice	span_typetagsintegration_configdistributed_headersactivate_distributed_headerszdjango.traced_get_response.preblock_configc                    sx   | j dkrtd| jd}| jr| j|d< nt| j| j}t|| j| jd}||_t	|
 |d< t j| |S )Nnoner'   )statuslocation)content_typerX   zContent-Length)typer   status_coderY   
http_utils_get_blocked_templaterZ   block_idcontentlenencoder$   r   span)rV   responser`   r&   pinr8   r?   r@   blocked_responsew   s   


z-traced_get_response.<locals>.blocked_responser)   r'   ?urlconfzresolver.pattern %szdjango.start_responsezdjango.start_response.post)Djangozdjango.finalize_response.prezdjango.finalize_response)-r   r$   _get_request_headersr
   get_fromr   context_with_datar.   r/   r   r   INBOUNDr   r   int_servicer%   r   WEBr   integration_namer   r   SERVERr7   	functoolspartialrB   r   r   r   r-   r   getattrresolve	path_inforE   r4   debugr3   _extract_body_remake_bodyr   r   rD   r   )rC   rD   rE   instancer9   rd   rg   rV   r<   uriresolverpathr>   r?   re   r@   traced_get_responseK   s   









C
&r   r{   c                    s   t |}t||dd}t|j}|du r | |i |I dH S t|_t||| d}z| |i |I dH }W t|||| |S t|||| w )rG   r   r8   N)	r
   rl   r   r   scoper   rO   r   r   )rC   r{   rD   rE   rf   r8   rc   rd   r?   r?   r@   traced_get_response_async   s   


r   djangodjango_core_handlers_basec                 C   sP   t |jjtst|jjt | jdkr$t|jds&t|jdt d S d S d S N)   r#   get_response_async)	r    BaseHandlerget_responser   r"   VERSIONr   	iswrappedr   r   r   r?   r?   r@   instrument_module   s   
r   c                 C   sN   t |jjtrt|jjt | jdkr#t|jdr%t|jd d S d S d S r   )r    r   r   r   r!   r   r   r   r   r?   r?   r@   uninstrument_module   s   
r   )Jrs   typesr   r   typingr   r   r   django.core.exceptionsr   django.httpr   ddtracer	   ddtrace._trace.pinr
   ddtrace.constantsr   ddtrace.contrib.internalr   (ddtrace.contrib.internal.asgi.middlewarer   &ddtrace.contrib.internal.django.compatr   %ddtrace.contrib.internal.django.utilsr   r   r   ddtrace.extr   r   r   ddtrace.internalr   ddtrace.internal._exceptionsr   ddtrace.internal.constantsr   ddtrace.internal.loggerr   ddtrace.internal.schemar   -ddtrace.internal.schema.span_attribute_schemar   %ddtrace.internal.settings.integrationr   ddtrace.internal.utilsr   r   r   r]   r   ddtrace.internal.wrappingr    r!   r"   r'   r$   __name__r4   r   r%   __annotations__ExecutionContextrA   rB   tupledictr6   r   objectr   r   r   r?   r?   r?   r@   <module>   sl   
 *f


