a
    &ñ»j¡¥  ã                   @  s¦  d dl mZ d dlZd dlZd dlZd dlmZ d dlmZm	Z	m
Z
mZmZmZmZmZ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mZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$ ddl%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- dd	l.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z: dd
l;m<Z< dZ=eddd�Z>eddd�Z?e<dƒZ@eddd�ZAG dd„ deBeƒZCG dd„ deDeƒZEG dd„ dƒZFG dd„ deFƒZGG dd„ deFƒZHdS )é    )ÚannotationsN)ÚEnum)	ÚAnyÚCallableÚListÚLiteralÚMappingÚOptionalÚSequenceÚTypeVarÚUnioné   )Ú
ProxyErrorÚRemoteProtocolErrorÚTooManyRedirects)ÚURLÚAuthÚ	BasicAuthÚCookiesÚHeaderRotatorÚHeadersÚProxyÚProxyRotatorÚRequestÚResponseÚStatusCodesÚ	TLSClientÚ	TLSConfigÚTLSIdentifierRotatorÚ	URLParams)ÚDEFAULT_ALLOW_HTTPÚDEFAULT_CLIENT_IDENTIFIERÚDEFAULT_DEBUGÚDEFAULT_FOLLOW_REDIRECTSÚDEFAULT_HTTP2ÚDEFAULT_MAX_REDIRECTSÚDEFAULT_PROTOCOL_RACINGÚDEFAULT_TIMEOUT)Ú	AuthTypesÚCookieTypesÚHeaderTypesÚ	HookTypesÚIdentifierArgTypesÚProtocolTypesÚ
ProxyTypesÚRequestDataÚRequestFilesÚTimeoutTypesÚURLParamTypesÚURLTypes)Ú
get_logger)Ú
BaseClientÚAsyncClientÚClientÚTr7   )ÚboundÚAr6   ZTLSRequestsÚBCr5   c                   @  s   e Zd ZdZdZdZdS )ÚProtocolTypeÚautoZhttp1Úhttp2N)Ú__name__Ú
__module__Ú__qualname__ZAUTOZHTTP1ZHTTP2© rB   rB   ú9E:\soccer\ml_env\Lib\site-packages\tls_requests/client.pyr<   E   s   r<   c                   @  s   e Zd ZdZdZdZdS )ÚClientStater   é   é   N)r?   r@   rA   ÚUNOPENEDÚOPENEDÚCLOSEDrB   rB   rB   rC   rD   K   s   rD   c                   @  s´  e Zd ZdZdddddeeeedee	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„Zeddœdd„ƒZeddœdd„ƒZe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d/dd0œd1d.„ƒZed2dœd3d4„ƒZejd5dd6œd7d4„ƒZd8d9d:d;œd<d=„Zd€d#d>d d?œd@dA„Zd�d)d&d*œdBdC„Zd‚d/d,d0œdDdE„Zd
dFdGœdHdI„ZdddJœdKdL„Zefd8ddMœdNdO„ZdddddddddddPœ
ddQdRdSdTd/d#d)ddUdUdd8dVœdWdX„Zd8d:dYœdZd[„Zd\d]d^œd_d`„Zdadœdbdc„Z d5ddœdedf„Z!d8d\d8dgœdhdi„Z"d8d\djœdkdl„Z#d8d\dmdgœdndo„Z$dddpœd8dqdrd\dsœdtdu„Z%ddœdvdw„Z&dxdxdyœdzd{„Z'd|d|dd}œd~d„Z(dS )ƒr5   aÈ  
    A TLS-enabled HTTP client supporting advanced configuration options, including headers, cookies,
    URL parameters, and proxy settings. It provides seamless HTTP/1.1 and HTTP/2 support with optional
    authentication and robust redirect handling.

    Attributes:
        auth (Optional[AuthTypes]): Authentication options (e.g., tuples for basic auth, callable objects).
        params (Optional[URLParamTypes]): URL parameters to include in requests.
        headers (Optional[HeaderTypes]): Default headers for all requests.
        cookies (Optional[CookieTypes]): Default cookies for all requests.
        proxy (Optional[ProxyTypes]): Proxy configurations (e.g., proxy URL or instance).
        timeout (Optional[float | int]): Timeout for requests, in seconds.
        follow_redirects (bool): Whether to automatically follow redirects.
        max_redirects (int): Maximum number of redirects allowed.
        http2 (Optional[ProtocolTypes]): Specifies protocol options (e.g., 'auto', 'http1', 'http2', True, False, None).
        verify (bool): Whether to verify TLS certificates.
        client_identifier (Optional[TLSIdentifierTypes]): Identifier to emulate specific clients.
        encoding (str): Default encoding for response decoding.

    Methods:
        build_request: Constructs and returns a `Request` instance with provided parameters.
        prepare_headers: Merges default and custom headers for a request.
        prepare_cookies: Merges default and custom cookies for a request.
        prepare_params: Merges default and custom URL parameters for a request.
        prepare_config: Prepares TLS and other configurations for sending a request.
        close: Closes the client session and cleans up resources.

    Properties:
        - `session`: Returns the underlying TLS session object.
        - `config`: Returns the current configuration.
        - `is_closed`: Indicates if the client is closed.
        - `headers`, `cookies`, `params`: Manage default headers, cookies, and parameters.

    Lifecycle Management:
        - Use the `BaseClient` within a context manager to ensure proper resource cleanup.
        - Methods `__enter__` and `__exit__` handle opening and closing sessions automatically.
    NTzutf-8)ÚauthÚparamsÚheadersÚcookiesÚproxyÚtimeoutÚfollow_redirectsÚmax_redirectsr>   ÚverifyÚclient_identifierÚdebugÚprotocol_racingÚ
