U
    nËj²  ã                   @  sz  d dl m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	m
Z
 d dlmZ ddlmZ ddlmZmZmZ ddlmZmZmZmZmZmZ dd	lmZ dd
lmZmZmZmZ ddl m!Z!m"Z"m#Z#m$Z$ ddl%m&Z& ddl'm(Z(m)Z) ddl*m+Z+m,Z, ddl-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z: ddl;m<Z<m=Z= ddl>m?Z?m@Z@ ejA�rld dlBZBdddgZCejDddd�ZEejDddd�ZFddddœdd„ZGdddœdd „ZHdddd!œd"d#„ZIG d$d%„ d%ƒZJeJƒ ZKe Ld&¡ZMd'e› �ZNd( Od)d*„ e P¡ D ƒ¡ZQG d+d,„ d,ejRƒZSG d-d.„ d.e9ƒZTG d/d0„ d0e.ƒZUejVd1ejWf ZXG d2d3„ d3ƒZYG d4d„ deYƒZZG d5d„ deYƒZ[dS )6é    )ÚannotationsN)ÚasynccontextmanagerÚcontextmanager)ÚTracebackTypeé   )Ú__version__)ÚAuthÚ	BasicAuthÚFunctionAuth)ÚDEFAULT_LIMITSÚDEFAULT_MAX_REDIRECTSÚDEFAULT_TIMEOUT_CONFIGÚLimitsÚProxyÚTimeout)ÚSUPPORTED_DECODERS)Ú
InvalidURLÚRemoteProtocolErrorÚTooManyRedirectsÚrequest_context)ÚCookiesÚHeadersÚRequestÚResponse)Úcodes)ÚAsyncBaseTransportÚBaseTransport)ÚAsyncHTTPTransportÚHTTPTransport)ÚAsyncByteStreamÚ	AuthTypesÚ	CertTypesÚCookieTypesÚHeaderTypesÚ
ProxyTypesÚQueryParamTypesÚRequestContentÚRequestDataÚRequestExtensionsÚRequestFilesÚSyncByteStreamÚTimeoutTypes)ÚURLÚQueryParams)Ú
URLPatternÚget_environment_proxiesÚUSE_CLIENT_DEFAULTÚAsyncClientÚClientÚT)ÚboundÚUr,   Úbool)ÚurlÚlocationÚreturnc                 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'
    FÚhttpéP   Úhttpsé»  )ÚhostÚschemeÚ_port_or_default)r7   r8   © rA   ú1/tmp/pip-unpacked-wheel-7ig9zwdf/httpx/_client.pyÚ_is_https_redirect>   s    

ÿþ
ürC   z
int | None©r7   r9   c                 C  s"   | j d k	r| j S dddœ | j¡S )Nr;   r=   )r:   r<   )ÚportÚgetr?   ©r7   rA   rA   rB   r@   M   s    
r@   )r7   Úotherr9   c                 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.
    )r?   r>   r@   )r7   rH   rA   rA   rB   Ú_same_originS   s
    
ÿýrI   c                   @  s   e Zd ZdZdS )ÚUseClientDefaulta<  
    For some parameters such as `auth=...` and `timeout=...` we need to be able
    to indicate the default "unset" state, in a way that is distinctly different
    to using `None`.

    The default "unset" state indicates that whatever default is set on the
    client should be used. This is different to setting `None`, which
    explicitly disables the parameter, possibly overriding a client default.

    For example we use `timeout=USE_CLIENT_DEFAULT` in the `request()` signature.
    Omitting the `timeout` parameter will send a request using whatever default
    timeout has been configured on the client. Including `timeout=None` will
    ensure no timeout is used.

    Note that user code shouldn't need to use the `USE_CLIENT_DEFAULT` constant,
    but it is used internally when a parameter is not included.
    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rA   rA   rA   rB   rJ   ^   s   rJ   Zhttpxzpython-httpx/z, c                 C  s   g | ]}|d kr|‘qS )ÚidentityrA   )Ú.0ÚkeyrA   rA   rB   Ú
