o
    <‘ðiK;  ã                   @  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Zd dlmZ d dl	m
Z
mZmZmZmZmZ d dlmZmZ d dlmZmZ d dlmZmZ g d¢Zd d	lmZ d d
lmZ d dlmZ dZ dZ!h d£Z"eG dd„ dƒƒZ#G dd„ de$ƒZ%G dd„ dƒZ&dS )é    )ÚannotationsN)Ú	dataclass)ÚAnyÚDictÚMappingÚOptionalÚTupleÚUnion)Ú	HTTPErrorÚURLError)Ú	urlencodeÚurljoin)ÚRequestÚurlopen)Ú
HttpClientÚHttpResponseÚ	HttpErrorÚDEFAULT_TIMEOUT)ÚExponentialWithJitterBackoff)ÚRetry©Ú
dummy_failz)HttpClient/1.0 (+https://example.invalid)g      >@>   é­  éô  éö  é÷  éø  c                   @  sN   e Zd ZU ded< ded< ded< ded< dddd„Zddd„Zddd„Zd	S )r   ÚintÚstatusúDict[str, str]ÚheadersÚstrÚurlÚbytesÚcontentNÚencodingúOptional[str]Úreturnc                 C  s   |p|   ¡ }| jj|dd�S )NÚreplace)Úerrors)Ú_get_encodingr$   Údecode)Úselfr%   Úenc© r.   úU/root/parts/websockify/install/lib/python3.10/site-packages/redis/http/http_client.pyÚtext    s   zHttpResponse.textr   c                 C  s   t  | j|  ¡ d�¡S )N)r%   )ÚjsonÚloadsr0   r*   ©r,   r.   r.   r/   r1   $   s   zHttpResponse.jsonc                 C  sT   | j  dd¡}| d¡D ]}| ¡ }| ¡  d¡r'| dd¡d  ¡ p$d  S qdS )Núcontent-typeÚ ú;zcharset=ú=é   úutf-8)r    ÚgetÚsplitÚstripÚlowerÚ
startswith)r,   ÚctypeÚpartÚpr.   r.   r/   r*   '   s   ÿzHttpResponse._get_encoding©N)r%   r&   r'   r!   )r'   r   )r'   r!   )Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r0   r1   r*   r.   r.   r.   r/   r      s   
 
