o
    Eh1                     @   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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 ddlmZ dd	lmZ e	jr_dd
lmZ dddZedd ed dD  ed dd e! D Z"	d\de	j#e$e%f de$de%fddZ&	d\de	j#e$e%f de$de%fddZ'ddde$fddZ(de$de)fddZ*d e$de	j#e$e%f de%fd!d"Z+d#,d$Z-e-d% Z.e-d& Z/d'e%de	j0e$ fd(d)Z1G d*d+ d+Z2de	j0e$ fd,d-Z3de$de	j4e	j5e$e$f  fd.d/Z6d0d1hZ7d2e	j8e	j9e	j:e	j:f  de	j;e	j9e	j:e	j:f  fd3d4Z<d5a=d6Z>G d7d8 d8ej?Z?d e$de?fd9d:Z@d;d<de)fd=d>ZAde	j5e$e$f fd?d@ZBd]de	j#e$e%f de$de%fdBdCZCd]de	j#e$e%f de$de$fdDdEZDde$dFe	j:de	j:fdGdHZEde$de$fdIdJZFdKe	j0e$ de	j0e$ fdLdMZGdNe	jHdeIfdOdPZJdQe	jKe$e	j#de	jLd f f de	j4e	j9e$df  fdRdSZMG dTdU dUZNejOdVePde	j;d fdWdXZQdYe$ddfdZd[ZRdS )^    N)	timedelta)Path)perf_counter)TracebackType)
getproxies   )NetworkError)PrimitiveData)URLz%22z\\)"\c                 C   s$   i | ]}|d krt |d|qS )   z%{:02X})chrformat.0c r   G/var/www/html/env_mimamsha/lib/python3.10/site-packages/httpx/_utils.py
<dictcomp>   s   $ r       |c                 C   s   g | ]}t |qS r   )reescaper   r   r   r   
<listcomp>   s    r   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   r   r   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	   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_param8   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_encodingG   s   r/   namec                 C   sJ   t |tr	| }dtjt dtfdd}t||}|  d| d S )z;
    Encode a name/value pair within a multipart form.
    matchr   c                 S   s   t | d S )Nr   )!_HTML5_FORM_ENCODING_REPLACEMENTSgroup)r1   r   r   r   replacerY   s   z#format_form_param.<locals>.replacerz="r   )	r   r    decodetypingMatchr)   _HTML5_FORM_ENCODING_REsubr"   )r0   r   r4   r   r   r   format_form_paramR   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-ber   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_utff   s*   
rL   c                   @   sh   e Zd Zddejeje  ddfddZedeje	j	 fddZ
dedejejeef  fd	d
ZdS )	NetRCInfoNfilesr   c                 C   s$   |d u rt ddddg}|| _d S )NNETRCr(   z~/.netrcz~/_netrc)osgetenvnetrc_files)selfrN   r   r   r   __init__   s   
zNetRCInfo.__init__c                 C   sN   t | ds$d | _| jD ]}t| }| r#tt|| _ | jS q| jS )N_netrc_info)hasattrrU   rR   r   
expanduseris_filenetrcr)   )rS   	file_pathexpanded_pathr   r   r   
netrc_info   s   

