
    phK;                       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  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)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      P/home/james-whalen/.local/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)r.   )jsonloadsr1   r+   )r-   s    r0   r5   HttpResponse.json$   s%    zz$))T-?-?-A)BCCr3   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)r-   ctypepartps       r0   r+   HttpResponse._get_encoding'   su      4KK$D

Awwy##J//wwsAq)//1<W< % r3    N)r.   Optional[str]returnr$   )rK   r   )rK   r$   )	__name__
__module____qualname____firstlineno____annotations__r1   r5   r+   __static_attributes__rH   r3   r0   r   r      s'    K	HN:Dr3   r   c                  0   ^  \ rS rSrSSU 4S jjjrSrU =r$ )r   2   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__)r-   r!   r%   rU   	__class__s       r0   rW   HttpError.__init__3   s7    <E&se"<&r3   )rU   r!   r%   rI   )r!   r    r%   r$   rU   rJ   )rL   rM   rN   rO   rW   rQ   __classcell__)rX   s   @r0   r   r   2   s    ' 'r3   r   c                  t   \ rS rSrSrSS\\" \" SSS9S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:   Nr=   
   )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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-   rg   r#   rj   rk   ro   rp   rq   rr   rs   rt   ru   rv   rw   kvs                   r0   rW   HttpClient.__init__?   s    Z  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#   rj   bodyexpect_json
_json_callr-   pathr~   r#   rj   r   s         r0   r?   HttpClient.get   s/     #  
 	
r3   c           
     ,    U R                  SUUUUS US9$ )NDELETEr}   r   r   s         r0   deleteHttpClient.delete   s/     #  
 	
r3   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r-   r   r   r   r~   r#   rj   r   s           r0   postHttpClient.post   s=     ##i#C#  
 	
r3   c                F    U R                  SUUUUU R                  X#S9US9$ )NPUTr   r}   r   r   s           r0   putHttpClient.put   s=     ##i#C#  
 	
r3   c                F    U R                  SUUUUU R                  X#S9US9$ )NPATCHr   r}   r   r   s           r0   patchHttpClient.patch   s=     ##i#C#  
 	
r3   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)Nr>   )r%   methodr   r#   https)cafilecapathcadata)certfilekeyfilepasswordFc                 &   > TR                  TT TS9$ )N)contextrj   )_make_request)r   reqr-   rj   s   r0   <lambda>$HttpClient.request.<locals>.<lambda>  s    **3*Qr3   c                    [        5       $ rI   r   )_s    r0   r   r     s    *,r3   c                &   > TR                  U 5      $ rI   )_is_retryable_http_error)errorr-   s    r0   r   r     s    d;;EBr3   r3   coder   r!   r#   r%   r'   ) 
_build_url_prepare_headers
isinstancer$   encoder   upperrB   rC   ro   rm   create_default_contextrp   rq   rr   rs   load_cert_chainrt   ru   check_hostname	CERT_NONEverify_moderk   call_with_retryr   read	Exceptionr#   rh   _maybe_decompressgetattrr   )r-   r   r   r~   r#   r   rj   r%   all_headersr   eerr_bodyrx   ry   headers_mapr!   responser   r   s   `     `          @@r0   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)rj   r   r   )
r   rj   r   r#   rh   rB   r   r   r!   geturl)	r-   r   r   rj   resprawrx   ry   r   s	            r0   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   )r-   r   s     r0   r   #HttpClient._is_retryable_http_error<  s'    eY'',,UZZ88r3   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   rj      i  )r   r!   r   r%   r1   r5   )	r-   r   r   r~   r#   rj   r   r   r   s	            r0   r   HttpClient._json_callB  sm     ||  
 t{{(S(DKK499;??99;r3   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)
ValueErrorr5   dumps)r-   r   r   s      r0   r   HttpClient._prepare_body\  s9      T%5JKK ::ie
SSr3   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   rg   r   rh   )r-   r   r~   r%   rx   ry   query	separators           r0   r   HttpClient._build_urle  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, deflater9   zapplication/json; charset=utf-8authorizationr   r>   asciizBasic )updateri   
setdefaultrw   r   r$   rv   base64	b64encoder   r,   rh   rB   )	r-   r#   r   prepareduserpwdtokenrx   ry   s	            r0   r   HttpClient._prepare_headersv  s     $&--. 	H&89L$//:-? 
4 5 50QR ??h>ID$$vQse_%;%;G%DELLWUE*0(8H_% &'# (
 r3   c                    U[         ;   $ rI   )RETRY_STATUS_CODES)r-   r!   s     r0   r   HttpClient._should_retry_status  s    +++r3   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)r?   rB   r   
decompresszlib	MAX_WBITSr   r   )r-   r'   r#   r.   s       r0   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>)ri   rv   rg   rr   rp   rq   rs   rt   ru   rk   rj   rw   ro   )rg   r$   r#   Optional[Mapping[str, str]]rj   floatrk   r   ro   boolrp   rJ   rq   rJ   rr   zOptional[Union[str, bytes]]rs   rJ   rt   rJ   ru   rJ   rv   zOptional[Tuple[str, str]]rw   r$   rK   None)NNNT)r   r$   r~   GOptional[Mapping[str, Union[None, str, int, float, bool, list, tuple]]]r#   r   rj   Optional[float]r   r   rK   Union[HttpResponse, Any])NNNNNT)r   r$   r   Optional[Any]r   Optional[Union[bytes, str]]r~   r   r#   r   rj   r   r   r   rK   r   )NNNN)r   r$   r   r$   r~   r   r#   r   r   r  rj   r   rK   r   )NN)r   r   r   zOptional[ssl.SSLContext]rj   r   )r   r   rK   r   )NNNNT)r   r$   r   r$   r~   r   r#   r   rj   r   r   r  r   r   rK   r   )r   r   r   r  rK   r  rI   )r   r$   r~   r   rK   r$   )r#   r   r   r  rK   r"   )r!   r    rK   r   )r'   r&   r#   zMapping[str, str]rK   r&   )rL   rM   rN   rO   __doc__r   r   r   DEFAULT_USER_AGENTrW   r?   r   r   r   r   r   r   r   r   r   r   r   r   r   rQ   rH   r3   r0   r   r   :   s    /3(0aR@!
  !%!%/3*.)--104,%?%?% -?% 	?%
 ?% ?% ?% ?% -?% (?% '?%  +!?%" .#?%$ %?%& 
'?%N /3#' 



 -
 !
 
 
"
2 /3#' 



 -
 !
 
 
"
. $(,0 /3#' 

 !
 *	

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

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



 -
 !
 
 
"
: /3,0#'== =
	= -= *= != 
=D -1#'	 * !	" /3#',0  
	 - ! *  
"6 TX&5P	$ 
 
"2:U	@,r3   r   )'
__future__r   r   r   r5   rm   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   rH   r3   r0   <module>r     sy    "    
  ! = = , + +
H 6  "@ .    0'	 'o or3   