<listcomp>y   s      rR   c                   @  s   e Zd ZdZdZdZdS )ÚClientStater   é   é   N)rK   rL   rM   ÚUNOPENEDÚOPENEDÚCLOSEDrA   rA   rA   rB   rS   }   s   rS   c                   @  s@   e Zd ZdZdddddœdd„Zd	d
œdd„Zdd
œdd„ZdS )ÚBoundSyncStreamz“
    A byte stream that is bound to a given response instance, and that
    ensures the `response.elapsed` is set once the response is closed.
    r*   r   ÚfloatÚNone©ÚstreamÚresponseÚstartr9   c                 C  s   || _ || _|| _d S ©N©Ú_streamÚ	_responseÚ_start©Úselfr]   r^   r_   rA   rA   rB   Ú__init__‘   s    zBoundSyncStream.__init__ztyping.Iterator[bytes]©r9   c                 c  s   | j D ]
}|V  qd S r`   ©rb   ©rf   ÚchunkrA   rA   rB   Ú__iter__˜   s    
zBoundSyncStream.__iter__c                 C  s,   t  ¡ | j }tj|d�| j_| j ¡  d S ©N)Úseconds)	ÚtimeÚperf_counterrd   ÚdatetimeÚ	timedeltarc   Úelapsedrb   Úclose©rf   rs   rA   rA   rB   rt   œ   s    zBoundSyncStream.closeN)rK   rL   rM   rN   rg   rl   rt   rA   rA   rA   rB   rY   ‹   s   rY   c                   @  s@   e Zd ZdZdddddœdd„Zd	d
œdd„Zdd
œdd„ZdS )ÚBoundAsyncStreamzš
    An async byte stream that is bound to a given response instance, and that
    ensures the `response.elapsed` is set once the response is closed.
    r   r   rZ   r[   r\   c                 C  s   || _ || _|| _d S r`   ra   re   rA   rA   rB   rg   ¨   s    zBoundAsyncStream.__init__ztyping.AsyncIterator[bytes]rh   c                 C s    | j 2 z3 d H W }|V  q6 d S r`   ri   rj   rA   rA   rB   Ú	__aiter__¯   s    zBoundAsyncStream.__aiter__c                 Ã  s2   t  ¡ | j }tj|d�| j_| j ¡ I d H  d S rm   )	ro   rp   rd   rq   rr   rc   rs   rb   Úacloseru   rA   rA   rB   rx   ³   s    zBoundAsyncStream.acloseN)rK   rL   rM   rN   rg   rw   rx   rA   rA   rA   rB   rv   ¢   s   rv   .c                   @  sº  e Zd Zddddededddddœddd	d
dddddddddœdd„Zeddœdd„ƒZeddœdd„ƒZdddœdd„Z	dddd œd!d"„Z
ed#dœd$d%„ƒZejddd&œd'd%„ƒZed(dœd)d*„ƒZejd(dd+œd,d*„ƒZed-dœd.d/„ƒZejd0dd1œd2d/„ƒZeddœd3d4„ƒZejdddœd5d4„ƒZed6dœd7d8„ƒZejd9dd:œd;d8„ƒZed<dœd=d>„ƒZejd?dd@œdAd>„ƒZedBdœdCdD„ƒZejdEddFœdGdD„ƒZdddddddeddHœ	dIddJdKdLdMdd	d
dNdOdPdQœdRdS„ZdddœdTdU„Zdud
d
d@œdVdW„Zdvd	d	d:œdXdY„ZdwdddFœdZd[„Zdd-d1œd\d]„ZefdPd^d_d`œdadb„ZdPdcdPddœdedf„ZdPdcdIddœdgdh„ZdPdcdddœdidj„ZdPddId6dkœdldm„ZdPdIdndoœdpdq„ZdPddrœdsdt„Z dS )xÚ
BaseClientNFÚ Túutf-8©ÚauthÚparamsÚheadersÚcookiesÚtimeoutÚfollow_redirectsÚmax_redirectsÚevent_hooksÚbase_urlÚ	trust_envÚdefault_encodingúAuthTypes | NoneúQueryParamTypes | NoneúHeaderTypes | NoneúCookieTypes | Noner+   r6   Úintú+None | typing.Mapping[str, list[EventHook]]ú	URL | strú#str | typing.Callable[[bytes], str]r[   )r}   r~   r   r€   r�   r‚   rƒ   r„   r…   r†   r‡   r9   c                C  sœ   |d kri n|}|   t|	ƒ¡| _|  |¡| _t|ƒ| _t|ƒ| _t	|ƒ| _
t|ƒ| _|| _|| _t| dg ¡ƒt| dg ¡ƒdœ| _|
| _|| _tj| _d S ©NÚrequestr^   )r‘   r^   )Ú_enforce_trailing_slashr,   Ú	_base_urlÚ_build_authÚ_authr-   Ú_paramsr   r   r   Ú_cookiesr   Ú_timeoutr‚   rƒ   ÚlistrF   Ú_event_hooksÚ
_trust_envÚ_default_encodingrS   rV   Ú_state)rf   r}   r~   r   r€   r�   r‚   rƒ   r„   r…   r†   r‡   rA   rA   rB   rg   ½   s    



þzBaseClient.__init__rh   c                 C  s   | j tjkS )z2
        Check if the client being closed
        )r�   rS   rX   ©rf   rA   rA   rB   Ú	is_closedß   s    zBaseClient.is_closedc                 C  s   | j S r`   )r›   rž   rA   rA   rB   r†   æ   s    zBaseClient.trust_envr,   rD   c                 C  s"   |j  d¡r|S |j|j d d�S )Nó   /©Úraw_path)r¢   ÚendswithÚ	copy_with©rf   r7   rA   rA   rB   r’   ê   s    z"BaseClient._enforce_trailing_slashúProxyTypes | Nonezdict[str, Proxy | None])ÚproxyÚallow_env_proxiesr9   c                 C  sL   |d kr$|r dd„ t ƒ  ¡ D ƒS i S t|ttfƒr<t|d�n|}d|iS d S )Nc                 S  s(   i | ] \}}||d krd nt |d�“qS )NrG   )r   )rP   rQ   r7   rA   rA   rB   Ú
<dictcomp>ô   s   ÿ z-BaseClient._get_proxy_map.<locals>.<dictcomp>rG   zall://)r/   ÚitemsÚ
isinstanceÚstrr,   r   )rf   r§   r¨   rA   rA   rB   Ú_get_proxy_mapï   s    þzBaseClient._get_proxy_mapr   c                 C  s   | j S r`   )r˜   rž   rA   rA   rB   r�   ý   s    zBaseClient.timeout)r�   r9   c                 C  s   t |ƒ| _d S r`   )r   r˜   )rf   r�   rA   rA   rB   r�     s    zdict[str, list[EventHook]]c                 C  s   | j S r`   )rš   rž   rA   rA   rB   r„     s    zBaseClient.event_hooks)r„   r9   c                 C  s(   t | dg ¡ƒt | dg ¡ƒdœ| _d S r�   )r™   rF   rš   )rf   r„   rA   rA   rB   r„   	  s    þzAuth | Nonec                 C  s   | j S )z¦
        Authentication class used when none is passed at the request-level.

        See also [Authentication][0].

        [0]: /quickstart/#authentication
        )r•   rž   rA   rA   rB   r}     s    	zBaseClient.authr    )r}   r9   c                 C  s   |   |¡| _d S r`   )r”   r•   ©rf   r}   rA   rA   rB   r}     s    c                 C  s   | j S )zK
        Base URL to use when sending requests with relative URLs.
        )r“   rž   rA   rA   rB   r…     s    zBaseClient.base_urlc                 C  s   |   t|ƒ¡| _d S r`   )r’   r,   r“   r¥   rA   rA   rB   r…   &  s    r   c                 C  s   | j S )z@
        HTTP headers to include when sending requests.
        )Ú_headersrž   rA   rA   rB   r   *  s    zBaseClient.headersr#   )r   r9   c                 C  s2   t dt d¡dt d¡dœƒ}| |¡ || _d S )Ns   */*Úasciis
   keep-alive)s   Accepts   Accept-Encodings
   Connections
   User-Agent)r   ÚACCEPT_ENCODINGÚencodeÚ
