
    AHj;                    ,   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             Z' G d de(      Z) G d d      Z*y)    )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                  P    e Zd ZU ded<   ded<   ded<   ded<   ddd
ZddZddZy	)r   intstatusDict[str, str]headersstrurlbytescontentNc                d    |xs | j                         }| j                  j                  |d      S )Nreplace)errors)_get_encodingr)   decode)selfencodingencs      N/root/tools/cai/cai_env/lib/python3.12/site-packages/redis/http/http_client.pytextzHttpResponse.text!   s/    .$,,.||""3y"99    c                h    t        j                  | j                  | j                                     S )N)r0   )jsonloadsr3   r-   )r/   s    r2   r6   zHttpResponse.json%   s%    zz$))T-?-?-A)BCCr4   c                   | j                   j                  dd      }|j                  d      D ]Z  }|j                         }|j	                         j                  d      s3|j                  dd      d   j                         xs dc S  y)Ncontent-type ;zcharset==   utf-8)r%   getsplitstriplower
startswith)r/   ctypepartps       r2   r-   zHttpResponse._get_encoding(   sw      4KK$ 	=D

Awwy##J/wwsAq)//1<W<	= r4   N)r0   Optional[str]returnr&   )rI   r   )rI   r&   )__name__
__module____qualname____annotations__r3   r6   r-    r4   r2   r   r      s'    K	HN:Dr4   r   c                  "     e Zd Zdd fdZ xZS )r   c                v    || _         || _        |xs d| d| | _        t        |   | j                         y )NzHTTP z for )r#   r'   messagesuper__init__)r/   r#   r'   rQ   	__class__s       r2   rS   zHttpError.__init__4   s;    <E&se"<&r4   rG   )r#   r"   r'   r&   rQ   rH   )rJ   rK   rL   rS   __classcell__)rT   s   @r2   r   r   3   s    ' 'r4   r   c                  D   e Zd ZdZdde e eee      e	      dddddddde
f	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 dd	Z	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd
Z	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 d	 	 	 	 	 ddZddZ	 	 	 	 	 d 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d!dZ	 d	 	 	 	 	 d"dZ	 d#	 	 	 	 	 d$dZ	 	 	 	 	 	 d%dZd&dZd'dZy)(r   z7
    A lightweight HTTP client for REST API calls.
    r:   N)basecap)backoffretriesTc                   |r$|j                  d      s|j                         dz   n|| _        |xs i j                         D ci c]  \  }}|j	                         | c}}| _        || _        || _        | j                  j                  t        t        t        j                  f       || _        || _        || _        || _        |	| _        |
| _        || _        || _        || _        yc c}}w )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.
        /N)endswithrstripbase_urlitemsrB   _default_headerstimeoutretryupdate_supported_errorsr   r   sslSSLError
