o
    h)                     @   s  d dl Z d dlZd dlZd dlZd dlZd dl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 dGdejded	efd
dZdGdejded	efddZdejejeeeef  d	efddZded	efddZddZed Zed Z ded	eje fddZ!e
de
dfZ"ded	ejej#eeef  fddZ$d	eje fddZ%ded	ej&ej'eef  fd d!Z(d"d#hZ)d$ej*ej#ejejf  d	ej+ej#ejejf  fd%d&Z,d'a-d(ed	ej.fd)d*Z/d+ej0d	efd,d-Z1d	ej'eef fd.d/Z2d0ed	eje fd1d2Z3dHdejeef ded	efd4d5Z4dHdejeef ded	efd6d7Z5ded8ejd	ejfd9d:Z6ded	efd;d<Z7G d=d> d>Z8d?d?d@dAZ9dBe:d	e:fdCdDZ;G dEdF dFZ<dS )I    N)	timedelta)Path)perf_counter)TracebackType)
getproxiesvalueencodingreturnc                 C   s$   t | tr	|  S | |pd S )zE
    Coerce str/bytes into a strictly byte-wise HTTP header key.
    ascii)
isinstancebyteslowerencoder   r    r   S/var/www/html/magazine_api/magazine_env/lib/python3.10/site-packages/httpx/utils.pynormalize_header_key   s   
r   c                 C   s   t | tr| S | |pdS )zG
    Coerce str/bytes into a strictly byte-wise HTTP header value.
    r
   )r   r   r   r   r   r   r   normalize_header_value   s   
r   c                 C   s,   | du rdS | du rdS | du rdS t | S )z
    Coerce a primitive data type into a string value for query params.

    Note that we prefer JSON-style 'true'/'false' for boolean values here.
    TtrueFfalseN )strr   r   r   r   str_query_param!   s   r   c                 C   s&   zt |  W dS  ty   Y dS w )z7
    Return `True` if `encoding` is a known codec.
    FT)codecslookupLookupError)r   r   r   r   is_known_encoding0   s   r    r
         datac                 C   s   | d d }|t jt jfv rdS |d d t jkrdS |d d t jt jfv r)dS |t}|dkr4dS |dkrN|d d d tkrCd	S |d