USER_AGENTÚupdater¯   )rf   r   Zclient_headersrA   rA   rB   r   1  s    üÿ
r   c                 C  s   | j S )zA
        Cookie values to include when sending requests.
        )r—   rž   rA   rA   rB   r€   >  s    zBaseClient.cookiesr"   )r€   r9   c                 C  s   t |ƒ| _d S r`   )r   r—   )rf   r€   rA   rA   rB   r€   E  s    r-   c                 C  s   | j S )zO
        Query parameters to include in the URL when sending requests.
        )r–   rž   rA   rA   rB   r~   I  s    zBaseClient.paramsr%   )r~   r9   c                 C  s   t |ƒ| _d S r`   )r-   r–   )rf   r~   rA   rA   rB   r~   P  s    )	ÚcontentÚdataÚfilesÚjsonr~   r   r€   r�   Ú
extensionsr¬   úRequestContent | NoneúRequestData | NoneúRequestFiles | Noneútyping.Any | NoneúTimeoutTypes | UseClientDefaultúRequestExtensions | Noner   )Úmethodr7   rµ   r¶   r·   r¸   r~   r   r€   r�   r¹   r9   c       	         C  sŠ   |   |¡}|  |¡}|  |	¡}	|  |¡}|dkr4i n|}d|krnt|
tƒrP| jnt|
ƒ}
tf |d|
 	¡ i—Ž}t
|||||||||	|d�
S )aR  
        Build and return a request instance.

        * The `params`, `headers` and `cookies` arguments
        are merged with any values set on the client.
        * The `url` argument is merged with any `base_url` set on the client.

        See also: [Request instances][0]

        [0]: /advanced/clients/#request-instances
        Nr�   )rµ   r¶   r·   r¸   r~   r   r€   r¹   )Ú
_merge_urlÚ_merge_headersÚ_merge_cookiesÚ_merge_queryparamsr«   rJ   r�   r   ÚdictÚas_dictr   )rf   rÀ   r7   rµ   r¶   r·   r¸   r~   r   r€   r�   r¹   rA   rA   rB   Úbuild_requestT  s.    



ÿýözBaseClient.build_requestc                 C  s4   t |ƒ}|jr0| jj|j d¡ }| jj|d�S |S )z‹
        Merge a URL argument together with any 'base_url' on the client,
        to create the URL used for the outgoing request.
        r    r¡   )r,   Úis_relative_urlr…   r¢   Úlstripr¤   )rf   r7   Z	merge_urlZmerge_raw_pathrA   rA   rB   rÁ   ‡  s
    zBaseClient._merge_urlc                 C  s&   |s
| j r"t| j ƒ}| |¡ |S |S )z�
        Merge a cookies argument together with any cookies on the client,
        to create the cookies used for the outgoing request.
        )r€   r   r´   )rf   r€   Úmerged_cookiesrA   rA   rB   rÃ   �  s
    


zBaseClient._merge_cookiesc                 C  s   t | jƒ}| |¡ |S )z�
        Merge a headers argument together with any headers on the client,
        to create the headers used for the outgoing request.
        )r   r   r´   )rf   r   Zmerged_headersrA   rA   rB   rÂ   ¨  s    

zBaseClient._merge_headersc                 C  s"   |s
| j rt| j ƒ}| |¡S |S )zœ
        Merge a queryparams argument together with any queryparams on the client,
        to create the queryparams used for the outgoing request.
        )r~   r-   Úmerge)rf   r~   Zmerged_queryparamsrA   rA   rB   rÄ   ±  s    


zBaseClient._merge_queryparamsc                 C  s\   |d krd S t |tƒr*t|d |d d�S t |tƒr8|S t|ƒrJt|d�S td|›�ƒ‚d S )Nr   r   ©ÚusernameÚpassword)ÚfunczInvalid "auth" argument: )r«   Útupler	   r   Úcallabler
   Ú	TypeErrorr®   rA   rA   rB   r”   ½  s    


zBaseClient._build_authú#AuthTypes | UseClientDefault | Noner   )r‘   r}   r9   c                 C  sR   t |tƒr| jn|  |¡}|d k	r&|S |jj|jj }}|s@|rLt||d�S tƒ S )NrÌ   )	r«   rJ   r•   r”   r7   rÍ   rÎ   r	   r   )rf   r‘   r}   rÍ   rÎ   rA   rA   rB   Ú_build_request_authÉ  s    ÿzBaseClient._build_request_authr   )r‘   r^   r9   c                 C  sR   |   ||¡}|  ||¡}|  |||¡}|  ||¡}t| jƒ}t||||||jd�S )zƒ
        Given a request and a redirect response, return a new request that
        should be used to effect the redirect.
        )rÀ   r7   r   r€   r]   r¹   )Ú_redirect_methodÚ_redirect_urlÚ_redirect_headersÚ_redirect_streamr   r€   r   r¹   )rf   r‘   r^   rÀ   r7   r   r]   r€   rA   rA   rB   Ú_build_redirect_requestÛ  s    
úz"BaseClient._build_redirect_requestc                 C  sR   |j }|jtjkr|dkrd}|jtjkr6|dkr6d}|jtjkrN|dkrNd}|S )z‹
        When being redirected we may want to change the method of the request
        based on certain specs or browser behavior.
        ÚHEADÚGETÚPOST)rÀ   Ústatus_coder   Ú	SEE_OTHERÚFOUNDÚMOVED_PERMANENTLY)rf   r‘   r^   rÀ   rA   rA   rB   rÕ   î  s    zBaseClient._redirect_methodc              
   C  s    |j d }zt|ƒ}W n8 tk
rN } ztd|› d�|d�d‚W 5 d}~X Y nX |jrl|jsl|j|jjd�}|jr~|j 	|¡}|jj
rœ|j
sœ|j|jj
d�}|S )z<
        Return the URL for the redirect to follow.
        ZLocationz Invalid URL in location header: Ú.©r‘   N)r>   )Úfragment)r   r,   r   r   r?   r>   r¤   r7   rÈ   Újoinrã   )rf   r‘   r^   r8   r7   ÚexcrA   rA   rB   rÖ     s"    

 ÿþzBaseClient._redirect_url)r‘   r7   rÀ   r9   c                 C  sx   t |jƒ}t||jƒs>t|j|ƒs.| dd¡ |j d¡|d< ||jkrh|dkrh| dd¡ | dd¡ | dd¡ |S )	zR
        Return the headers that should be used for the redirect request.
        ÚAuthorizationNr°   ÚHostrÛ   zContent-LengthzTransfer-EncodingÚCookie)	r   r   rI   r7   rC   ÚpopÚnetlocÚdecoderÀ   )rf   r‘   r7   rÀ   r   rA   rA   rB   r×   "  s    
zBaseClient._redirect_headersz'SyncByteStream | AsyncByteStream | None)r‘   rÀ   r9   c                 C  s   ||j kr|dkrdS |jS )zO
        Return the body that should be used for the redirect request.
        rÛ   N)rÀ   r]   )rf   r‘   rÀ   rA   rA   rB   rØ   =  s    zBaseClient._redirect_stream©r‘   r9   c                 C  sD   d|j kr@t| jtƒr| jnt| jƒ}tf |j d| ¡ i—Ž|_ d S )Nr�   )r¹   r«   r�   rJ   r   rÅ   rÆ   )rf   r‘   r�   rA   rA   rB   Ú_set_timeoutH  s    

ÿýzBaseClient._set_timeout)N)N)N)!rK   rL   rM   r   r   rg   ÚpropertyrŸ   r†   r’   r­   r�   Úsetterr„   r}   r…   r   r€   r~   r0   rÇ   rÁ   rÃ   rÂ   rÄ   r”   rÔ   rÙ   rÕ   rÖ   r×   rØ   rí   rA   rA   rA   rB   ry   ¼   sŒ   ó("
ó(3
 ÿýry   c                      sr  e Zd ZdZdddddddddddedeedddddœdd	d
ddddddddddddddddddœ‡ fdd„Zdddddedfdddddddddœdd„Zdddddefd dddddddd!œd"d#„Z	d$dd%œd&d'„Z
dddddddeeedd(œd)dd*d+d,d-d	d
dd.d/d0d1d2d3œd4d5„Zedddddddeeedd(œd)dd*d+d,d-d	d
dd.d/d0d1d6d3œd7d8„ƒZdeed9œd:dd.d/d2d;œd<d=„Zd:d>dd?d2d@œdAdB„Zd:dd?d2dCœdDdE„Zd:d2dFœdGdH„ZdddeeeddIœdd	d
dd.d/d0d1d2dJœ	dKdL„ZdddeeeddIœdd	d
ddMd/d0d1d2dJœ	dNdO„ZdddeeeddIœdd	d
ddMd/d0d1d2dJœ	dPdQ„Zdddddddeeedd(œdd*d+d,d-d	d
ddMd/d0d1d2dRœdSdT„Zdddddddeeedd(œdd*d+d,d-d	d
ddMd/d0d1d2dRœdUdV„Zdddddddeeedd(œdd*d+d,d-d	d
ddMd/d0d1d2dRœdWdX„ZdddeeeddIœdd	d
ddMd/d0d1d2dJœ	dYdZ„Zdd[œd\d]„Zd^d^d_œd`da„Zdhdbdcddddeœdfdg„Z‡  ZS )ir2   av  
    An HTTP client, with connection pooling, HTTP/2, redirects, cookie persistence, etc.

    It can be shared between threads.

    Usage:

    ```python
    >>> client = httpx.Client()
    >>> response = client.get('https://example.org')
    ```

    **Parameters:**

    * **auth** - *(optional)* An authentication class to use when sending
    requests.
    * **params** - *(optional)* Query parameters to include in request URLs, as
    a string, dictionary, or sequence of two-tuples.
    * **headers** - *(optional)* Dictionary of HTTP headers to include when
    sending requests.
    * **cookies** - *(optional)* Dictionary of Cookie items to include when
    sending requests.
    * **verify** - *(optional)* Either `True` to use an SSL context with the
    default CA bundle, `False` to disable verification, or an instance of
    `ssl.SSLContext` to use a custom context.
    * **http2** - *(optional)* A boolean indicating if HTTP/2 support should be
    enabled. Defaults to `False`.
    * **proxy** - *(optional)* A proxy URL where all the traffic should be routed.
    * **timeout** - *(optional)* The timeout configuration to use when sending
    requests.
    * **limits** - *(optional)* The limits configuration to use.
    * **max_redirects** - *(optional)* The maximum number of redirect responses
    that should be followed.
    * **base_url** - *(optional)* A URL to use as the base when building
    request URLs.
    * **transport** - *(optional)* A transport class to use for sending requests
    over the network.
    * **trust_env** - *(optional)* Enables or disables usage of environment
    variables for configuration.
    * **default_encoding** - *(optional)* The default encoding to use for decoding
    response text, if no charset information is included in a response Content-Type
    header. Set to a callable for automatic character set detection. Default: "utf-8".
    NTFrz   r{   )r}   r~   r   r€   ÚverifyÚcertr†   Úhttp1Úhttp2r§   Úmountsr�   r‚   Úlimitsrƒ   r„   r…   Ú	transportr‡   rˆ   r‰   rŠ   r‹   ússl.SSLContext | str | boolúCertTypes | Noner6   r¦   z0None | typing.Mapping[str, BaseTransport | None]r+   r   rŒ   r�   rŽ   zBaseTransport | Noner�   r[   )r}   r~   r   r€   rð   rñ   r†   rò   ró   r§   rô   r�   r‚   rõ   rƒ   r„   r…   rö   r‡   r9   c                  sâ   t ƒ j|||||||||ˆ|d� ˆrRzdd l}W n tk
