o
    e+<                  	   @   sZ  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ZddlmZ ejr?ddlmZ ddd	Zed
d edD  eddd e D Z	dWdejeef dedeje defddZ	dWdejeef dej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defddZ#d Z$e$d! Z%e$d" Z&d#edeje 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*edeje fd+d,Z,d-d.hZ-d/ej.ej/ej0ej0f  dej1ej/ej0ej0f  fd0d1Z2d2d3deje3 fd4d5Z4d2d3d6d3defd7d8Z5d2d3d9d3defd:d;Z6dej*eeje f fd<d=Z7dXdejeef dedefd?d@Z8dXdejeef dedefdAdBZ9dedCej0dej0fdDdEZ:dedefdFdGZ;dHeje deje fdIdJZ<dKej=deje3 fdLdMZ>G dNdO dOZ?G dPdQ dQZ@dRedefdSdTZAdRedefdUdVZBdS )Y    N)Path)
getproxies   )PrimitiveDataURLz%22z\\)"\c                 C   s$   i | ]}|d krt |d|qS )   z%{:02X})chrformat.0c r   <D:\Projects\ConvertPro\env\Lib\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lowerencodingreturnc                 C   s.   t | tr| }n| |pd}|r| S |S )zE
    Coerce str/bytes into a strictly byte-wise HTTP header key.
    ascii)
isinstancebytesencoder   )r   r   r   Zbytes_valuer   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   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.

    Note that we prefer JSON-style 'true'/'false' for boolean values here.
    TtrueFfalseN )strr   r   r   r   primitive_value_to_str8   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   s8   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)r.   r   r   r   replacerW      z#format_form_param.<locals>.replacerz="r   )typingMatchr&   _HTML5_FORM_ENCODING_REsubr   )r-   r   r1   r   r   r   format_form_paramR   s   r7             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-sigr9   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_utfd   s*   
rI   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)osenvironr   is_filer&   is_dir)Zssl_fileZssl_pathr   r   r   get_ca_bundle_from_env   s   

rN   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valrP   paramslinkparamkeyr   r   r   parse_header_links   s*   
r]   content_typec                 C   s   t j }| |d< |jd dS )Nzcontent-type)failobj)emailmessageMessageget_content_charset)r^   msgr   r   r   parse_content_type_charset   s   
re   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)rg   kvr   r   r   obfuscate_sensitive_headers   s   rn   rP   r   c                 C   s"   | j d ur| j S ddd| jS )NP     )httphttps)portgetscheme)rP   r   r   r   port_or_default   s   
rv   otherc                 C   s(   | j |j ko| j|jkot| t|kS )z@
    Return 'True' if the given URLs share the same origin.
    )ru   hostrv   )rP   rw   r   r   r   same_origin   s
   
ry   locationc                 C   s<   | j |j krdS | jdkot| dko|jdkot|dkS )zA
    Return 'True' if 'location' is a HTTPS upgrade of 'url'
    Frq   ro   rr   rp   )rx   ru   rv   )rP   rz   r   r   r   is_https_redirect   s   


r{   c                  C   s   t  } i }dD ]}| |r"| | }d|v r|nd| || d< qdd | dddD }|D ]:}|d	kr=i   S |rmt|rKd
|d| < q3t|rXd
|d| d< q3| dkrfd
|d| < q3d
|d| < q3|S )z+Gets proxy information from the environment)rq   rr   allz://zhttp://c                 S   s   g | ]}|  qS r   )rR   )r   rx   r   r   r   r      s    z+get_environment_proxies.<locals>.<listcomp>nor%   ,*Nzall://zall://[]	localhostzall://*)r   rt   rS   is_ipv4_hostnameis_ipv6_hostnamer   )Z
proxy_infoZmountsru   hostnameZno_proxy_hostsr   r   r   get_environment_proxies   s,   
r   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   ri     r   ri   rh   c                 C   s   t |tr| S |  S r   r   )r   rh   r   r   r   rk        rk   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   sr   z|   }t|j}W |S  ttfy8   z|  }| dtj}| | W Y |S  ttfy7   Y Y dS w w )zs
    Given a file-like stream object, return its length in number of bytes
    without reading it into memory.
    r   N)	filenorJ   fstatst_sizeAttributeErrorOSErrortellseekSEEK_END)r   fdlengthoffsetr   r   r   peek_filelike_length+  s   r   c                   @   sJ   e Zd ZdefddZdddZdddZdefd	d
ZdefddZdS )Timerr   c                    s\   t  }|dkrdd l}| S |dkr$dd l}tt| I d H S dd l	}|
  S )Ntrior   curio)sniffioZcurrent_async_libraryr   current_timer   r3   castfloatclockasyncioget_event_looptime)selfZlibraryr   r   r   r   r   r   	_get_timeE  s   zTimer._get_timeNc                 C   s   t  | _d S r   r   perf_counterstartedr   r   r   r   
