U
    C])                     @   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 dHejeeddd	ZdIejeedd
dZejejeeeef  edddZeedddZddZed Zed Z eeje dddZ!e
de
dfZ"eejej#eeef  dddZ$eje ddd Z%eej&ej'eef  dd!d"Z(d#d$hZ)ej*ej#ejejf  ej+ej#ejejf  d%d&d'Z,d(a-eej.d)d*d+Z/ej0ed,d-d.Z1ej'eef dd/d0Z2eeje d1d2d3Z3dJejeef eedd5d6Z4dKejeef eedd7d8Z5eejejd9d:d;Z6eedd<d=Z7G d>d? d?Z8d@d@dAdBZ9e:e:dCdDdEZ;G dFdG dGZ<dS )L    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   k/var/www/html/staging.mfahmagazine.net/magazine_api/magazine_env/lib/python3.8/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   )r   r	   c                 C   s,   | dkrdS | dkrdS | dk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   )r   r	   c                 C   s*   zt |  W n tk
r$   Y dS X dS )z7
    Return `True` if `encoding` is a known codec.
    FT)codecslookupLookupError)r   r   r   r   is_known_encoding0   s
    r    r
         )datar	   c                 C   s   | d d }|t jt jfkr dS |d d t jkr6dS |d d t jt jfkrRdS |t}|dkrhdS |dkr|d d d tkrd	S |d
d d tkrdS |dkr|d d t	krdS |d
d  t	krd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!   sampleZ	nullcountr   r   r   guess_json_utfA   s*    
r/   z~/.netrcz~/_netrc)hostr	   c                 C   s`   t tddft }d }|D ]}| }| r|} q<q|d krHd S tt|}|| S )NZNETRCr   )	r   osgetenvNETRC_STATIC_FILES
expanduseris_filenetrcr   Zauthenticators)r0   ZNETRC_FILESZ
netrc_path	file_pathZexpanded_pathZ
netrc_infor   r   r   get_netrc_logina   s    r8   r	   c                  C   sT   dt jkr(tt jd } |  r(t| S dt jkrPtt jd }| rPt|S d S )NZSSL_CERT_FILEZSSL_CERT_DIR)r1   environr   r5   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 ]}z|dd\}}W n tk
r\   |d }}Y nX d| di}|dD ]F}z|d\}} W n tk
r   Y  qY nX |  ||| |< qv|| 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   ZlinksZreplace_charsvalr>   paramslinkparamkeyr   r   r   parse_header_links~   s&    
rJ   Zauthorizationzproxy-authorization)itemsr	   c                 c   s8   | D ].\}}t | tkr(td|d}||fV  qd S )Nz[secure])match_type_of)to_strr   SENSITIVE_HEADERSto_bytes_or_str)rK   kvr   r   r   obfuscate_sensitive_headers   s    rR   F)namer	   c                 C   sh   t s^da tjdd dk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   httpxz0%(asctime)s.%(msecs)03d - %(name)s - %(message)sz%H:%M:%S)fmtdatefmt)_LOGGER_INITIALIZEDr1   r:   getr   logging	getLoggersetLevelDEBUGStreamHandlersysstderrsetFormatter	Formatter
addHandler)rS   loggerhandlerr   r   r   
get_logger   s    

rf   )kwargsr	   c                  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 )r?   Nr   ).0rI   r   r   r   r   	<genexpr>   s     zkv_format.<locals>.<genexpr>)joinrK   )rg   r   r   r   	kv_format   s    rl   c                  C   s0   dd t   D } td}|dk	r,|| d< | S )z+Gets proxy information from the environmentc                 S   s&   i | ]\}}d |ks|dkr||qS )z://)httphttpsr   )ri   rI   rE   r   r   r   
<dictcomp>   s
     z+get_environment_proxies.<locals>.<dictcomp>Z	ALL_PROXYNall)r   rK   get_environ_lower_and_upper)ZproxiesZ	all_proxyr   r   r   get_environment_proxies   s    rr   )rI   r	   c                 C   sB   |   |  fD ],} tj| d}|dk	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   upperr1   r:   rY   r   r   )rI   r   r   r   r   rq      s
    
rq   r#   c                 C   s   t | tr| |S | S Nr   r   r   r   r   r   r   to_bytes   s    rv   c                 C   s   t | tr| S | |S rt   )r   r   decoder   r   r   r   rM      s    rM   )r   rL   r	   c                 C   s   t |tr| S |  S rt   ru   )r   rL   r   r   r   rO      s    rO   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    rz   c                   @   sV   e Zd ZddddZd dddZdeje eedddd	Z	e
edd
dZdS )ElapsedTimerNr9   c                 C   s   t  | _d | _d S rt   )r   startendselfr   r   r   __init__  s    zElapsedTimer.__init__c                 C   s   t  | _| S rt   )r   r|   r~   r   r   r   	__enter__  s    zElapsedTimer.__enter__)exc_type	exc_value	tracebackr	   c                 C   s   t  | _d S rt   )r   r}   )r   r   r   r   r   r   r   __exit__  s    zElapsedTimer.__exit__c                 C   s.   | j d k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)NNN)__name__
__module____qualname__r   r   typingZTypeBaseExceptionr   r   propertyr   r   r   r   r   r   r{     s      r{   z<{length} bytes>z<{length} chars>)bodyr   textmessager	   c                 C   s^   |   }tD ]0}|| kr| | }t| jt|d}|||< qd| krZt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listrR   )r   Znew_messageattrcontentplaceholderr   r   r   asgi_message_with_placeholders"  s    
r   c                   @   s:   e Zd ZejejddddZeejejddddZ	dS )MessageLoggerASGIMiddlewareN)apprd   r	   c                 C   s   || _ || _d S rt   )r   rd   )r   r   rd   r   r   r   r   6  s    z$MessageLoggerASGIMiddleware.__init__)scopereceivesendr	   c              
      s   t d fdd}t d dfdd}t |}d|krNtt|d |d< jdtf |  z|||I d H  W n4 tk
r } zjd	 |d W 5 d }~X Y nX jd
 d S )Nr9   c                     s0     I d H } t | }jdtf |  | S )Nzsent r   rd   debugrl   r   Zlogged_message)r   r   r   r   inner_receive=  s    z;MessageLoggerASGIMiddleware.__call__.<locals>.inner_receiver   c                    s2   t | } jdtf |  | I d H  d S )Nz	received r   r   )r   r   r   r   
inner_sendC  s    z8MessageLoggerASGIMiddleware.__call__.<locals>.inner_sendr   zstarted Zraised_exceptionZ	completed)dictr   rR   rd   r   rl   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   CallablerZ   Loggerr   r   r   r   r   r   r   r   5  s     r   )N)N)r#   )r#   )=r   rZ   r6   r1   rA   r_   r   datetimer   pathlibr   timer   typesr   Zurllib.requestr   ZAnyStrr   r   r   r   OptionalUnionintfloatboolr   r   r   r+   r,   r-   r/   r3   ZTupler8   r<   ZListDictrJ   rN   IterableIteratorrR   rX   r   rf   ZAnyrl   rr   rq   rv   rM   rO   rz   r{   r   r   r   r   r   r   r   r   <module>   sV   		$
" %		