rP   tdƒd ‚Y nX ˆo\|d k}ˆ |
|¡}ˆjˆˆ ˆˆˆˆ|d�ˆ_‡ ‡‡‡‡‡‡fdd„| ¡ D ƒˆ_|d k	rÊˆj 	dd„ | ¡ D ƒ¡ t
tˆj ¡ ƒƒˆ_d S )Nr|   r   úuUsing http2=True, but the 'h2' package is not installed. Make sure to install httpx using `pip install httpx[http2]`.©rð   rñ   r†   rò   ró   rõ   rö   c                   s:   i | ]2\}}t |ƒ|d krd nˆj|ˆˆ ˆˆˆˆd�“qS ©N)rð   rñ   r†   rò   ró   rõ   ©r.   Ú_init_proxy_transport©rP   rQ   r§   ©rñ   rò   ró   rõ   rf   r†   rð   rA   rB   r©   ¹  s   õÿùz#Client.__init__.<locals>.<dictcomp>c                 S  s   i | ]\}}t |ƒ|“qS rA   ©r.   ©rP   rQ   rö   rA   rA   rB   r©   É  s      ©Úsuperrg   Úh2ÚImportErrorr­   Ú_init_transportÚ
_transportrª   Ú_mountsr´   rÅ   Úsorted)rf   r}   r~   r   r€   rð   rñ   r†   rò   ró   r§   rô   r�   r‚   rõ   rƒ   r„   r…   rö   r‡   r  r¨   Ú	proxy_map©Ú	__class__rÿ   rB   rg     sR    õÿýù	ôÿzClient.__init__r   ©rð   rñ   r†   rò   ró   rõ   rö   r9   c                 C  s    |d k	r|S t ||||||d�S rû   ©r   ©rf   rð   rñ   r†   rò   ró   rõ   rö   rA   rA   rB   r  Î  s    
úzClient._init_transportr   ©r§   rð   rñ   r†   rò   ró   rõ   r9   c              	   C  s   t |||||||d�S ©N)rð   rñ   r†   rò   ró   rõ   r§   r  ©rf   r§   rð   rñ   r†   rò   ró   rõ   rA   rA   rB   rý   ä  s    
ùzClient._init_proxy_transportr,   rD   c                 C  s:   | j  ¡ D ](\}}| |¡r
|dkr*| jn|  S q
| jS ©z›
        Returns the transport instance that should be used for a given URL.
        This will either be the standard connection pool, or a proxy.
        N©r  rª   Úmatchesr  ©rf   r7   Úpatternrö   rA   rA   rB   Ú_transport_for_urlø  s    