r   c                      s    e Zd Zd
d‡ fdd	„Z‡  ZS )r   Nr   r   r"   r!   Úmessager&   c                   s4   || _ || _|pd|› d|› �| _tƒ  | j¡ d S )NzHTTP z for )r   r"   rG   ÚsuperÚ__init__)r,   r   r"   rG   ©Ú	__class__r.   r/   rI   3   s   zHttpError.__init__rB   )r   r   r"   r!   rG   r&   )rC   rD   rE   rI   Ú__classcell__r.   r.   rJ   r/   r   2   s    r   c                   @  s4  e Zd ZdZddeeeddd�dd�d	dddddddefdXd!d"„Z					dYdZd)d*„Z						dYdZd+d,„Z
							d[d\d1d2„Z							d[d\d3d4„Z							d[d\d5d6„Z				d]d^d:d;„Z		d_d`d@dA„ZdadDdE„Z						dbdcdFdG„Z	d_dddHdI„Z	dedfdJdK„ZdgdMdN„ZdhdQdR„ZdidVdW„ZdS )jr   z7
    A lightweight HTTP client for REST API calls.
    r5   Nr8   é
   )ÚbaseÚcapé   )ÚbackoffÚretriesTÚbase_urlr!   r    úOptional[Mapping[str, str]]ÚtimeoutÚfloatÚretryr   Ú
verify_tlsÚboolÚca_filer&   Úca_pathÚca_dataúOptional[Union[str, bytes]]Úclient_cert_fileÚclient_key_fileÚclient_key_passwordÚ
auth_basicúOptional[Tuple[str, str]]Ú
user_agentr'   ÚNonec                 C  s’   |r|  d¡s| ¡ d n|| _dd„ |pi  ¡ D ƒ| _|| _|| _| j tt	t
jf¡ || _|| _|| _|| _|	| _|
| _|| _|| _|| _dS )a  
        Initialize a new HTTP client instance.

        Args:
            base_url: Base URL for all requests. Will be prefixed to all paths.
            headers: Default headers to include in all requests.
            timeout: Default timeout in seconds for requests.
            retry: Retry configuration for failed requests.
            verify_tls: Whether to verify TLS certificates.
            ca_file: Path to CA certificate file for TLS verification.
            ca_path: Path to a directory containing CA certificates.
            ca_data: CA certificate data as string or bytes.
            client_cert_file: Path to client certificate for mutual TLS.
            client_key_file: Path to a client private key for mutual TLS.
            client_key_password: Password for an encrypted client private key.
            auth_basic: Tuple of (username, password) for HTTP basic auth.
            user_agent: User-Agent header value for requests.

        The client supports both regular HTTPS with server verification and mutual TLS
        authentication. For server verification, provide CA certificate information via
        ca_file, ca_path or ca_data. For mutual TLS, additionally provide a client
        certificate and key via client_cert_file and client_key_file.
        ú/c                 S  ó   i | ]	\}}|  ¡ |“qS r.   ©r=   ©Ú.0ÚkÚvr.   r.   r/   Ú
<dictcomp>o   ó    z'HttpClient.__init__.<locals>.<dictcomp>N)ÚendswithÚrstriprS   ÚitemsÚ_default_headersrU   rW   Úupdate_supported_errorsr
   r   ÚsslÚSSLErrorrX   rZ   r[   r\   r^   r_   r`   ra   rc   )r,   rS   r    rU   rW   rX   rZ   r[   r\   r^   r_   r`   ra   rc   r.   r.   r/   rI   ?   s&   -ÿÿý
zHttpClient.__init__ÚpathÚparamsúGOptional[Mapping[str, Union[None, str, int, float, bool, list, tuple]]]úOptional[float]Úexpect_jsonúUnion[HttpResponse, Any]c              	   C  ó   | j d||||d |d�S )NÚGET©rv   r    rU   Úbodyry   ©Ú
_json_call©r,   ru   rv   r    rU   ry   r.   r.   r/   r:   �   ó   
ùzHttpClient.getc              	   C  r{   )NÚDELETEr}   r   r�   r.   r.   r/   Údelete•   r‚   zHttpClient.deleteÚ	json_bodyúOptional[Any]ÚdataúOptional[Union[bytes, str]]c              
   C  ó"   | j d||||| j||d�|d�S )NÚPOST©r…   r‡   r}   ©r€   Ú_prepare_body©r,   ru   r…   r‡   rv   r    rU   ry   r.   r.   r/   Úpost©   ó   ùzHttpClient.postc              
   C  r‰   )NÚPUTr‹   r}   rŒ   rŽ   r.   r.   r/   Úput¿   r�   zHttpClient.putc              
   C  r‰   )NÚPATCHr‹   r}   rŒ   rŽ   r.   r.   r/   ÚpatchÕ   r�   zHttpClient.patchÚmethodr~   r   c                   sd  ˆ  ||¡}ˆ ||¡}t|tƒr| d¡n|}	t|| ¡ |	|d�‰d ‰ | ¡  d¡rSˆj	rHt
jˆjˆjˆjd�‰ ˆjrGˆ jˆjˆjˆjd� nt
 ¡ ‰ dˆ _t
jˆ _zˆj ‡ ‡‡‡fdd„d	d„ ‡fd
d„¡W S  ty± }
 z<d}z|
 ¡ }W n	 ty‚   Y nw dd„ |
jpŠi  ¡ D ƒ}ˆ ||¡}t|
ddƒpœd}t||||d�}|W  Y d }
~
S d }
~
ww )Nr9   )r"   r•   r‡   r    Úhttps)ÚcafileÚcapathÚcadata)ÚcertfileÚkeyfileÚpasswordFc                     s   ˆj ˆˆ ˆd�S )N)ÚcontextrU   )Ú_make_requestr.   ©r�   Úreqr,   rU   r.   r/   Ú<lambda>  s    z$HttpClient.request.<locals>.<lambda>c                 S  s   t ƒ S rB   r   )Ú_r.   r.   r/   r¡     s    c                   s
   ˆ   | ¡S rB   )Ú_is_retryable_http_error)Úerrorr3   r.   r/   r¡     s   
 ó    c                 S  rf   r.   rg   rh   r.   r.   r/   rl      rm   z&HttpClient.request.<locals>.<dictcomp>Úcoder   ©r   r    r"   r$   ) Ú
_build_urlÚ_prepare_headersÚ
isinstancer!   Úencoder   Úupperr=   r>   rX   rs   Úcreate_default_contextrZ   r[   r\   r^   Úload_cert_chainr_   r`   Úcheck_hostnameÚ	CERT_NONEÚverify_moderW   Úcall_with_retryr
   ÚreadÚ	Exceptionr    rp   Ú_maybe_decompressÚgetattrr   )r,   r•   ru   rv   r    r~   rU   r"   Úall_headersr‡   ÚeÚerr_bodyÚheaders_mapr   Úresponser.   rŸ   r/   Úrequestì   s^   ýý€
ýÿü€ðzHttpClient.requestr¼   r   r�   úOptional[ssl.SSLContext]c                 C  sv   t ||p| j|d��'}| ¡ }dd„ |j ¡ D ƒ}|  ||¡}t|j|| ¡ |d�W  d   ƒ S 1 s4w   Y  d S )N)rU   r�   c                 S  rf   r.   rg   rh   r.   r.   r/   rl   3  rm   z,HttpClient._make_request.<locals>.<dictcomp>r§   )	r   rU   r³   r    rp   rµ   r   r   Úgeturl)r,   r¼   r�   rU   ÚrespÚrawrº   r.   r.   r/   rž   +  s   ü$üzHttpClient._make_requestr¤   r´   c                 C  s   t |tƒr|  |j¡S dS )NF)rª   r
   Ú_should_retry_statusr¦   )r,   r¤   r.   r.   r/   r£   <  s   