allow_httpÚ	stream_idÚhooksÚencodingzOptional[AuthTypes]zOptional[URLParamTypes]zOptional[HeaderTypes]zOptional[CookieTypes]úOptional[ProxyTypes]r1   ÚboolÚintr-   zOptional[IdentifierArgTypes]úOptional[int]zOptional[HookTypes]ÚstrÚNone)rJ   rK   rL   rM   rN   rO   rP   rQ   r>   rR   rS   rT   rU   rV   rW   rX   rY   Úreturnc             
   K  s>  d|v rt  d¡ | d¡}t ¡ | _tjf |	|
|  |¡||||dœ|¤Ž| _	t
|ƒ| _t|ƒ| _tj| _d | _tƒ | _t|tƒrŠ|| _n*t|tƒr¢t |¡| _n|d ur´t|ƒ| _t|tƒrÂ|ni | _|| _t|tƒrât |¡n|| _|| _|| _|| _|	| _ |
| _!|| _"|| _#|| _$t|tƒ�r.t% |¡n|| _&|| _'d S )NZtls_identifierzzThe 'client_identifier' parameter is deprecated and will be removed in version 1.3.0. Please use 'tls_identifier' instead.)r>   rR   rS   rT   rU   rV   rW   )(ÚloggerÚwarningÚpopr   Z
initializeÚ_sessionr   Zfrom_kwargsÚprepare_client_identifierÚ_configr   Ú_paramsr   Ú_cookiesrD   rG   Ú_stateÚ_header_rotatorr   Ú_headersÚ
isinstancer   ÚlistÚ	from_fileÚdictÚ_hooksrJ   r   rN   rO   rP   rQ   r>   rR   rU   rV   rW   r   rS   rY   )ÚselfrJ   rK   rL   rM   rN   rO   rP   rQ   r>   rR   rS   rT   rU   rV   rW   rX   rY   ÚconfigrB   rB   rC   Ú__init__x   sX    ÿ

ùø





ÿýzBaseClient.__init__r   ©r`   c                 C  s   | j S ©N)rd   ©rq   rB   rB   rC   Úsession½   s    zBaseClient.sessionr   c                 C  s   | j S ru   )rf   rv   rB   rB   rC   rr   Á   s    zBaseClient.configc                 C  s   t | jtjkƒS ru   )r[   ri   rD   rI   rv   rB   rB   rC   ÚclosedÅ   s    zBaseClient.closedr   c                 C  s   | j S ru   )rk   rv   rB   rB   rC   rL   É   s    zBaseClient.headersr*   )rL   r`   c                 C  s@   t |tƒr|| _n*t |tƒr*t |¡| _n|d ur<t|ƒ| _d S ru   )rl   r   rj   rm   rn   r   rk   )rq   rL   rB   rB   rC   rL   Í   s    