zClient._transport_for_url©rµ   r¶   r·   r¸   r~   r   r€   r}   r‚   r�   r¹   r¬   rº   r»   r¼   r½   rÓ   úbool | UseClientDefaultr¾   r¿   r   ©rÀ   r7   rµ   r¶   r·   r¸   r~   r   r€   r}   r‚   r�   r¹   r9   c                C  sL   |	dk	rd}t j|tdd� | j|||||||||	||d�}| j||
|d�S )a©  
        Build and send a request.

        Equivalent to:

        ```python
        request = client.build_request(...)
        response = client.send(request, ...)
        ```

        See `Client.build_request()`, `Client.send()` and
        [Merging of configuration][0] for how the various parameters
        are merged with client-level configuration.

        [0]: /advanced/clients/#merging-of-configuration
        Nú®Setting per-request cookies=<...> is being deprecated, because the expected behaviour on cookie persistence is ambiguous. Set cookies directly on the client instance instead.rT   ©Ú
stacklevel©rÀ   r7   rµ   r¶   r·   r¸   r~   r   r€   r�   r¹   ©r}   r‚   ©ÚwarningsÚwarnÚDeprecationWarningrÇ   Úsend©rf   rÀ   r7   rµ   r¶   r·   r¸   r~   r   r€   r}   r‚   r�   r¹   Úmessager‘   rA   rA   rB   r‘     s$    !ÿõzClient.requestztyping.Iterator[Response]c                c  sL   | j |||||||||	||d�}| j||
|dd�}z
|V  W 5 | ¡  X dS ©a  
        Alternative to `httpx.request()` that streams the response body
        instead of loading it into memory at once.

        **Parameters**: See `httpx.request`.

        See also: [Streaming Responses][0]

        [0]: /quickstart#streaming-responses
        r  T)r‘   r}   r‚   r]   N)rÇ   r%  rt   ©rf   rÀ   r7   rµ   r¶   r·   r¸   r~   r   r€   r}   r‚   r�   r¹   r‘   r^   rA   rA   rB   r]   ;  s,    õü
zClient.stream©r]   r}   r‚   r   ©r‘   r]   r}   r‚   r9   c             
   C  sž   | j tjkrtdƒ‚tj| _ t|tƒr,| jn|}|  |¡ |  	||¡}| j
|||g d�}z|sf| ¡  |W S  tk
r˜ } z| ¡  |‚W 5 d}~X Y nX dS )a‹  
        Send a request.

        The request is sent as-is, unmodified.

        Typically you'll want to build one with `Client.build_request()`
        so that any client-level configuration is merged into the request,
        but passing an explicit `httpx.Request()` is supported as well.

        See also: [Request instances][0]

        [0]: /advanced/clients/#request-instances
        ú5Cannot send a request, as the client has been closed.©r}   r‚   ÚhistoryN)r�   rS   rX   ÚRuntimeErrorrW   r«   rJ   r‚   rí   rÔ   Ú_send_handling_authÚreadÚBaseExceptionrt   ©rf   r‘   r]   r}   r‚   r^   rå   rA   rA   rB   r%  o  s,    ÿý
üzClient.sendr   úlist[Response]©r‘   r}   r‚   r.  r9   c           	   
   C  sº   |  |¡}z t|ƒ}| j|||d�}zRz| |¡}W n tk
rR   | Y W W ¢\S X t|ƒ|_| ¡  |}| 	|¡ W q t
k
r¤ } z| ¡  |‚W 5 d }~X Y qX qW 5 | ¡  X d S ©N)r‚   r.  )Zsync_auth_flowrt   ÚnextÚ_send_handling_redirectsr%  ÚStopIterationr™   r.  r1  Úappendr2  ©	rf   r‘   r}   r‚   r.  Z	auth_flowr^   Únext_requestrå   rA   rA   rB   r0  ¢  s*    
ý
zClient._send_handling_auth©r‘   r‚   r.  r9   c              
   C  sÔ   t |ƒ| jkrtd|d�‚| jd D ]}||ƒ q$|  |¡}zb| jd D ]}||ƒ qHt|ƒ|_|jsl|W S |  ||¡}||g }|r�| 	¡  n||_