sync_startT  r2   zTimer.sync_startc                    s   |   I d H | _d S r   r   r   r   r   r   r   async_startW  s   zTimer.async_startc                 C   s   t  }|| j S r   r   r   nowr   r   r   sync_elapsedZ  s   
zTimer.sync_elapsedc                    s   |   I d H }|| j S r   r   r   r   r   r   async_elapsed^  s   
zTimer.async_elapsed)r   N)	__name__
__module____qualname__r   r   r   r   r   r   r   r   r   r   r   D  s    

r   c                   @   s   e Zd ZdZdeddfddZdddefd	d
Zede	j
eeef fddZdefddZdd defddZde	jdefddZdS )
URLPatterna  
    A utility class currently used for making lookups against proxy keys...

    # Wildcard matching...
    >>> pattern = URLPattern("all://")
    >>> pattern.matches(httpx.URL("http://example.com"))
    True

    # Witch scheme matching...
    >>> pattern = URLPattern("https://")
    >>> pattern.matches(httpx.URL("https://example.com"))
    True
    >>> pattern.matches(httpx.URL("http://example.com"))
    False

    # With domain matching...
    >>> pattern = URLPattern("https://example.com")
    >>> pattern.matches(httpx.URL("https://example.com"))
    True
    >>> pattern.matches(httpx.URL("http://example.com"))
    False
    >>> pattern.matches(httpx.URL("https://other.com"))
    False

    # Wildcard scheme, with domain matching...
    >>> pattern = URLPattern("all://example.com")
    >>> pattern.matches(httpx.URL("https://example.com"))
    True
    >>> pattern.matches(httpx.URL("http://example.com"))
    True
    >>> pattern.matches(httpx.URL("https://other.com"))
    False

    # With port matching...
    >>> pattern = URLPattern("https://example.com:1234")
    >>> pattern.matches(httpx.URL("https://example.com:1234"))
    True
    >>> pattern.matches(httpx.URL("https://example.com"))
    False
    patternr   Nc                 C   s  ddl m} |rd|vrtd| d| d||}|| _|jdkr%dn|j| _|jd	kr0dn|j| _|j| _|jr@|jd	krEd | _d S |jd
rat	
|jdd  }t	d| d| _d S |jd	r}t	
|jdd  }t	d| d| _d S t	
|j}t	d| d| _d S )Nr   r   :zUProxy keys should use proper URL forms rather than plain scheme strings. Instead of "z", use "z://"r|   r%   r   z*.r9   z^.+\.$z^(.+\.)?^)_urlsr   rT   r   ru   rx   rs   
host_regex
startswithr   r   compile)r   r   r   rP   domainr   r   r   __init__  s0   
zURLPattern.__init__rw   r   c                 C   sV   | j r| j |j krdS | jr| jd ur| j|jsdS | jd ur)| j|jkr)dS dS )NFT)ru   rx   r   r.   rs   r   rw   r   r   r   matches  s   
zURLPattern.matchesc                 C   s4   | j durdnd}t| j }t| j }|||fS )z
        The priority allows URLPattern instances to be sortable, so that
        we can match from most specific to least specific.
        Nr   r   )rs   lenrx   ru   )r   Zport_priorityZhost_priorityZscheme_priorityr   r   r   priority  s   
zURLPattern.priorityc                 C   s
   t | jS r   )hashr   r   r   r   r   __hash__  s   
zURLPattern.__hash__c                 C   s   | j |j k S r   )r   r   r   r   r   __lt__  s   zURLPattern.__lt__c                 C   s   t |to
| j|jkS r   )r   r   r   r   r   r   r   __eq__  r   zURLPattern.__eq__)r   r   r   __doc__r&   r   boolr   propertyr3   Tupleintr   r   r   Anyr   r   r   r   r   r   c  s    )r   r   c                 C   0   zt | dd  W dS  ty   Y dS w N/r   FT)	ipaddressIPv4AddressrS   	Exceptionr   r   r   r   r        r   c                 C   r   r   )r   IPv6AddressrS   r   r   r   r   r   r     r   r   r   )r=   )Cr)   email.messager`   r   r   rJ   r   r   r3   pathlibr   urllib.requestr   r   _typesr   TYPE_CHECKINGr   r   r/   updateranger   joinkeysr5   Unionr&   r   r   Optionalr    r"   r(   r,   r7   rD   rE   rF   rI   rN   ListDictr]   re   rj   Iterabler   AnyStrIteratorrn   r   rv   ry   r{   r   r   ri   rk   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s    


"%
	"/"m