r   c                 C  s   | j S ru   )rh   rv   rB   rB   rC   rM   Ö   s    zBaseClient.cookiesr)   )rM   r`   c                 C  s   t |ƒ| _d S ru   )r   rh   )rq   rM   rB   rB   rC   rM   Ú   s    r   c                 C  s   | j S ru   )rg   rv   rB   rB   rC   rK   Þ   s    zBaseClient.paramsr2   )rK   r`   c                 C  s   t |ƒ| _d S ru   )r   rg   )rq   rK   rB   rB   rC   rK   â   s    z7Mapping[Literal['request', 'response'], list[Callable]]c                 C  s   | j S ru   )rp   rv   rB   rB   rC   rX   æ   s    zBaseClient.hooksr+   )rX   r`   c                 C  s   |   |¡| _d S ru   )Ú_rebuild_hooksrp   ©rq   rX   rB   rB   rC   rX   ê   s    r   r(   zUnion[Request, Any])ÚrequestrJ   r`   c                 O  sZ   t |tƒr2t|ƒdkr2t|d |d ƒ}| |¡S t|ƒrB||ƒS t |tƒrV| |¡S |S )zBuild Auth Request instancerE   r   r   )rl   ÚtupleÚlenr   Z
build_authÚcallabler   )rq   r{   rJ   ÚargsÚkwargsrB   rB   rC   Úprepare_authî   s    


zBaseClient.prepare_authúOptional[str]©rL   Ú
user_agentr`   c                 C  sH   |du r*| j dur | j j|d�S | j ¡ S t|tƒr@|j|d�S t|ƒS ©z=Prepare Headers. Gets base headers from rotator if available.N)r„   )rj   ÚnextrL   Úcopyrl   r   r   ©rq   rL   r„   rB   rB   rC   Úprepare_headersý   s    


zBaseClient.prepare_headersc                 C  s   | j  ¡ }| |¡ |S )zPrepare Cookies)rM   r‡   Úupdate)rq   rM   Úmerged_cookiesrB   rB   rC   Úprepare_cookies  s    

zBaseClient.prepare_cookiesc                 C  s   | j  ¡ }| |¡ |S )zPrepare URL Params)rK   r‡   rŠ   )rq   rK   Zmerged_paramsrB   rB   rC   Úprepare_params  s    

zBaseClient.prepare_paramsúOptional[Proxy]©rN   r`   c                 C  sˆ   |d u rd S t |tƒr8| ¡ }t |ttfƒr4t|ƒS |S t |ttfƒrNt|ƒS t |tƒr\|S t |tƒrrtt|ƒƒS tdt|ƒ› �ƒ‚d S ©NzUnsupported proxy type: )	rl   r   r†   r^   Úbytesr   r   r   Útype)rq   rN   ÚresrB   rB   rC   Úprepare_proxy  s    


zBaseClient.prepare_proxy)Ú
identifierr`   c                 C  s,   t |tƒr|S t |tƒr$t| ¡ ƒS ttƒS ru   )rl   r^   r   r†   r!   ©rq   r•   rB   rB   rC   re   #  s
    

z$BaseClient.prepare_client_identifier)r{   rS   c                 C  s†   | j jf |j|j| ¡ t|jƒdd„ |j ¡ D ƒ|j	r>|j	jnd|j
| jdv rRdnd| j||j|j|jdœt|di ƒ¤Ž}|j|_|S )	zPrepare TLS Configc                 S  s   g | ]\}}t ||d �‘qS ))ÚnameÚvalue)ro   ©Ú.0ÚkÚvrB   rB   rC   Ú
<listcomp>2  ó    z-BaseClient.prepare_config.<locals>.<listcomp>N)r=   r>   TNTF)ÚmethodÚurlÚbodyrL   rM   rN   rO   r>   rR   rS   rU   rV   rW   Z_extra_config)rr   Ú	copy_withrŸ   r    Úreadro   rL   rM   ÚitemsrN   rO   r>   rR   rU   rV   rW   ÚgetattrÚ	sessionIdZ_session_id)rq   r{   rS   rr   rB   rB   rC   Úprepare_config*  s&    ó
òzBaseClient.prepare_config©
ÚdataÚfilesÚjsonrK   rL   rM   rO   rU   rV   rW   r3   úOptional[RequestData]úOptional[RequestFiles]úOptional[Any]úOptional[bool]©rŸ   r    r©   rª   r«   rK   rL   rM   rO   rU   rV   rW   r`   c       
         K  s„   | j f i |¤Ž}t||f||||  |¡|  |¡|  |¡|  | j¡|	pH| j|