|W S W q  tk
rÌ } z| ¡  |‚W 5 d }~X Y q X q d S ©Nz#Exceeded maximum allowed redirects.râ   r‘   r^   )Úlenrƒ   r   rš   Ú_send_single_requestr™   r.  Úhas_redirect_locationrÙ   r1  r<  r2  rt   ©rf   r‘   r‚   r.  Úhookr^   rå   rA   rA   rB   r8  Ä  s.     ÿ






zClient._send_handling_redirectsrì   c              	   C  s¦   |   |j¡}t ¡ }t|jtƒs(tdƒ‚t|d�� | 	|¡}W 5 Q R X t|jtƒsXt
‚||_t|j||d�|_| j |¡ | j|_t d|j|j|j|j|j¡ |S )úL
        Sends a single request, without handling any redirections.
        z?Attempted to send an async request with a sync Client instance.râ   ©r^   r_   úHTTP Request: %s %s "%s %d %s")r  r7   ro   rp   r«   r]   r*   r/  r   Úhandle_requestÚAssertionErrorr‘   rY   r€   Úextract_cookiesrœ   r‡   ÚloggerÚinforÀ   Úhttp_versionrÝ   Úreason_phrase©rf   r‘   rö   r_   r^   rA   rA   rB   r@  é  s4    ÿ  ÿú	zClient._send_single_request©r~   r   r€   r}   r‚   r�   r¹   ©	r7   r~   r   r€   r}   r‚   r�   r¹   r9   c          	      C  s   | j d||||||||d�	S )úU
        Send a `GET` request.

        **Parameters**: See `httpx.request`.
        rÛ   rO  râ   ©	rf   r7   r~   r   r€   r}   r‚   r�   r¹   rA   rA   rB   rF     s    ÷z
Client.getúAuthTypes | UseClientDefaultc          	      C  s   | j d||||||||d�	S )úZ
        Send an `OPTIONS` request.

        **Parameters**: See `httpx.request`.
        ÚOPTIONSrO  râ   rR  rA   rA   rB   Úoptions)  s    ÷zClient.optionsc          	      C  s   | j d||||||||d�	S )úV
        Send a `HEAD` request.

        **Parameters**: See `httpx.request`.
        rÚ   rO  râ   rR  rA   rA   rB   ÚheadF  s    ÷zClient.head©r7   rµ   r¶   r·   r¸   r~   r   r€   r}   r‚   r�   r¹   r9   c                C  s$   | j d|||||||||	|
||d�S )úV
        Send a `POST` request.

        **Parameters**: See `httpx.request`.
        rÜ   r  râ   ©rf   r7   rµ   r¶   r·   r¸   r~   r   r€   r}   r‚   r�   r¹   rA   rA   rB   Úpostc  s    ózClient.postc                C  s$   | j d|||||||||	|
||d�S )úU
        Send a `PUT` request.

        **Parameters**: See `httpx.request`.
        ÚPUTr  râ   r[  rA   rA   rB   Úputˆ  s    óz
Client.putc                C  s$   | j d|||||||||	|
||d�S )úW
        Send a `PATCH` request.

        **Parameters**: See `httpx.request`.
        ÚPATCHr  râ   r[  rA   rA   rB   Úpatch­  s    ózClient.patchc          	      C  s   | j d||||||||d�	S )úX
        Send a `DELETE` request.

        **Parameters**: See `httpx.request`.
        ÚDELETErO  râ   rR  rA   rA   rB   ÚdeleteÒ  s    ÷zClient.deleterh   c                 C  sB   | j tjkr>tj| _ | j ¡  | j ¡ D ]}|dk	r(| ¡  q(dS ©z.
        Close transport and proxies.
        N)r�   rS   rX   r  rt   r  Úvalues)rf   rö   rA   rA   rB   rt   ï  s    
zClient.closer3   ©rf   r9   c                 C  s`   | j tjkr*tjdtjdi| j  }t|ƒ‚tj| _ | j ¡  | j 	¡ D ]}|d k	rF| ¡  qF| S ©Nz-Cannot open a client instance more than once.z9Cannot reopen a client instance, once it has been closed.)
r�   rS   rV   rW   rX   r/  r  Ú	__enter__r  rg  )rf   Úmsgrö   rA   rA   rB   rj  û  s     ýû

zClient.__enter__útype[BaseException] | NoneúBaseException | NoneúTracebackType | None©Úexc_typeÚ	exc_valueÚ	tracebackr9   c                 C  sB   t j| _| j |||¡ | j ¡ D ]}|d k	r"| |||¡ q"d S r`   )rS   rX   r�   r  Ú__exit__r  rg  )rf   rp  rq  rr  rö   rA   rA   rB   rs    s
    zClient.__exit__)NNN)rK   rL   rM   rN   r   r   r   rg   r  rý   r  r0   r‘   r   r]   r%  r0  r8  r@  rF   rV  rX  r\  r_  rb  re  rt   rj  rs  Ú__classcell__rA   rA   r  rB   r2   R  s  /ë<Qøøñ,8ñ.7ú3"%'ö"!ö"!ö"!ò*)ò*)ò*)ö"   üc                      sr  e Zd ZdZddddddddddedeeddddddœdd	d
