o
    Lj;                     @  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mZm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)DEFAULT_RETRY_BASEDEFAULT_RETRY_CAPDEFAULT_RETRY_COUNT)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 r1   T/home/djax/ivt_ai_plugin/venv/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loadsr3   r-   r/   r1   r1   r2   r4   %   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pr1   r1   r2   r-   (   s   zHttpResponse._get_encodingN)r(   r)   r*   r$   )r*   r   )r*   r$   )__name__
__module____qualname____annotations__r3   r4   r-   r1   r1   r1   r2   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%   rJ   super__init__)r/   r!   r%   rJ   	__class__r1   r2   rL   4   s   zHttpError.__init__rE   )r!   r    r%   r$   rJ   r)   )rF   rG   rH   rL   __classcell__r1   r1   rM   r2   r   3   s    r   c                   @  s4  e Zd ZdZddeeeeede	ddddddddde
fdUddZ				dVdWd&d'Z				dVdWd(d)Z						dXdYd.d/Z						dXdYd0d1Z						dXdYd2d3Z				dZd[d7d8Z		d\d]d=d>Zd^dAdBZ					d_d`dCdDZ	d\dadEdFZ	dbdcdGdHZdddJdKZdedNdOZdfdSdTZdS )gr   z7
    A lightweight HTTP client for REST API calls.
    r8   N)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 r1   r@   .0kvr1   r1   r2   
<dictcomp>s       z'HttpClient.__init__.<locals>.<dictcomp>N)endswithrstriprT   items_default_headersrV   rX   update_supported_errorsr
   r   sslSSLErrorrY   r[   r\   r]   r_   r`   ra   rb   rd   )r/   rT   r#   rV   rX   rY   r[   r\   r]   r_   r`   ra   rb   rd   r1   r1   r2   rL   @   s&   0
zHttpClient.__init__pathparamsGOptional[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rw   r#   rV   bodyrz   
_json_callr/   rv   rw   r#   rV   rz   r1   r1   r2   r=         
zHttpClient.getc              	   C  r|   )NDELETEr~   r   r   r1   r1   r2   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/   rv   r   r   rw   r#   rV   rz   r1   r1   r2   post      zHttpClient.postc              
   C  r   )NPUTr   r~   r   r   r1   r1   r2   put   r   zHttpClient.putc              
   C  r   )NPATCHr   r~   r   r   r1   r1   r2   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pi  D }||}t|
ddpd}t||||d}|W  Y d }
~
S d }
~
ww )Nr<   )r%   r   r   r#   https)cafilecapathcadata)certfilekeyfilepasswordFc                     s   j  dS )N)contextrV   )_make_requestr1   r   reqr/   rV   r1   r2   <lambda>  s    z$HttpClient.request.<locals>.<lambda>c                 S  s   t  S rE   r   )_r1   r1   r2   r     s    c                   s
     | S rE   )_is_retryable_http_error)errorr6   r1   r2   r     s   
     c                 S  rg   r1   rh   ri   r1   r1   r2   rm   $  rn   z&HttpClient.request.<locals>.<dictcomp>coder   r!   r#   r%   r'   ) 
_build_url_prepare_headers
isinstancer$   encoder   upperr@   rA   rY   rt   create_default_contextr[   r\   r]   r_   load_cert_chainr`   ra   check_hostname	CERT_NONEverify_moderX   call_with_retryr
   read	Exceptionr#   rq   _maybe_decompressgetattrr   )r/   r   rv   rw   r#   r   rV   r%   all_headersr   eerr_bodyheaders_mapr!   responser1   r   r2   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)rV   r   c                 S  rg   r1   rh   ri   r1   r1   r2   rm   7  rn   z,HttpClient._make_request.<locals>.<dictcomp>r   )	r   rV   r   r#   rq   r   r   r!   geturl)r/   r   r   rV   resprawr   r1   r1   r2   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   r1   r1   r2   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   rv   rw   r#   r   rV      i  )r   r!   r   r%   r3   r4   )	r/   r   rv   rw   r#   rV   r   rz   r   r1   r1   r2   r   F  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)
ValueErrorr4   dumps)r/   r   r   r1   r1   r2   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 )Nr8   c                 S  s   i | ]\}}|d ur||qS rE   r1   ri   r1   r1   r2   rm   t  s    z)HttpClient._build_url.<locals>.<dictcomp>T)doseq?&)r   rT   r   rq   )r/   rv   rw   r%   query	separatorr1   r1   r2   r   i  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, deflater7   zapplication/json; charset=utf-8authorizationr   r<   asciizBasic )updaterr   
setdefaultrd   r   r$   rb   base64	b64encoder   r.   rq   r@   )	r/   r#   r   prepareduserpwdtokenrk   rl   r1   r1   r2   r   z  s   
 zHttpClient._prepare_headersr!   r    c                 C  s   |t v S rE   )RETRY_STATUS_CODES)r/   r!   r1   r1   r2   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-encodingr8   gzipdeflate)r=   r@   r   
decompresszlib	MAX_WBITSr   r   )r/   r'   r#   r(   r1   r1   r2   r     s"   	zHttpClient._maybe_decompress)rT   r$   r#   rU   rV   rW   rX   r   rY   rZ   r[   r)   r\   r)   r]   r^   r_   r)   r`   r)   ra   r)   rb   rc   rd   r$   r*   re   )NNNT)rv   r$   rw   rx   r#   rU   rV   ry   rz   rZ   r*   r{   )NNNNNT)rv   r$   r   r   r   r   rw   rx   r#   rU   rV   ry   rz   rZ   r*   r{   )NNNN)r   r$   rv   r$   rw   rx   r#   rU   r   r   rV   ry   r*   r   )NN)r   r   r   r   rV   ry   )r   r   r*   rZ   )NNNNT)r   r$   rv   r$   rw   rx   r#   rU   rV   ry   r   r   rz   rZ   r*   r{   )r   r   r   r   r*   r   rE   )rv   r$   rw   rx   r*   r$   )r#   rU   r   r   r*   r"   )r!   r    r*   rZ   )r'   r&   r#   r   r*   r&   )rF   rG   rH   __doc__r   r   r   r   r   r   DEFAULT_USER_AGENTrL   r=   r   r   r   r   r   r   r   r   r   r   r   r   r   r1   r1   r1   r2   r   ;   s    JB


 r   )+
__future__r   r   r   r4   rt   r   dataclassesr   typingr   r   r   r   r   r	   urllib.errorr
   r   urllib.parser   r   urllib.requestr   r   __all__redis._defaultsr   r   r   redis.backoffr   redis.retryr   redis.utilsr   r   r   r   r   r   r   r   r1   r1   r1   r2   <module>   s.     