durT|
n| j|durd|n| j	|durt|n| j
dœ|¤ŽS )zBuild Request instanceN©r©   rª   r«   rK   rL   rM   rN   rO   rU   rV   rW   )Ú_rebuild_request_kwargsr   r�   r‰   rŒ   r”   rN   rO   rU   rV   rW   )rq   rŸ   r    r©   rª   r«   rK   rL   rM   rO   rU   rV   rW   r€   Úsafe_kwargsrB   rB   rC   Úbuild_requestB  s&    þ
óòzBaseClient.build_request)r{   r`   c                 O  s>   |   | j¡ d¡}t|tƒr:|D ]}t|ƒr ||ƒ  S q d S )Nr{   ©ry   rX   Úgetrl   r
   r~   )rq   r{   r   r€   Úrequest_hooksÚhookrB   rB   rC   Úbuild_hook_requesti  s    
zBaseClient.build_hook_requestr   zUnion[Response, Any])Úresponser`   c                 O  s>   |   | j¡ d¡}t|tƒr:|D ]}t|ƒr ||ƒ  S q d S )Nrº   rµ   )rq   rº   r   r€   r·   r¸   rB   rB   rC   Úbuild_hook_responseq  s    
zBaseClient.build_hook_responsezdict[str, Any]c                   s   h d£‰ ‡ fdd„|  ¡ D ƒS )N>   r©   rU   rO   rŸ   r«   rª   rL   rN   rV   rK   r    rM   rW   c                   s   i | ]\}}|ˆ vr||“qS rB   rB   r™   ©Zexplicit_keysrB   rC   Ú
<dictcomp>‰  rž   z6BaseClient._rebuild_request_kwargs.<locals>.<dictcomp>)r¤   )rq   r€   rB   r¼   rC   r²   y  s    z"BaseClient._rebuild_request_kwargs)rX   c                 C  s    t |tƒrdd„ | ¡ D ƒS d S )Nc                 S  s>   i | ]6\}}t |ƒd v rt|tƒrt |ƒ ¡ dd„ |D ƒ“qS )©r{   rº   c                 S  s   g | ]}t |ƒr|‘qS rB   )r~   )rš   ÚfuncrB   rB   rC   r�   Ž  rž   z8BaseClient._rebuild_hooks.<locals>.<dictcomp>.<listcomp>)r^   rl   r
   Úlower)rš   r›   r¤   rB   rB   rC   r½   �  s   þz-BaseClient._rebuild_hooks.<locals>.<dictcomp>)rl   ro   r¤   rz   rB   rB   rC   ry   ‹  s
    
