U
    nËj]   ã                   @  s   d dl m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	 ej
rVddlmZ ddd	œd
d„Zddœdd„Zd+ddddœdd„Zd,ddddœdd„Zddddœdd„Zddd	œdd„Zddd œd!d"„ZG d#d$„ d$ƒZdd%d&œd'd(„Zdd%d&œd)d*„ZdS )-é    )ÚannotationsN)Ú
getproxiesé   )ÚPrimitiveData©ÚURLr   Ústr)ÚvalueÚreturnc                 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.

    Note that we prefer JSON-style 'true'/'false' for boolean values here.
    TÚtrueFÚfalseNÚ )r   ©r	   © r   ú0/tmp/pip-unpacked-wheel-7ig9zwdf/httpx/_utils.pyÚprimitive_value_to_str   s    r   zdict[str, str | None]©r
   c                  C  sò   t ƒ } i }dD ]6}|  |¡r| | }d|kr0|nd|› �||› d�< qdd„ |  dd¡ d¡D ƒ}|D ]†}|d	krzi   S |rfd|kr�d
||< qft|ƒr¨d
|d|› �< qft|ƒrÂd
|d|› d�< qf| ¡ dkrÞd
|d|› �< qfd
|d|› �< qf|S )z+Gets proxy information from the environment)ÚhttpÚhttpsÚallz://zhttp://c                 S  s   g | ]}|  ¡ ‘qS r   )Ústrip)Ú.0Úhostr   r   r   Ú
<listcomp>/   s     z+get_environment_proxies.<locals>.<listcomp>Únor   ú,Ú*Nzall://zall://[ú]Ú	localhostzall://*)r   ÚgetÚsplitÚis_ipv4_hostnameÚis_ipv6_hostnameÚlower)Z
proxy_infoZmountsÚschemeÚhostnameZno_proxy_hostsr   r   r   Úget_environment_proxies   s,    
ÿ
r&   úutf-8zstr | bytesÚbytes)r	   Úencodingr
   c                 C  s   t | tƒr|  |¡S | S ©N©Ú
isinstancer   Úencode©r	   r)   r   r   r   Úto_bytesO   s    r/   c                 C  s   t | tƒr| S |  |¡S r*   )r,   r   Údecoder.   r   r   r   Úto_strS   s    r1   ztyping.AnyStr)r	   Úmatch_type_ofr
   c                 C  s   t |tƒr| S |  ¡ S r*   r+   )r	   r2   r   r   r   Úto_bytes_or_strW   s    r3   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    r6   ú
typing.Anyz
int | None)Ústreamr
   c                 C  sx   z|   ¡ }t |¡j}W nZ ttfk
rr   z$|  ¡ }|  dtj¡}|  |¡ W n ttfk
rl   Y Y dS X Y nX |S )zs
    Given a file-like stream object, return its length in number of bytes
    without reading it into memory.
    r   N)	ÚfilenoÚosÚfstatÚst_sizeÚAttributeErrorÚOSErrorÚtellÚseekÚSEEK_END)r8   ÚfdÚlengthÚoffsetr   r   r   Úpeek_filelike_length_   s    rE   c                   @  sp   e Zd ZdZdddœdd„Zddd	œd
d„Zeddœdd„ƒZddœdd„Zd dd	œdd„Z	ddd	œ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
    r   ÚNone)Úpatternr
   c                 C  s  ddl m} |r.d|kr.td|› d|› d�ƒ‚||ƒ}|| _|jdkrJdn|j| _|jd	kr`dn|j| _|j| _|jr€|jd	krˆd | _nŒ|j d
¡r¾t	 
|jdd … ¡}t	 d|› d�¡| _nV|j d	¡rôt	 
|jdd … ¡}t	 d|› d�¡| _n 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*.é   z^.+\.ú$z^(.+\.)?ú^)Ú_urlsr   Ú
ValueErrorrH   r$   r   ÚportÚ
host_regexÚ
startswithÚreÚescapeÚcompile)ÚselfrH   r   ÚurlÚdomainr   r   r   Ú__init__¢   s(    ÿzURLPattern.__init__r   Úbool)Úotherr
   c                 C  sV   | j r| j |j krdS | jr8| jd k	r8| j |j¡s8dS | jd k	rR| j|jkrRdS dS )NFT)r$   r   rP   ÚmatchrO   ©rU   rZ   r   r   r   ÚmatchesÀ   s    ÿþýzURLPattern.matchesztuple[int, int, int]r   c                 C  s4   | j dk	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   )rO   Úlenr   r$   )rU   Zport_priorityZhost_priorityZscheme_priorityr   r   r   ÚpriorityÍ   s    zURLPattern.priorityÚintc                 C  s
   t | jƒS r*   )ÚhashrH   )rU   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__r7   c                 C  s   t |tƒo| j|jkS r*   )r,   rF   rH   r\   r   r   r   Ú__eq__á   s    zURLPattern.__eq__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rX   r]   Úpropertyr_   rb   rc   rd   r   r   r   r   rF   x   s   )rF   rY   )r%   r
   c                 C  s4   zt  |  d¡d ¡ W n tk
r.   Y dS X dS ©Nú/r   FT)Ú	ipaddressÚIPv4Addressr    Ú	Exception©r%   r   r   r   r!   å   s
    r!   c                 C  s4   zt  |  d¡d ¡ W n tk
r.   Y dS X dS rj   )rl   ÚIPv6Addressr    rn   ro   r   r   r   r"   í   s
    r"   )r'   )r'   )Ú
__future__r   rl   r:   rR   ÚtypingÚurllib.requestr   Ú_typesr   ÚTYPE_CHECKINGrM   r   r   r&   r/   r1   r3   r6   rE   rF   r!   r"   r   r   r   r   Ú<module>   s$   1m