d d tkrNdS |dkrf|d d t	kr\dS |d
d  t	krfdS d S )N   zutf-32r    z	utf-8-sigr   zutf-16r   utf-8z	utf-16-be   z	utf-16-lez	utf-32-bez	utf-32-le)
r   BOM_UTF32_LEBOM_UTF32_BEBOM_UTF8BOM_UTF16_LEBOM_UTF16_BEcount_null_null2_null3)r!   sample	nullcountr   r   r   guess_json_utfA   s*   
r0   z~/.netrcz~/_netrchostc                 C   s`   t tddft }d }|D ]}| }| r|} nq|d u r$d S tt|}|| S )NNETRCr   )	r   osgetenvNETRC_STATIC_FILES
expanduseris_filenetrcr   authenticators)r1   NETRC_FILES
netrc_path	file_pathZexpanded_pathZ
netrc_infor   r   r   get_netrc_logina   s   
r=   c                  C   sT   dt jv rtt jd } |  rt| S dt jv r(tt jd }| r(t|S d S )NZSSL_CERT_FILEZSSL_CERT_DIR)r3   environr   r7   r   is_dir)Zssl_fileZssl_pathr   r   r   get_ca_bundle_from_envr   s   

r@   c           	   
   C   s   g }d}|  |} | s|S td| D ]M}z
|dd\}}W n ty-   |d}}Y nw d| di}|dD ] }z	|d\}} W n
 tyO   Y  nw |  ||| |< q:|| q|S )	a7  
    Returns a list of parsed link headers, for more info see:
    https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Link
    The generic syntax of those is:
    Link: < uri-reference >; param1=value1; param2="value2"
    So for instance:
    Link; '<http:/.../front.jpeg>; type="image/jpeg",<http://.../back.jpeg>;'
    would return
        [
            {"url": "http:/.../front.jpeg", "type": "image/jpeg"},
            {"url": "http://.../back.jpeg"},
        ]
    :param value: HTTP Link entity-header field
    :return: list of parsed link headers
    z '"z, *<;r$   r   urlz<> '"=)stripresplit
ValueErrorappend)	r   linksreplace_charsvalrB   paramslinkparamkeyr   r   r   parse_header_links~   s*   
rP   authorizationzproxy-authorizationitemsc                 c   s:    | D ]\}}t | tv rtd|d}||fV  qd S )Nz[secure])match_type_of)to_strr   SENSITIVE_HEADERSto_bytes_or_str)rR   kvr   r   r   obfuscate_sensitive_headers   s   rY   Fnamec                 C   sh   t s/da tjdd dv r/td}|tj t	t
j}|tjddd || t| S )	zGets a `logging.Logger` instance and optionally
    sets up debug logging if the user requests it via
    the `HTTPX_DEBUG=1` environment variable.
    TZHTTPX_DEBUGr   )1r   Zhttpxz0%(asctime)s.%(msecs)03d - %(name)s - %(message)sz%H:%M:%S)fmtdatefmt)_LOGGER_INITIALIZEDr3   r>   getr   logging	getLoggersetLevelDEBUGStreamHandlersysstderrsetFormatter	Formatter
addHandler)rZ   loggerhandlerr   r   r   
get_logger   s   


rl   kwargsc                  K   s   d dd |  D S )zdFormat arguments into a key=value line.

    >>> formatkv(x=1, name="Bob")
    "x=1 name='Bob'"
     c                 s   s"    | ]\}}| d |V  qdS )rC   Nr   ).0rO   r   r   r   r   	<genexpr>   s     zkv_format.<locals>.<genexpr>)joinrR   )rm   r   r   r   	kv_format   s   rr   c                  C   s0   dd t   D } td}|dur|| d< | S )z+Gets proxy information from the environmentc                 S   s&   i | ]\}}d |v s|dv r||qS )z://)httphttpsr   )ro   rO   rK   r   r   r   
<dictcomp>   s
    z+get_environment_proxies.<locals>.<dictcomp>Z	ALL_PROXYNall)r   rR   get_environ_lower_and_upper)proxiesZ	all_proxyr   r   r   get_environment_proxies   s   ry   rO   c                 C   sB   |   |  fD ]} tj| d}|durt|tr|  S qdS )zGets a value from os.environ with both the lowercase and uppercase
    environment variable. Prioritizes the lowercase environment variable.
    N)r   upperr3   r>   r_   r   r   )rO   r   r   r   r   rw      s   rw   r#   c                 C   s   t | tr
| |S | S Nr   r   r   r   r   r   r   to_bytes      r}   c                 C   s   t | tr| S | |S r{   )r   r   decoder   r   r   r   rT      r~   rT   rS   c                 C   s   t |tr| S |  S r{   r|   )r   rS   r   r   r   rV      s   rV   c                 C   s0   | d | d   krdkrn n| dd S | S )Nr   "r$   r   r   r   r   r   unquote   s   0r   c                	   @   sZ   e Zd ZdddZdddZ			ddeje ded	eddfd
dZ	e
defddZdS )ElapsedTimerr	   Nc                 C   s   t  | _d | _d S r{   )r   startendselfr   r   r   __init__  s   
zElapsedTimer.__init__c                 C   s   t  | _| S r{   )r   r   r   r   r   r   	__enter__  s   zElapsedTimer.__enter__exc_type	exc_value	tracebackc                 C   s   t  | _d S r{   )r   r   )r   r   r   r   r   r   r   __exit__  s   zElapsedTimer.__exit__c                 C   s.   | j d u rtt | j dS t| j | j dS )N)seconds)r   r   r   r   r   r   r   r   elapsed  s   
zElapsedTimer.elapsed)r	   N)r	   r   )NNN)__name__
__module____qualname__r   r   typingTypeBaseExceptionr   r   propertyr   r   r   r   r   r   r     s"    


r   z<{length} bytes>z<{length} chars>)bodyr   textmessagec                 C   s^   |   }tD ]}|| v r| | }t| jt|d}|||< qd| v r-tt| d |d< |S )zi
    Return an ASGI message, with any body-type content omitted and replaced
    with a placeholder.
    )lengthheaders)copyASGI_PLACEHOLDER_FORMATformatlenlistrY   )r   Znew_messageattrcontentplaceholderr   r   r   asgi_message_with_placeholders"  s   r   c                   @   sD   e Zd ZdejdejddfddZdedejd	ejddfd
dZ	dS )MessageLoggerASGIMiddlewareapprj   r	   Nc                 C   s   || _ || _d S r{   )r   rj   )r   r   rj   r   r   r   r   6  s   
z$MessageLoggerASGIMiddleware.__init__scopereceivesendc              
      s   dt f fdd}dt dd ffdd}t |}d|v r)tt|d |d< jdtdi |  z|||I d H  W n tyX } z	jd	 |d d }~ww jd
 d S )Nr	   c                     s6     I d H } t | }jdtdi |  | S )Nzsent r   r   rj   debugrr   r   Zlogged_message)r   r   r   r   inner_receive=  s
   z;MessageLoggerASGIMiddleware.__call__.<locals>.inner_receiver   c                    s8   t | } jdtdi |  | I d H  d S )Nz	received r   r   r   )r   r   r   r   
inner_sendC  s   z8MessageLoggerASGIMiddleware.__call__.<locals>.inner_sendr   zstarted Zraised_exception	completedr   )dictr   rY   rj   r   rr   r   r   )r   r   r   r   r   r   Zlogged_scopeexcr   )r   r   r   r   __call__:  s"   
z$MessageLoggerASGIMiddleware.__call__)
r   r   r   r   Callabler`   Loggerr   r   r   r   r   r   r   r   5  s    r   r{   )r#   )=r   r`   r8   r3   rE   re   r   datetimer   pathlibr   timer   typesr   urllib.requestr   AnyStrr   r   r   r   OptionalUnionintfloatboolr   r   r   r+   r,   r-   r0   r5   Tupler=   r@   ListDictrP   rU   IterableIteratorrY   r^   r   rl   Anyrr   ry   rw   r}   rT   rV   r   r   r   r   r   r   r   r   r   r   <module>   s\    	&	
$"%
		""