þzBaseClient._rebuild_hooks)r{   rº   r`   c                 C  s$   t |  ||¡|  ||¡|j|jd�S )zRebuild Redirect Request)rŸ   r    rL   rM   )r   Ú_rebuild_redirect_methodÚ_rebuild_redirect_urlrL   rM   )rq   r{   rº   rB   rB   rC   Ú_rebuild_redirect_request”  s    

üz$BaseClient._rebuild_redirect_requestr¾   c                 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Rebuild Redirect MethodÚHEADÚGETÚPOST)rŸ   Ústatus_coder   Ú	SEE_OTHERÚFOUNDÚMOVED_PERMANENTLY)rq   r{   rº   rŸ   rB   rB   rC   rÁ   ž  s    z#BaseClient._rebuild_redirect_methodr   c              
   C  sü   zt |jd ƒ}W nJ ty,   tdƒ‚Y n2 ty\ } ztd| ƒ|‚W Y d}~n
d}~0 0 |js„dD ]}t||t|j|dƒƒ qh|j	|jj	krÞ|jj	dkrª|jj	|_	n4| j
dv rÖ| j | jj¡ tt ¡ ƒ| j_ntd	ƒ‚t|d
dƒ |jsøtdƒ‚|S )zRebuild Redirect URLZLocationz,Redirect response without 'Location' header.z$Invalid URL in 'Location' header: %sN)ÚschemeÚhostÚportÚ Úhttp)r=   NzzSwitching remote scheme from HTTP/2 to HTTP/1 is not supported. Please initialize Client with parameter `http2` to `auto`.Ú_urlz Invalid URL in Location headers.)r   rL   ÚKeyErrorr   Ú	ExceptionÚnetlocÚsetattrr¥   r    rË   r>   rw   Údestroy_sessionrr   r¦   r^   ÚuuidÚuuid4)rq   r{   rº   r    ÚeZmissing_fieldrB   rB   rC   rÂ   ­  s,    $
ÿz BaseClient._rebuild_redirect_url©ÚhistoryÚstartúOptional[List[Response]]úOptional[float]©r{   rÚ   rÛ   r`   c                C  sÚ   |d u rg n|}|pt  ¡ }|  | j¡}| j||d�}tj| j | 	¡ ¡|j
d�}||_| j|_tjt  ¡ | d�|_|jrÐ|  |j|¡|_| jrÐtt|ƒ| jk ƒ}|s°tdƒ‚|rÐ| |¡ | j|j||d�S ||_|S ©N)rS   )Zis_byte_response)ÚsecondszToo many redirects.rÙ   )ÚtimeÚperf_counterre   rS   r§   r   Úfrom_tls_responserw   r{   Úto_dictÚisByteResponserY   Údefault_encodingÚdatetimeÚ	timedeltaÚelapsedÚis_redirectrÃ   r†   rP   r[   r}   rQ   r   ÚappendÚ_sendrÚ   ©rq   r{   rÚ   rÛ   rS   rr   rº   Zis_breakrB   rB   rC   rì   Ï  s,    þ
zBaseClient._sendc                 C  s   | j  | jj¡ tj| _dS )zClose TLS Client session.N)rw   rÕ   rr   r¦   rD   rI   ri   rv   rB   rB   rC   Úcloseï  s    zBaseClient.closer;   ©rq   r`   c                 C  s4   | j tjkrtdƒ‚| j tjkr(tdƒ‚tj| _ | S ©Nz<It is not possible to open a client instance more than once.z@The client instance cannot be reopened after it has been closed.©ri   rD   rH   ÚRuntimeErrorrI   rv   rB   rB   rC   Ú	__enter__õ  s    zBaseClient.__enter__r   )r   r€   r`   c                 O  s   |   ¡  d S ru   ©rî   ©rq   r   r€   rB   rB   rC   Ú__exit__ÿ  s    zBaseClient.__exit__)NN)N)N))r?   r@   rA   Ú__doc__r'   r#   r%   r$   r!   r"   r&   r    rs   Úpropertyrw   rr   rx   rL   ÚsetterrM   rK   rX   r�   r‰   rŒ   r�   r”   re   r§   r´   r¹   r»   r²   ry   rÃ   rÁ   rÂ   rì   rî   ró   rö   rB   rB   rB   rC   r5   Q   s�   )í4E
ò*'	
&û 
c                   @  sÆ  e Zd ZdZdddddd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„Zdedœddddœdd„Zddddeedœdd	d
dddddœdd„Zddddeedœdd	d
ddddddœdd „Z	ddddeedœdd	d
ddddddœd!d"„Z
dddddddeed#œ	ddddd	d
dddddd$œd%d&„Zdddddddeed#œ	ddddd	d
dddddd$œd'd(„Zdddddddeed#œ	ddddd	d
dddddd$œd)d*„Zddddeedœdd	d
ddddddœd+d,„ZdS )-r7   a«  
    An HTTP client with advanced features such as connection pooling, HTTP/2 support,
    automatic redirects, and cookie persistence.

    This client is thread-safe and can be shared between threads for efficient HTTP
    interactions in multi-threaded applications.

    Usage:
        ```python
            >>> with tls_requests.AsyncClient(http2='auto', follow_redirects=True) as client:
                    response = client.get('https://httpbin.org/get')
                    response.raise_for_status()
            >>> response
            <Response [200]>
        ```

    Parameters:
        - Inherits all parameters and configurations from `tls_requests.BaseClient`.
    N©r©   rª   r«   rK   rL   rM   rJ   rP   rO   rU   rV   rW   r^   r3   r¬   r­   r®   r2   r*   r)   r(   r[   r1   r¯   r]   r   ©rŸ   r    r©   rª   r«   rK   rL   rM   rJ   rP   rO   rU   rV   rW   r`   c                K  s:   | j f ||||||||||||dœ|¤Ž}| j||	|
d�S )aY  
        Constructs and sends an HTTP request.

        This method builds a `Request` object based on the given parameters, sends
        it using the configured client, and returns the server's response.

        Parameters:
            - **method** (str): HTTP method to use (e.g., `"GET"`, `"POST"`).
            - **url** (URLTypes): The URL to send the request to.
            - **params** (optional): Query parameters to include in the request URL.
            - **data** (optional): Form data to include in the request body.
            - **json** (optional): A JSON serializable object to include in the request body.
            - **headers** (optional): Custom headers to include in the request.
            - **cookies** (optional): Cookies to include with the request.
            - **files** (optional): Files to upload in a multipart request.
            - **auth** (optional): Authentication credentials or handler.
            - **timeout** (optional): Timeout configuration for the request.
            - **follow_redirects** (optional): Whether to follow HTTP redirects.

        Returns:
            - **Response**: The client's response to the HTTP request.

        Usage:
            ```python
                >>> r = client.request('GET', 'https://httpbin.org/get')
                >>> r
                <Response [200]>
            ```
        ©rŸ   r    r©   rª   r«   rK   rL   rM   rO   rU   rV   rW   ©rJ   rP   )r´   Úsend©rq   rŸ   r    r©   rª   r«   rK   rL   rM   rJ   rP   rO   rU   rV   rW   r€   r{   rB   rB   rC   r{     s"    1ôózClient.requestrý   r   )r{   rJ   rP   c          	      C  sü   | j tjkrtdƒ‚tj| _ |  ||p*| j¡}t|tƒr<|}|  	|¡}t|tƒrT|}|| _
| j|t ¡ g d�}t| jtƒrÂ|jjrÂd|j  ko–dk n  o¤|jdv}| jj|jj||j ¡ d� | j d¡rè|  |¡}t|tƒrð|}n| ¡  | ¡  |S ©Nz5Cannot send a request, as the client has been closed.)rÛ   rÚ   éÈ   iô  )i—  )rN   ÚsuccessZlatencyrº   )ri   rD   rI   rò   rH   r�   rJ   rl   r   r¹   rP   rì   rá   râ   rN   r   r{   rÇ   Zmark_resultré   Útotal_secondsrX   r¶   r»   r   r£   rî   )	rq   r{   rJ   rP   Úauth_requestÚhook_requestrº   Úproxy_successÚ	response_rB   rB   rC   rþ   Z  s2    


$ý

zClient.send©rK   rL   rM   rJ   rP   rO   )r    rK   rL   rM   rJ   rP   rO   c          	   	   K  s"   | j d|f||||||dœ|¤ŽS )ú\
        Send a `GET` request.

        **Parameters**: See `tls_requests.request`.
        rÅ   r  ©r{   ©	rq   r    rK   rL   rM   rJ   rP   rO   r€   rB   rB   rC   r¶   ‚  s    þø	÷z
Client.get©r    rK   rL   rM   rJ   rP   rO   r`   c          	   	   K  s"   | j d|f||||||dœ|¤ŽS )úa
        Send an `OPTIONS` request.

        **Parameters**: See `tls_requests.request`.
        ÚOPTIONSr  r
  r  rB   rB   rC   ÚoptionsŸ  s    þø	÷zClient.optionsc          	   	   K  s"   | j d|f||||||dœ|¤ŽS )ú]
        Send a `HEAD` request.

        **Parameters**: See `tls_requests.request`.
        rÄ   r  r
  r  rB   rB   rC   Úhead¼  s    þø	÷zClient.head©	r©   rª   r«   rK   rL   rM   rJ   rP   rO   ©r    r©   rª   r«   rK   rL   rM   rJ   rP   rO   r`   c       	         K  s(   | j d|f||||||||	|
dœ	|¤ŽS )ú]
        Send a `POST` request.

        **Parameters**: See `tls_requests.request`.
        rÆ   r  r
  ©rq   r    r©   rª   r«   rK   rL   rM   rJ   rP   rO   r€   rB   rB   rC   ÚpostÙ  s     þõôzClient.postc       	         K  s(   | j d|f||||||||	|
dœ	|¤ŽS )ú\
        Send a `PUT` request.

        **Parameters**: See `tls_requests.request`.
        ÚPUTr  r
  r  rB   rB   rC   Úputü  s     þõôz
Client.putc       	         K  s(   | j d|f||||||||	|
dœ	|¤ŽS )ú^
        Send a `PATCH` request.

        **Parameters**: See `tls_requests.request`.
        ÚPATCHr  r
  r  rB   rB   rC   Úpatch  s     þõôzClient.patchc          	   	   K  s"   | j d|f||||||dœ|¤ŽS )ú_
        Send a `DELETE` request.

        **Parameters**: See `tls_requests.request`.
        ÚDELETEr  r
  r  rB   rB   rC   ÚdeleteB  s    þø	÷zClient.delete)r?   r@   rA   r÷   r#   r'   r{   rþ   r¶   r  r  r  r  r  r  rB   rB   rB   rC   r7     s–   ð.Fû,÷!÷ !÷ !ô&'ô&'ô&'÷c                   @  s†  e Zd ZdZdMddddœdd„Zd	d
dœdd„Zddœdd„Z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„Zdddddd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&„Z
ddddee	d'œddddd!d"dd#d(œd)d*„Zddddee	d'œddddd!d"dd#d(œd+d,„Zddddee	d'œddddd!d"dd#d(œd-d.„Zdddddddee	d/œ	dddddddd!d"dd#d0œd1d2„Zdddddddee	d/œ	dddddddd!d"dd#d0œd3d4„Zdddddddee	d/œ	dddddddd!d"dd#d0œd5d6„Zddddee	d'œddddd!d"dd#d(œd7d8„Zd9ded:œdd"d!d"d#d;œd<d=„Zddd>œdd?d@d#dAœdBdC„ZdDdœdEdF„ZdGdGdHœdIdJ„ZdDdœdKdL„ZdS )Nr6   ao  
    An asynchronous HTTP client, with connection pooling, HTTP/2, redirects,
    cookie persistence, etc.

    It can be shared between tasks.

    Usage:

    ```python
    >>> import asyncio
    >>> async def fetch(url: str, params: URLParamTypes = None)
            async with tls_requests.AsyncClient(http2='auto', follow_redirects=True) as client:
                response = await client.get(url, params=params)
                response.raise_for_status()
                return response
    >>> response = asyncio.run(fetch('https://httpbin.org/get'))
    ```

    **Parameters:** See `tls_requests.BaseClient`.
    Nr*   r‚   r   rƒ   c                 Ã  sT   |du r0| j dur&| j j|d�I dH S | j ¡ S t|tƒrL|j|d�I dH S t|ƒS r…   )rj   ÚanextrL   r‡   rl   r   r   rˆ   rB   rB   rC   Úaprepare_headersv  s    


zAsyncClient.aprepare_headersrZ   rŽ   r�   c                 Ã  st   |d u rd S t |tƒr$| ¡ I d H S t |ttfƒr:t|ƒS t |tƒrH|S t |tƒr^tt|ƒƒS tdt|ƒ› �ƒ‚d S r�   )	rl   r   r   r^   r‘   r   r   r   r’   )rq   rN   rB   rB   rC   Úaprepare_proxy€  s    


zAsyncClient.aprepare_proxyr^   rt   c                 Ã  s*   t |tƒr|S t |tƒr&| ¡ I d H S tS ru   )rl   r^   r   r   r!   r–   rB   rB   rC   Úaprepare_client_identifier�  s
    

z&AsyncClient.aprepare_client_identifierr¨   r3   r¬   r­   r®   r2   r)   r1   r¯   r]   r   r°   c       
         Ë  s˜   | j f i |¤Ž}|  |¡I d H }|  | j¡I d H }t||f||||  |¡||  |¡||	p\| j|
d urh|
n| j|d urx|n| j	|d urˆ|n| j
dœ|¤ŽS )Nr±   )r²   r!  r"  rN   r   r�   rŒ   rO   rU   rV   rW   )rq   rŸ   r    r©   rª   r«   rK   rL   rM   rO   rU   rV   rW   r€   r³   rN   rB   rB   rC   Úabuild_request”  s*    þóòzAsyncClient.abuild_requestrú   r(   r[   r   rû   c                Ë  sF   | j f ||||||||||||dœ|¤ŽI dH }| j||	|
d�I dH S )zAsync Requestrü   Nrý   )r$  rþ   rÿ   rB   rB   rC   r{   ¹  s"    ôózAsyncClient.requestr  r  c          	   	   Ë  s(   | j d|f||||||dœ|¤ŽI dH S )r	  rÅ   r  Nr
  r  rB   rB   rC   r¶   ß  s    þø	÷zAsyncClient.getc          	   	   Ë  s(   | j d|f||||||dœ|¤ŽI dH S )r  r  r  Nr
  r  rB   rB   rC   r  ü  s    þø	÷zAsyncClient.optionsc          	   	   Ë  s(   | j d|f||||||dœ|¤ŽI dH S )r  rÄ   r  Nr
  r  rB   rB   rC   r    s    þø	÷zAsyncClient.headr  r  c       	         Ë  s.   | j d|f||||||||	|
dœ	|¤ŽI dH S )r  rÆ   r  Nr
  r  rB   rB   rC   r  6  s     þõôzAsyncClient.postc       	         Ë  s.   | j d|f||||||||	|
dœ	|¤ŽI dH S )r  r  r  Nr
  r  rB   rB   rC   r  Y  s     þõôzAsyncClient.putc       	         Ë  s.   | j d|f||||||||	|
dœ	|¤ŽI dH S )r  r  r  Nr
  r  rB   rB   rC   r  |  s     þõôzAsyncClient.patchc          	   	   Ë  s(   | j d|f||||||dœ|¤ŽI dH S )r  r  r  Nr
  r  rB   rB   rC   r  Ÿ  s    þø	÷zAsyncClient.deleteF)ÚstreamrJ   rP   )r{   r%  rJ   rP   r`   c          
      Ã  s  | j tjkrtdƒ‚tj| _ |  ||p*| j¡}t|tƒr<|}|  	|¡}t|tƒrT|}|| _