ddddddddddddddddddœ‡ fdd„Zdddddedfdddddddddœdd„Zdddddefd dddddddd!œd"d#„Z	d$dd%œd&d'„Z
dddddddeeedd(œd)dd*d+d,d-d	d
dd.d/d0d1d2d3œd4d5„Zedddddddeeedd(œd)dd*d+d,d-d	d
dd.d/d0d1d6d3œd7d8„ƒZdeed9œd:dd.d/d2d;œd<d=„Zd:d>dd?d2d@œdAdB„Zd:dd?d2dCœdDdE„Zd:d2dFœdGdH„ZdddeeeddIœdd	d
dd.d/d0d1d2dJœ	dKdL„ZdddeeeddIœdd	d
ddMd/d0d1d2dJœ	dNdO„ZdddeeeddIœdd	d
ddMd/d0d1d2dJœ	dPdQ„Zdddddddeeedd(œdd*d+d,d-d	d
ddMd/d0d1d2dRœdSdT„Zdddddddeeedd(œdd*d+d,d-d	d
ddMd/d0d1d2dRœdUdV„Zdddddddeeedd(œdd*d+d,d-d	d
ddMd/d0d1d2dRœdWdX„ZdddeeeddIœdd	d
ddMd/d0d1d2dJœ	dYdZ„Zdd[œd\d]„Zd^d^d_œd`da„Zdhdbdcddddeœdfdg„Z‡  ZS )ir1   a¡  
    An asynchronous HTTP client, with connection pooling, HTTP/2, redirects,
    cookie persistence, etc.

    It can be shared between tasks.

    Usage:

    ```python
    >>> async with httpx.AsyncClient() as client:
    >>>     response = await client.get('https://example.org')
    ```

    **Parameters:**

    * **auth** - *(optional)* An authentication class to use when sending
    requests.
    * **params** - *(optional)* Query parameters to include in request URLs, as
    a string, dictionary, or sequence of two-tuples.
    * **headers** - *(optional)* Dictionary of HTTP headers to include when
    sending requests.
    * **cookies** - *(optional)* Dictionary of Cookie items to include when
    sending requests.
    * **verify** - *(optional)* Either `True` to use an SSL context with the
    default CA bundle, `False` to disable verification, or an instance of
    `ssl.SSLContext` to use a custom context.
    * **http2** - *(optional)* A boolean indicating if HTTP/2 support should be
    enabled. Defaults to `False`.
    * **proxy** - *(optional)* A proxy URL where all the traffic should be routed.
    * **timeout** - *(optional)* The timeout configuration to use when sending
    requests.
    * **limits** - *(optional)* The limits configuration to use.
    * **max_redirects** - *(optional)* The maximum number of redirect responses
    that should be followed.
    * **base_url** - *(optional)* A URL to use as the base when building
    request URLs.
    * **transport** - *(optional)* A transport class to use for sending requests
    over the network.
    * **trust_env** - *(optional)* Enables or disables usage of environment
    variables for configuration.
    * **default_encoding** - *(optional)* The default encoding to use for decoding
    response text, if no charset information is included in a response Content-Type
    header. Set to a callable for automatic character set detection. Default: "utf-8".
    NTFrz   r{   )r}   r~   r   r€   rð   rñ   rò   ró   r§   rô   r�   r‚   rõ   rƒ   r„   r…   rö   r†   r‡   rˆ   r‰   rŠ   r‹   r÷   rø   r6   r¦   z5None | typing.Mapping[str, AsyncBaseTransport | None]r+   r   rŒ   r�   rŽ   zAsyncBaseTransport | Noner�   r[   )r}   r~   r   r€   rð   rñ   rò   ró   r§   rô   r�   r‚   rõ   rƒ   r„   r…   rö   r†   r‡   r9   c                  sâ   t ƒ j|||||||||ˆ|d� ˆrRzdd l}W n tk
rP   tdƒd ‚Y nX ˆo\|d k}ˆ |	|¡}ˆjˆˆ ˆˆˆˆ|d�ˆ_‡ ‡‡‡‡‡‡fdd„| ¡ D ƒˆ_|
d k	rÊˆj 	dd„ |
 ¡ D ƒ¡ t
tˆj ¡ ƒƒˆ_d S )Nr|   r   rù   rú   c                   s:   i | ]2\}}t |ƒ|d krd nˆj|ˆˆ ˆˆˆˆd�“qS rû   rü   rþ   rÿ   rA   rB   r©   „  s   õÿùz(AsyncClient.__init__.<locals>.<dictcomp>c                 S  s   i | ]\}}t |ƒ|“qS rA   r   r  rA   rA   rB   r©   ”  s      r  )rf   r}   r~   r   r€   rð   rñ   rò   ró   r§   rô   r�   r‚   rõ   rƒ   r„   r…   rö   r†   r‡   r  r¨   r
  r  rÿ   rB   rg   I  sR    õÿýù
ôÿzAsyncClient.__init__r   r  c                 C  s    |d k	r|S t ||||||d�S rû   ©r   r  rA   rA   rB   r  ˜  s    
úzAsyncClient._init_transportr   r  c              	   C  s   t |||||||d�S r  ru  r  rA   rA   rB   rý   ®  s    
ùz!AsyncClient._init_proxy_transportr,   rD   c                 C  s:   | j  ¡ D ](\}}| |¡r
|dkr*| jn|  S q
| jS r  r  r  rA   rA   rB   r  Â  s    
zAsyncClient._transport_for_urlr  r¬   rº   r»   r¼   r½   rÓ   r  r¾   r¿   r   r  c                Ã  sR   |	dk	rd}t j|tdd� | j|||||||||	||d�}| j||
|d�I dH S )a¹  
        Build and send a request.

        Equivalent to:

        ```python
        request = client.build_request(...)
        response = await client.send(request, ...)
        ```

        See `AsyncClient.build_request()`, `AsyncClient.send()`
        and [Merging of configuration][0] for how the various parameters
        are merged with client-level configuration.

        [0]: /advanced/clients/#merging-of-configuration
        Nr  rT   r  r  r   r!  r&  rA   rA   rB   r‘   Í  s$    "ÿõzAsyncClient.requestztyping.AsyncIterator[Response]c                C sX   | j |||||||||	||d�}| j||
|dd�I dH }z
|V  W 5 | ¡ I dH  X dS r(  )rÇ   r%  rx   r)  rA   rA   rB   r]     s,    õü
zAsyncClient.streamr*  r   r+  c             
   Ã  s°   | j tjkrtdƒ‚tj| _ t|tƒr,| jn|}|  |¡ |  	||¡}| j
|||g d�I dH }z|sr| ¡ I dH  |W S  tk
rª } z| ¡ I dH  |‚W 5 d}~X Y nX dS )a�  
        Send a request.

        The request is sent as-is, unmodified.

        Typically you'll want to build one with `AsyncClient.build_request()`
        so that any client-level configuration is merged into the request,
        but passing an explicit `httpx.Request()` is supported as well.

        See also: [Request instances][0]

        [0]: /advanced/clients/#request-instances
        r,  r-  N)r�   rS   rX   r/  rW   r«   rJ   r‚   rí   rÔ   r0  Úareadr2  rx   r3  rA   rA   rB   r%  :  s,    ÿý
üzAsyncClient.sendr   r4  r5  c           	   
   Ã  sÞ   |  |¡}z¾| ¡ I d H }| j|||d�I d H }z^z| |¡I d H }W n tk
rd   | Y W W ¢hS X t|ƒ|_| ¡ I d H  |}| 	|¡ W q t
k
rÂ } z| ¡ I d H  |‚W 5 d }~X Y qX qW 5 | ¡ I d H  X d S r6  )Zasync_auth_flowrx   Ú	__anext__r8  ÚasendÚStopAsyncIterationr™   r.  rv  r:  r2  r;  rA   rA   rB   r0  m  s*    
ý
zAsyncClient._send_handling_authr=  c              
   Ã  sò   t |ƒ| jkrtd|d�‚| jd D ]}||ƒI d H  q$|  |¡I d H }zn| jd D ]}||ƒI d H  qTt|ƒ|_|js~|W S |  ||¡}||g }|r¨| 	¡ I d H  n||_
|W S W q  tk
rê } z| ¡ I d H  |‚W 5 d }~X Y q X q d S r>  )r?  rƒ   r   rš   r@  r™   r.  rA  rÙ   rv  r<  r2  rx   rB  rA   rA   rB   r8  �  s.     ÿ


z$AsyncClient._send_handling_redirectsrì   c              	   Ã  s¬   |   |j¡}t ¡ }t|jtƒs(tdƒ‚t|d�� | 	|¡I dH }W 5 Q R X t|jtƒs^t
‚||_t|j||d�|_| j |¡ | j|_t d|j|j|j|j|j¡ |S )rD  z?Attempted to send an sync request with an AsyncClient instance.râ   NrE  rF  )r  r7   ro   rp   r«   r]   r   r/  r   Zhandle_async_requestrH  r‘   rv   r€   rI  rœ   r‡   rJ  rK  rÀ   rL  rÝ   rM  rN  rA   rA   rB   r@  µ  s4    ÿ  ÿú	z AsyncClient._send_single_requestrO  rP  c          	      Ã  s"   | j d||||||||d�	I dH S )rQ  rÛ   rO  Nrâ   rR  rA   rA   rB   rF   ×  s    ÷zAsyncClient.getrS  c          	      Ã  s"   | j d||||||||d�	I dH S )rT  rU  rO  Nrâ   rR  rA   rA   rB   rV  ô  s    ÷zAsyncClient.optionsc          	      Ã  s"   | j d||||||||d�	I dH S )rW  rÚ   rO  Nrâ   rR  rA   rA   rB   rX    s    ÷zAsyncClient.headrY  c                Ã  s*   | j d|||||||||	|
||d�I dH S )rZ  rÜ   r  Nrâ   r[  rA   rA   rB   r\  .  s    ózAsyncClient.postc                Ã  s*   | j d|||||||||	|
||d�I dH S )r]  r^  r  Nrâ   r[  rA   rA   rB   r_  S  s    ózAsyncClient.putc                Ã  s*   | j d|||||||||	|
||d�I dH S )r`  ra  r  Nrâ   r[  rA   rA   rB   rb  x  s    ózAsyncClient.patchc          	      Ã  s"   | j d||||||||d�	I dH S )rc  rd  rO  Nrâ   rR  rA   rA   rB   re  �  s    ÷zAsyncClient.deleterh   c                 Ã  sN   | j tjkrJtj| _ | j ¡ I dH  | j ¡ D ]}|dk	r.| ¡ I dH  q.dS rf  )r�   rS   rX   r  rx   r  rg  )rf   r§   rA   rA   rB   rx   º  s    zAsyncClient.acloser5   rh  c                 Ã  sl   | j tjkr*tjdtjdi| j  }t|ƒ‚tj| _ | j ¡ I d H  | j 	¡ D ]}|d k	rL| ¡ I d H  qL| S ri  )
r�   rS   rV   rW   rX   r/  r  Ú
__aenter__r  rg  )rf   rk  r§   rA   rA   rB   rz  Æ  s     ýûzAsyncClient.__aenter__rl  rm  rn  ro  c                 Ã  sN   t j| _| j |||¡I d H  | j ¡ D ] }|d k	r(| |||¡I d H  q(d S r`   )rS   rX   r�   r  Ú	__aexit__r  rg  )rf   rp  rq  rr  r§   rA   rA   rB   r{  Ø  s
    zAsyncClient.__aexit__)NNN)rK   rL   rM   rN   r   r   r   rg   r  rý   r  r0   r‘   r   r]   r%  r0  r8  r@  rF   rV  rX  r\  r_  rb  re  rx   rz  r{  rt  rA   rA   r  rB   r1     s  0ë<Qøøñ,9ñ.7ú3"&&ö"!ö"!ö"!ò*)ò*)ò*)ö"   ü)\Ú
__future__r   rq   ÚenumÚloggingro   Útypingr"  Ú
contextlibr   r   Útypesr   r   r•   r   r	   r
   Ú_configr   r   r   r   r   r   Ú	_decodersr   Ú_exceptionsr   r   r   r   Z_modelsr   r   r   r   Z_status_codesr   Z_transports.baser   r   Z_transports.defaultr   r   Ú_typesr   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   Z_urlsr,   r-   Ú_utilsr.   r/   ÚTYPE_CHECKINGÚsslÚ__all__ÚTypeVarr3   r5   rC   r@   rI   rJ   r0   Ú	getLoggerrJ  r³   rä   Úkeysr±   ÚEnumrS   rY   rv   ÚCallableÚAnyZ	EventHookry   r2   r1   rA   rA   rA   rB   Ú<module>   sd    <


ÿ        N