
    ng\j;                    ,   S SK Jr  S SKrS SKrS SKrS SKrS SKrS SKJr  S SK	J
r
JrJrJrJrJr  S SKJrJr  S SKJrJr  S SKJrJr  / SQrS S	KJrJrJr  S S
KJr  S SK J!r!  S SK"J#r#  Sr$Sr%1 Skr&\ " S S5      5       r' " S S\(5      r) " S S5      r*g)    )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                  `    \ rS rSr% S\S'   S\S'   S\S'   S\S	'   SSS jjrSS jrSS jrSrg
)r      intstatusDict[str, str]headersstrurlbytescontentNc                h    U=(       d    U R                  5       nU R                  R                  USS9$ )Nreplace)errors)_get_encodingr*   decode)selfencodingencs      Q/home/edenadmin/noVNC/venv/lib/python3.13/site-packages/redis/http/http_client.pytextHttpResponse.text!   s/    .$,,.||""3y"99    c                d    [         R                  " U R                  U R                  5       S95      $ )N)r1   )jsonloadsr4   r.   )r0   s    r3   r8   HttpResponse.json%   s%    zz$))T-?-?-A)BCCr6   c                0   U R                   R                  SS5      nUR                  S5       He  nUR                  5       nUR	                  5       R                  S5      (       d  M9  UR                  SS5      S   R                  5       =(       d    Ss  $    g)Ncontent-type ;zcharset==   utf-8)r&   getsplitstriplower
startswith)r0   ctypepartps       r3   r.   HttpResponse._get_encoding(   su      4KK$D

Awwy##J//wwsAq)//1<W< % r6    N)r1   Optional[str]returnr'   )rN   r   )rN   r'   )	__name__
__module____qualname____firstlineno____annotations__r4   r8   r.   __static_attributes__rK   r6   r3   r   r      s'    K	HN:Dr6   r   c                  0   ^  \ rS rSrSSU 4S jjjrSrU =r$ )r   3   c                |   > Xl         X l        U=(       d    SU SU 3U l        [        TU ]  U R                  5        g )NzHTTP z for )r$   r(   messagesuper__init__)r0   r$   r(   rX   	__class__s       r3   rZ   HttpError.__init__4   s7    <E&se"<&r6   )rX   r$   r(   rL   )r$   r#   r(   r'   rX   rM   )rO   rP   rQ   rR   rZ   rT   __classcell__)r[   s   @r3   r   r   3   s    ' 'r6   r   c                  t   \ rS rSrSrSS\\" \" \\	S9\
S9SSSSSSSS\4                           SS jjr    S           SS	 jjr    S           SS
 jjr      S               SS jjr      S               SS jjr      S               SS jjr    S             SS jjr  S     S S jjrS!S jr     S"               S#S jjr S     S$S jjr S%     S&S jjr      S'S jrS(S jrS)S jrSrg)*r   ;   z/
A lightweight HTTP client for REST API calls.
r=   N)basecap)backoffretriesTc                   U(       a)  UR                  S5      (       d  UR                  5       S-   OUU l        U=(       d    0 R                  5        VVs0 s H  u  pUR	                  5       U_M     snnU l        X0l        X@l        U R                  R                  [        [        [        R                  45        XPl        X`l        Xpl        Xl        Xl        Xl        Xl        Xl        Xl        gs  snnf )ak  
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itemsrE   _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)r0   rh   r&   rk   rl   rp   rq   rr   rs   rt   ru   rv   rw   rx   kvs                   r3   rZ   HttpClient.__init__@   s    `  1 1# 6 6 OO# 	
 <C=b:O:O:Q R:Q$!A:Q R


**Ix+NO$  0.#6 $$ !Ss   C1c           
     ,    U R                  SUUUUS US9$ )NGETparamsr&   rk   bodyexpect_json
_json_callr0   pathr   r&   rk   r   s         r3   rB   HttpClient.get   s/     #  
 	
r6   c           
     ,    U R                  SUUUUS US9$ )NDELETEr~   r   r   s         r3   deleteHttpClient.delete   s/     #  
 	
r6   c                F    U R                  SUUUUU R                  X#S9US9$ )NPOST	json_bodydatar~   r   _prepare_bodyr0   r   r   r   r   r&   rk   r   s           r3   postHttpClient.post   s=     ##i#C#  
 	
r6   c                F    U R                  SUUUUU R                  X#S9US9$ )NPUTr   r~   r   r   s           r3   putHttpClient.put   s=     ##i#C#  
 	
r6   c                F    U R                  SUUUUU R                  X#S9US9$ )NPATCHr   r~   r   r   s           r3   patchHttpClient.patch   s=     ##i#C#  
 	
r6   c                V  ^ ^^^ T R                  X#5      nT R                  XE5      n[        U[        5      (       a  UR	                  S5      OUn	[        XqR                  5       XS9mS mUR                  5       R                  S5      (       a  T R                  (       au  [        R                  " T R                  T R                  T R                  S9mT R                  (       a/  TR!                  T R                  T R"                  T R$                  S9  O1[        R                  " 5       mSTl        [        R(                  Tl         T R,                  R/                  UUU U4S jS U 4S	 j5      $ ! [0         a  n
S
n U
R3                  5       nO! [4         a     Of = fU
R6                  =(       d    0 R9                  5        VVs0 s H  u  pUR                  5       U_M     Os  snnf nnnT R;                  X5      n[=        U
SS5      =(       d    Sn[?        UUUUS9nUs S n
A
$ S n
A
ff = f)NrA   )r(   methodr   r&   https)cafilecapathcadata)certfilekeyfilepasswordFc                 &   > TR                  TT TS9$ )N)contextrk   )_make_request)r   reqr0   rk   s   r3   <lambda>$HttpClient.request.<locals>.<lambda>  s    **3*Qr6   c                    [        5       $ rL   r   )_s    r3   r   r     s    *,r6   c                &   > TR                  U 5      $ rL   )_is_retryable_http_error)errorr0   s    r3   r   r     s    d;;EBr6   r6   coder   r$   r&   r(   r*   ) 
_build_url_prepare_headers
isinstancer'   encoder   upperrE   rF   rp   rn   create_default_contextrq   rr   rs   rt   load_cert_chainru   rv   check_hostname	CERT_NONEverify_moderl   call_with_retryr   read	Exceptionr&   ri   _maybe_decompressgetattrr   )r0   r   r   r   r&   r   rk   r(   all_headersr   eerr_bodyry   rz   headers_mapr$   responser   r   s   `     `          @@r3   requestHttpClient.request   s    ood+++G:'1$'<'<t{{7#$#lln4U,099;!!'**44<<<<<< ((++!%!6!6 $ 4 4!%!9!9 ,  446).&&)mm#	::--Q&B 
  	H668 56YY_"4K4K4MN4MDA1779a<4MNKN--hDHQ*/aF## 	H O!	sN   (E. .
H(8H#;FH#
FH#F)H#G >H#H(#H(c                   [        X=(       d    U R                  US9 nUR                  5       nUR                  R	                  5        VVs0 s H  u  pgUR                  5       U_M     nnnU R                  XX5      n[        UR                  UUR                  5       US9sS S S 5        $ s  snnf ! , (       d  f       g = f)N)rk   r   r   )
r   rk   r   r&   ri   rE   r   r   r$   geturl)	r0   r   r   rk   resprawry   rz   r   s	            r3   r   HttpClient._make_request/  s     W&=wOSW))+C48LL4F4F4HI4HDA1779a<4HKI((:C{{#KKM		 POI POs   .B0B*)7B0*B00
B>c                d    [        U[        5      (       a  U R                  UR                  5      $ g)NF)r   r   _should_retry_statusr   )r0   r   s     r3   r   #HttpClient._is_retryable_http_error@  s'    eY'',,UZZ88r6   c           	         U R                  UUUUUUS9nSUR                  s=::  a  S:  d1  O  [        UR                  UR                  UR	                  5       5      eU(       a  UR                  5       $ U$ )N)r   r   r   r&   r   rk      i  )r   r$   r   r(   r4   r8   )	r0   r   r   r   r&   rk   r   r   r   s	            r3   r   HttpClient._json_callF  sm     ||  
 t{{(S(DKK499;??99;r6   c                Z    Ub  Ub  [        S5      eUb  [        R                  " USSS9$ U$ )Nz+Provide either json_body or data, not both.F),:)ensure_ascii
separators)
ValueErrorr8   dumps)r0   r   r   s      r3   r   HttpClient._prepare_body`  s9      T%5JKK ::ie
SSr6   c                    [        U R                  =(       d    SU5      nU(       aM  [        UR                  5        VVs0 s H  u  pEUc  M
  XE_M     snnSS9nSU;   a  SOSnU(       a  U U U 3OUnU$ s  snnf )Nr=   T)doseq?&)r   rh   r   ri   )r0   r   r   r(   ry   rz   query	separators           r3   r   HttpClient._build_urli  sx     dmm)r40"(,,.B.$!A.B$E !$s
I05SE)UG,3C
	 Cs   	A6
A6
c                D   0 nUR                  U R                  5        UR                  SS5        UR                  SU R                  5        UR                  SS5        Ub'  [	        U[
        5      (       a  UR                  SS5        U R                  (       aU  SU;  aO  U R                  u  pE[        R                  " U S	U 3R                  S
5      5      R                  S5      nSU 3US'   U(       a+  UR                  5        H  u  pxXUR                  5       '   M     U$ )Nacceptzapplication/jsonz
user-agentzaccept-encodingzgzip, deflater<   zapplication/json; charset=utf-8authorizationr   rA   asciizBasic )updaterj   
setdefaultrx   r   r'   rw   base64	b64encoder   r/   ri   rE   )	r0   r&   r   prepareduserpwdtokenry   rz   s	            r3   r   HttpClient._prepare_headersz  s     $&--. 	H&89L$//:-? 
4 5 50QR ??h>ID$$vQse_%;%;G%DELLWUE*0(8H_% &'# (
 r6   c                    U[         ;   $ rL   )RETRY_STATUS_CODES)r0   r$   s     r3   r   HttpClient._should_retry_status  s    +++r6   c                   U(       d  U$ UR                  S5      =(       d    SR                  5       n SU;   a  [        R                  " U5      $ SU;   a'   [        R                  " U[        R
                  * 5      $  U$ ! [        R                   a    [        R                  " U5      s $ f = f! [         a    Us $ f = f)Nzcontent-encodingr=   gzipdeflate)rB   rE   r   
decompresszlib	MAX_WBITSr   r   )r0   r*   r&   r1   s       r3   r   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>)rj   rw   rh   rs   rq   rr   rt   ru   rv   rl   rk   rx   rp   )rh   r'   r&   Optional[Mapping[str, str]]rk   floatrl   r   rp   boolrq   rM   rr   rM   rs   zOptional[Union[str, bytes]]rt   rM   ru   rM   rv   rM   rw   zOptional[Tuple[str, str]]rx   r'   rN   None)NNNT)r   r'   r   GOptional[Mapping[str, Union[None, str, int, float, bool, list, tuple]]]r&   r   rk   Optional[float]r   r   rN   Union[HttpResponse, Any])NNNNNT)r   r'   r   Optional[Any]r   Optional[Union[bytes, str]]r   r   r&   r   rk   r   r   r   rN   r   )NNNN)r   r'   r   r'   r   r   r&   r   r   r  rk   r   rN   r   )NN)r   r   r   zOptional[ssl.SSLContext]rk   r   )r   r   rN   r   )NNNNT)r   r'   r   r'   r   r   r&   r   rk   r   r   r  r   r   rN   r   )r   r  r   r  rN   r  rL   )r   r'   r   r   rN   r'   )r&   r   r   r  rN   r%   )r$   r#   rN   r   )r*   r)   r&   zMapping[str, str]rN   r)   )rO   rP   rQ   rR   __doc__r   r   r   r   r   r   DEFAULT_USER_AGENTrZ   rB   r   r   r   r   r   r   r   r   r   r   r   r   r   rT   rK   r6   r3   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	@,r6   r   )+
__future__r   r   r   r8   rn   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   rK   r6   r3   <module>r     s    "    
  ! = = , + +
H V V 6  "@ .    0'	 'r rr6   