z#HttpClient._is_retryable_http_errorc           	      C  sR   | j ||||||d�}d|j  krdk s!n t|j|j| ¡ ƒ‚|r'| ¡ S |S )N)r•   ru   rv   r    r~   rU   éÈ   i�  )r¼   r   r   r"   r0   r1   )	r,   r•   ru   rv   r    rU   r~   ry   r¿   r.   r.   r/   r€   B  s   úzHttpClient._json_callc                 C  s4   |d ur|d urt dƒ‚|d urtj|ddd�S |S )Nz+Provide either json_body or data, not both.F)ú,ú:)Úensure_asciiÚ
separators)Ú
ValueErrorr1   Údumps)r,   r…   r‡   r.   r.   r/   r�   \  s
   zHttpClient._prepare_bodyc                 C  sZ   t | jpd|ƒ}|r+tdd„ | ¡ D ƒdd�}d|v rdnd}|r)|› |› |› �n|}|S )Nr5   c                 S  s   i | ]\}}|d ur||“qS rB   r.   rh   r.   r.   r/   rl   p  s    z)HttpClient._build_url.<locals>.<dictcomp>T)Údoseqú?ú&)r   rS   r   rp   )r,   ru   rv   r"   ÚqueryÚ	separatorr.   r.   r/   r¨   e  s   ÿzHttpClient._build_urlr   c           	      C  sÀ   i }|  | j¡ | dd¡ | d| j¡ | dd¡ |d ur*t|tƒr*| dd¡ | jrMd|vrM| j\}}t |› d	|› � 	d
¡¡ 
d¡}d|› �|d< |r^| ¡ D ]
\}}||| ¡ < qS|S )NÚacceptzapplication/jsonz
user-agentzaccept-encodingzgzip, deflater4   zapplication/json; charset=utf-8ÚauthorizationrÄ   r9   ÚasciizBasic )Úupdaterq   Ú
setdefaultrc   rª   r!   ra   Úbase64Ú	b64encoder«   r+   rp   r=   )	r,   r    r~   ÚpreparedÚuserÚpwdÚtokenrj   rk   r.   r.   r/   r©   v  s   
 zHttpClient._prepare_headersr   r   c                 C  s   |t v S rB   )ÚRETRY_STATUS_CODES)r,   r   r.   r.   r/   rÁ   –  s   zHttpClient._should_retry_statusr$   r#   úMapping[str, str]c                 C  sŠ   |s|S |  d¡p
d ¡ }z,d|v rt |¡W S d|v r7z
t |tj ¡W W S  tjy6   t |¡ Y W S w W |S  tyD   | Y S w )Nzcontent-encodingr5   ÚgzipÚdeflate)r:   r=   rÛ   Ú
decompressÚzlibÚ	MAX_WBITSr¤   r´   )r,   r$   r    r%   r.   r.   r/   rµ   ™  s"   ÿü	ýþzHttpClient._maybe_decompress)rS   r!   r    rT   rU   rV   rW   r   rX   rY   rZ   r&   r[   r&   r\   r]   r^   r&   r_   r&   r`   r&   ra   rb   rc   r!   r'   rd   )NNNT)ru   r!   rv   rw   r    rT   rU   rx   ry   rY   r'   rz   )NNNNNT)ru   r!   r…   r†   r‡   rˆ   rv   rw   r    rT   rU   rx   ry   rY   r'   rz   )NNNN)r•   r!   ru   r!   rv   rw   r    rT   r~   rˆ   rU   rx   r'   r   )NN)r¼   r   r�   r½   rU   rx   )r¤   r´   r'   rY   )NNNNT)r•   r!   ru   r!   rv   rw   r    rT   rU   rx   r~   rˆ   ry   rY   r'   rz   )r…   r†   r‡   rˆ   r'   rˆ   rB   )ru   r!   rv   rw   r'   r!   )r    rT   r~   rˆ   r'   r   )r   r   r'   rY   )r$   r#   r    rÚ   r'   r#   )rC   rD   rE   Ú__doc__r   r   r   ÚDEFAULT_USER_AGENTrI   r:   r„   r�   r’   r”   r¼   rž   r£   r€   r�   r¨   r©   rÁ   rµ   r.   r.   r.   r/   r   :   sŽ    ÿîGøøööö÷Bü
öÿû

 r   )'Ú
__future__r   rÓ   rÛ   r1   rs   rÞ   Údataclassesr   Útypingr   r   r   r   r   r	   Úurllib.errorr
   r   Úurllib.parser   r   Úurllib.requestr   r   Ú__all__Úredis.backoffr   Úredis.retryr   Úredis.utilsr   rá   r   rÙ   r   r´   r   r   r.   r.   r.   r/   Ú<module>   s,     