zNetRCInfo.netrc_info	authorityc                 C   sB   | j d u rd S | j |}|d u s|d d u rd S |d |d fS )Nr<   r   )r\   authenticators)rS   r]   	auth_infor   r   r   get_credentials   s   
zNetRCInfo.get_credentialsN)__name__
__module____qualname__r6   OptionalListr)   rT   propertyrY   r\   Tupler`   r   r   r   r   rM      s     
rM   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 )NSSL_CERT_FILESSL_CERT_DIR)rP   environr   rX   r)   is_dir)ssl_filessl_pathr   r   r   get_ca_bundle_from_env   s   

ro   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<> '"=)stripr   split
ValueErrorappend)	r   linksreplace_charsvalrq   paramslinkparamkeyr   r   r   parse_header_links   s*   
r~   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)r   kvr   r   r   obfuscate_sensitive_headers   s   r   F   c                   @   s*   e Zd ZdedejdejddfddZdS )Loggermessageargskwargsr   Nc                 O   s   d S ra   r   )rS   r   r   r   r   r   r   trace   s   zLogger.trace)rb   rc   rd   r)   r6   Anyr   r   r   r   r   r      s    "r   c                    s   t s=da ttd tjdd }|dv r=td  	|dkr%tj
nt ttj}|tjdd	d
  | t|  dtdtjdtjddf fdd}| _tt S )z
    Get a `logging.Logger` instance, and optionally
    set up debug logging based on the HTTPX_LOG_LEVEL environment variable.
    TTRACEHTTPX_LOG_LEVELr(   )DEBUGr   httpxr   z2%(levelname)s [%(asctime)s] %(name)s - %(message)sz%Y-%m-%d %H:%M:%S)fmtdatefmtr   r   r   r   Nc                    s    j t| g|R i | d S ra   )logTRACE_LOG_LEVEL)r   r   r   loggerr   r   r     s   zget_logger.<locals>.trace)_LOGGER_INITIALIZEDloggingaddLevelNamer   rP   rk   getupper	getLoggersetLevelr   StreamHandlersysstderrsetFormatter	Formatter
addHandlerr)   r6   r   r   castr   )r0   	log_levelhandlerr   r   r   r   
get_logger   s&   


"r   rq   r
   c                 C   s   t  d}|s
dS dd |dD }|D ].}|dkr dS |rD|d}t|}d	| }t|| jtjsAt|| j	tjrD dS qdS )
zK Return True if url should not be proxied,
    return False otherwise.
    noFc                 S   s   g | ]}|  qS r   )rs   )r   hostr   r   r   r     s    z)should_not_be_proxied.<locals>.<listcomp>,*T.z
(.+\.)?%s$)
r   r   rt   lstripr   r   r1   r   Ir]   )rq   no_proxyno_proxy_listr0   patternr   r   r   should_not_be_proxied	  s"   


r   c                      s   d  fddt   D S )z+Gets proxy information from the environment)httphttpsallc                    s&   i | ]\}}d |v s| v r||qS )z://r   )r   r}   ry   supported_proxy_schemesr   r   r   '  s
    z+get_environment_proxies.<locals>.<dictcomp>)r   r   r   r   r   r   get_environment_proxies  s   
r   r@   c                 C   s   t | tr
| |S | S ra   r   r)   r"   r#   r   r   r   to_bytes.     r   c                 C   s   t | tr| S | |S ra   )r   r)   r5   r#   r   r   r   r   2  r   r   r   c                 C   s   t |tr| S |  S ra   r   )r   r   r   r   r   r   6  s   r   c                 C   s0   | d | d   krdkrn n| dd S | S )Nr   r   r   r   r*   r   r   r   unquote:  s   0r   filenamec                 C   s   | rt | d p
dS d S )Nr   zapplication/octet-stream)	mimetypes
guess_type)r   r   r   r   guess_content_type>  s   r   streamc                 C   sd   z|   }W n% ty+   z|  }| dtj}| | W | Y S  ty*    w w t|jS )zs
    Given a file-like stream object, return its length in number of bytes
    without reading it into memory.
    r   )filenoOSErrortellseekrP   SEEK_ENDfstatst_size)r   fdoffsetlengthr   r   r   peek_filelike_lengthD  s   r   queryparamsc                 C   sf   g }|   D ]*\}}t|tjjr%t|ttfs%|D ]	}|||f qq||t	d|f q|S )z
    Convert a mapping of query params into a flat list of two-tuples
    representing each item.

    Example:
    >>> flatten_queryparams_values({"q": "httpx", "tag": ["python", "dev"]})
    [("q", "httpx), ("tag", "python"), ("tag", "dev")]
    r	   )
r   r   collectionsabcSequencer)   r    rv   r6   r   )r   r   r   r   ur   r   r   flatten_queryparams^  s   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 ra   )r   startendrS   r   r   r   rT   x  s   
zElapsedTimer.__init__c                 C   s   t  | _| S ra   )r   r   r   r   r   r   	__enter__|  s   zElapsedTimer.__enter__exc_type	exc_value	tracebackc                 C   s   t  | _d S ra   )r   r   )rS   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)rb   rc   rd   rT   r   r6   TypeBaseExceptionr   r   rg   r   r   r   r   r   r   r   w  s"    


r   exception_classesc               
   g   sH    zd V  W d S  t y# } z| D ]}t||rt||q d }~ww ra   )r   r   r   )r   excclsr   r   r   as_network_error  s   

r   r   c                 C   s   t j| tdd d S )Nr<   )
stacklevel)warningswarnDeprecationWarning)r   r   r   r   warn_deprecated  s   r   ra   )r@   )Sr,   r   
contextlibr   r   rY   rP   r   r   r6   r   datetimer   pathlibr   timer   typesr   urllib.requestr   _exceptionsr   _typesr	   TYPE_CHECKING_modelsr
   r2   updaterangecompilejoinkeysr8   Unionr)   r    r$   r%   r+   boolr/   r:   r"   rG   rH   rI   re   rL   rM   ro   rf   Dictr~   r   Iterablerh   AnyStrIteratorr   r   r   r   r   r   r   r   r   r   r   r   IOintr   Mappingr   r   r   contextmanagertyper   r   r   r   r   r   <module>   s    


 
"%
	"""