| j|t ¡ g d�I d H }t| jtƒrÎ|jjrÎd|j  koœdk n  oª|jdv}| jj|jj||j ¡ d�I d H  | j d¡rô|  |¡}	t|	tƒrò|	}n| ¡ I d H  | ¡ I d H  |S r   )ri   rD   rI   rò   rH   r�   rJ   rl   r   r¹   rP   rì   rá   râ   rN   r   r{   rÇ   Zamark_resultré   r  rX   r¶   r»   r   ZareadÚaclose)
rq   r{   r%  rJ   rP   r  r  rº   r  r  rB   rB   rC   rþ   ¼  s2    


$ý

zAsyncClient.sendrÙ   rÜ   rÝ   rÞ   c                Ã  sì   |d u rg n|}|pt  ¡ }|  | j¡I d H }| j||d�}tj| j | 	¡ ¡I d H |j
d�}||_| j|_tjt  ¡ | d�|_|jrâ|  |j|¡|_| jrâtt|ƒ| jk ƒ}|s¼tdƒ‚|râ| |¡ | j|j||d�I d H S ||_|S rß   )rá   râ   r#  rS   r§   r   rã   rw   Zarequesträ   rå   r{   rY   ræ   rç   rè   ré   rê   rÃ   r†   rP   r[   r}   rQ   r   rë   rì   rÚ   rí   rB   rB   rC   rì   å  s,    þ
zAsyncClient._sendr_   c                 Ã  s   |   ¡ S ru   rô   rv   rB   rB   rC   r&    s    zAsyncClient.acloser:   rï   c                 Ã  s4   | j tjkrtdƒ‚| j tjkr(tdƒ‚tj| _ | S rð   rñ   rv   rB   rB   rC   Ú
__aenter__  s    zAsyncClient.__aenter__c                 Ï  s   |   ¡ I d H  d S ru   )r&  rõ   rB   rB   rC   Ú	__aexit__  s    zAsyncClient.__aexit__)NN)r?   r@   rA   r÷   r!  r"  r#  r$  r#   r'   r{   r¶   r  r  r  r  r  r  rþ   rì   r&  r'  r(  rB   rB   rB   rC   r6   `  sÀ   
ò**ð.*÷ !÷ !÷ !ô&'ô&'ô&'÷ !ú-û 
)IÚ
__future__r   rç   rá   rÖ   Úenumr   Útypingr   r   r   r   r   r	   r
   r   r   Ú
exceptionsr   r   r   Úmodelsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Úsettingsr    r!   r"   r#   r$   r%   r&   r'   Útypesr(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   Úutilsr4   Ú__all__r8   r:   ra   r;   r^   r<   r\   rD   r5   r7   r6   rB   rB   rB   rC   Ú<module>   s2   ,D(
8   5  _