verify_tlsca_fileca_pathca_dataclient_cert_fileclient_key_fileclient_key_password
auth_basic
user_agent)r/   r_   r%   rb   rc   rg   rh   ri   rj   rk   rl   rm   rn   ro   kvs                   r2   rS   zHttpClient.__init__@   s    `  1 1# 6 OO# 	
 <C=b:O:O:Q R$!QA R


**Ix+NO$  0.#6 $$ !Ss   C+c           	     2    | j                  d||||d |      S )NGETparamsr%   rb   bodyexpect_json
_json_callr/   pathru   r%   rb   rw   s         r2   r?   zHttpClient.get   s/     #  
 	
r4   c           	     2    | j                  d||||d |      S )NDELETErt   rx   rz   s         r2   deletezHttpClient.delete   s/     #  
 	
r4   c                T    | j                  d||||| j                  ||      |      S )NPOST	json_bodydatart   ry   _prepare_bodyr/   r{   r   r   ru   r%   rb   rw   s           r2   postzHttpClient.post   s?     ##id#C#  
 	
r4   c                T    | j                  d||||| j                  ||      |      S )NPUTr   rt   r   r   s           r2   putzHttpClient.put   s?     ##id#C#  
 	
r4   c                T    | j                  d||||| j                  ||      |      S )NPATCHr   rt   r   r   s           r2   patchzHttpClient.patch   s?     ##id#C#  
 	
r4   c                ,     j                  ||      } j                  ||      }t        |t              r|j	                  d      n|}	t        ||j                         |	|      d |j                         j                  d      r j                  rut        j                   j                   j                   j                         j                  rcj!                   j                   j"                   j$                         n0t        j                         d_        t        j(                  _        	  j,                  j/                   fdd  fd	      S # t0        $ r}
d
}	 |
j3                         }n# t4        $ r Y nw xY w|
j6                  xs i j9                         D ci c]  \  }}|j                         | nc c}}w }}} j;                  ||      }t=        |
dd      xs d}t?        ||||      }|cY d }
~
S d }
~
ww xY w)Nr>   )r'   methodr   r%   https)cafilecapathcadata)certfilekeyfilepasswordFc                 ,    j                         S )N)contextrb   )_make_request)r   reqr/   rb   s   r2   <lambda>z$HttpClient.request.<locals>.<lambda>  s    **3*Q r4   c                    t               S rG   r   )_s    r2   r   z$HttpClient.request.<locals>.<lambda>  s    *, r4   c                &    j                  |       S rG   )_is_retryable_http_error)errorr/   s    r2   r   z$HttpClient.request.<locals>.<lambda>  s    d;;EB r4   r4   coder   r#   r%   r'   r)   ) 
_build_url_prepare_headers
isinstancer&   encoder   upperrB   rC   rg   re   create_default_contextrh   ri   rj   rk   load_cert_chainrl   rm   check_hostname	CERT_NONEverify_moderc   call_with_retryr   read	Exceptionr%   r`   _maybe_decompressgetattrr   )r/   r   r{   ru   r%   rv   rb   r'   all_headersr   eerr_bodyrp   rq   headers_mapr#   responser   r   s   `     `          @@r2   requestzHttpClient.request   s    oodF+++GT:'1$'<t{{7#$#flln4U,099;!!'*44<<<<<< ((++!%!6!6 $ 4 4!%!9!9 ,  446).&&)mm#	::--Q&B 
  	H668 56YY_"4K4K4MNDAq1779a<NNKN--hDHQ*/aF## 	H O!	sN   <&E# #	H,H/F ?H 	F	HF$H0G=HHHc                z   t        ||xs | j                  |      5 }|j                         }|j                  j	                         D ci c]  \  }}|j                         | }}}| j                  ||      }t        |j                  ||j                         |      cd d d        S c c}}w # 1 sw Y   y xY w)N)rb   r   r   )
r   rb   r   r%   r`   rB   r   r   r#   geturl)	r/   r   r   rb   resprawrp   rq   r   s	            r2   r   zHttpClient._make_request/  s     Wg&=wO 		SW))+C48LL4F4F4HIDAq1779a<IKI((k:C{{#KKM				 		I		 		s   .B1B+&;B1+B11B:c                Z    t        |t              r| j                  |j                        S y)NF)r   r   _should_retry_statusr   )r/   r   s     r2   r   z#HttpClient._is_retryable_http_error@  s$    eY',,UZZ88r4   c                    | j                  ||||||      }d|j                  cxk  rdk  s1n t        |j                  |j                  |j	                               |r|j                         S |S )N)r   r{   ru   r%   rv   rb      i  )r   r#   r   r'   r3   r6   )	r/   r   r{   ru   r%   rb   rv   rw   r   s	            r2   ry   zHttpClient._json_callF  sm     ||  
 t{{(S(DKK499;??99;r4   c                X    ||t        d      |t        j                  |dd      S |S )Nz+Provide either json_body or data, not both.F),:)ensure_ascii
separators)
ValueErrorr6   dumps)r/   r   r   s      r2   r   zHttpClient._prepare_body`  s9      T%5JKK ::ie
SSr4   c                    t        | j                  xs d|      }|rFt        |j                         D ci c]  \  }}|	|| c}}d      }d|v rdnd}|r| | | n|}|S c c}}w )Nr:   T)doseq?&)r   r_   r   r`   )r/   r{   ru   r'   rp   rq   query	separators           r2   r   zHttpClient._build_urli  sx     dmm)r40"(,,.B$!QAMAB$E !$s
I05SE)UG,3C
	 Cs   
A%
 A%
c                    i }|j                  | j                         |j                  dd       |j                  d| j                         |j                  dd       |"t	        |t
              r|j                  dd       | j                  rSd|vrO| j                  \  }}t        j                  | d	| j                  d
            j                  d      }d| |d<   |r+|j                         D ]  \  }}|||j                         <    |S )Nacceptzapplication/jsonz
user-agentzaccept-encodingzgzip, deflater9   zapplication/json; charset=utf-8authorizationr   r>   asciizBasic )updatera   
setdefaultro   r   r&   rn   base64	b64encoder   r.   r`   rB   )	r/   r%   rv   prepareduserpwdtokenrp   rq   s	            r2   r   zHttpClient._prepare_headersz  s    $&--. 	H&89L$//:-? 
4 50QR ??h>ID#$$vQse_%;%;G%DELLWUE*0(8H_%  (1&'#(
 r4   c                    |t         v S rG   )RETRY_STATUS_CODES)r/   r#   s     r2   r   zHttpClient._should_retry_status  s    +++r4   c                \   |s|S |j                  d      xs dj                         }	 d|v rt        j                  |      S d|v r&	 t	        j                  |t        j
                         S 	 |S # t        j                  $ r t	        j                  |      cY S w xY w# t        $ r |cY S w xY w)Nzcontent-encodingr:   gzipdeflate)r?   rB   r   
decompresszlib	MAX_WBITSr   r   )r/   r)   r%   r0   s       r2   r   zHttpClient._maybe_decompress  s    NKK 239r@@B	!w//H$4??7T^^ODD %  zz 4??7334 	N	s5   B B $A/ /(BB BB B+*B+)r_   r&   r%   Optional[Mapping[str, str]]rb   floatrc   r   rg   boolrh   rH   ri   rH   rj   zOptional[Union[str, bytes]]rk   rH   rl   rH   rm   rH   rn   zOptional[Tuple[str, str]]ro   r&   rI   None)NNNT)r{   r&   ru   GOptional[Mapping[str, Union[None, str, int, float, bool, list, tuple]]]r%   r   rb   Optional[float]rw   r   rI   Union[HttpResponse, Any])NNNNNT)r{   r&   r   Optional[Any]r   Optional[Union[bytes, str]]ru   r   r%   r   rb   r   rw   r   rI   r   )NNNN)r   r&   r{   r&   ru   r   r%   r   rv   r   rb   r   rI   r   )NN)r   r   r   zOptional[ssl.SSLContext]rb   r   )r   r   rI   r   )NNNNT)r   r&   r{   r&   ru   r   r%   r   rb   r   rv   r   rw   r   rI   r   )r   r   r   r   rI   r   rG   )r{   r&   ru   r   rI   r&   )r%   r   rv   r   rI   r$   )r#   r"   rI   r   )r)   r(   r%   zMapping[str, str]rI   r(   )rJ   rK   rL   __doc__r   r   r   r   r   r   DEFAULT_USER_AGENTrS   r?   r~   r   r   r   r   r   r   ry   r   r   r   r   r   rN   r4   r2   r   r   ;   s    /3(0'-> (	
  !%!%/3*.)--104,+B%B% -B% 	B%
 B% B% B% B% -B%" (#B%$ '%B%& +'B%( .)B%* +B%, 
-B%T /3#' 



 -
 !
 
 
"
2 /3#' 



 -
 !
 
 
"
. $(,0 /3#' 

 !
 *	



 -
 !
 
 
"
2 $(,0 /3#' 

 !
 *	



 -
 !
 
 
"
2 $(,0 /3#' 

 !
 *	



 -
 !
 
 
"
: /3,0#'== =
	= -= *= != 
=D -1#'	 * !	" /3#',0  
	 - ! *  
"6 TX&5P	$ 
 
"2:U	@,r4   r   )+
__future__r   r   r   r6   re   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   rN   r4   r2   <module>r      s    "    
  ! = = , + +
H V V 6  "@ .    0'	 'r rr4   