
    }Ci?#                         S SK Jr  S SKJr  SSKJr  SSKJr  SSK	J
r
  SSKJr  SrS	 r " S
 S\5      rSS jr " S S\
5      r " S S\5      r " S S\5      rg)    )Lock)sha256   )_IndividualCache)_ExpiringMapping)Response)MsalServiceErrorz,urn:ietf:params:oauth:grant-type:device_codec                     [        U S0 5      $ )Nheaders)getattr)responses    R/var/www/html/troy/venv/lib/python3.13/site-packages/msal/throttled_http_client.py_get_headersr      s     8Y++    c                   D    \ rS rSrSR	                  5       rSS jrS rSrg)RetryAfterParser   zRetry-AfterNc                 (    Uc  SU l         g UU l         g )N   _default_value)selfdefault_values     r   __init__RetryAfterParser.__init__   s    #0#8amr   c                   Un[        U5      R                  5        VVs0 sH  u  pEUR                  5       U_M     nnnUR                  S:X  d!  UR                  S:  d  U R                  U;   d  gUR                  U R                  U R                  5      n [        U5      n[        SU5      $ s  snnf ! [         a    U R                  n N*f = f)zReturn seconds to throttlei  i  r   i  )
r   itemslowerstatus_codeFIELD_NAME_LOWERgetr   int
ValueErrormin)	r   resultignoredr   kvlowercase_headersretry_afterdelay_secondss	            r   parseRetryAfterParser.parse   s    6B86L6R6R6TU6TdaQWWY\6TU$$+x/C/Cs/J((,=='++D,A,A4CVCVW	0  ,M 4'' V  	0 //M	0s   B-B3 3CCr   N)	__name__
__module____qualname____firstlineno__r   r    r   r,   __static_attributes__ r   r   r   r      s    $**,L(r   r   Nc                 v    U R                  S0 5      n[        U[        5      (       a  UR                  U5      $ U$ )Ndata)r!   
isinstancedict)kwargskeydefaultr6   s       r   _extract_datar<   +   s1    ::fb!D&tT22488C=??r   c                   2   ^  \ rS rSrSrU 4S jrS rSrU =r$ )NormalizedResponse0   zgA http response with the shape defined in Response,
but contains only the data we will store in cache.
c                    > [         TU ]  5         UR                  U l        UR                  U l        [	        U5      R                  5        VVs0 sH  u  p#UR                  5       U_M     snnU l        g s  snnf r.   )superr   r   textr   r   r   r   )r   raw_responser'   r(   	__class__s       r   r   NormalizedResponse.__init__4   sd    '33 %%	%1,%?%E%E%G
%GTQAGGIqL%G
 
s   A4c                 l    U R                   S:  a$  [        SR                  U R                   5      S S S9eg )N  zHTTP Error: {})errorerror_description)r   r	   formatr   s    r   raise_for_status#NormalizedResponse.raise_for_statusC   s;    s"" ''(8(89d  #r   )r   r   rB   )	r/   r0   r1   r2   __doc__r   rL   r3   __classcell__rD   s   @r   r>   r>   0   s    

 r   r>   c                   H    \ rS rSrSrSS.S jrS rS rS r\	S	 5       r
S
rg)ThrottledHttpClientBaseK   ax  Throttle the given http_client by storing and retrieving data from cache.

This base exists so that:
1. These base post() and get() will return a NormalizedResponse
2. The base __init__() will NOT re-throttle even if caller accidentally nested ThrottledHttpClient.

Subclasses shall only need to dynamically decorate their post() and get() methods
in their __init__() method.
N)
http_cachec                    [        U[        5      (       a  UR                  OUU l        [        Ub  UO0 S[	        5       S9U l        g )Ni   )mappingcapacitylock)r7   rR   http_clientExpiringMappingr   _expiring_mapping)r   rY   rT   s      r   r    ThrottledHttpClientBase.__init__U   sI    6@072 72;227B 	 "1","8Jb"r   c                 L    [        U R                  R                  " U0 UD65      $ r.   )r>   rY   postr   argsr9   s      r   r^   ThrottledHttpClientBase.post_   s#    !$"2"2"7"7"H"HIIr   c                 L    [        U R                  R                  " U0 UD65      $ r.   )r>   rY   r!   r_   s      r   r!   ThrottledHttpClientBase.getb   s#    !$"2"2"6"6"G"GHHr   c                 6    U R                   R                  5       $ r.   )rY   closerK   s    r   re   ThrottledHttpClientBase.closee   s    %%''r   c                 d    [        [        U 5      R                  S5      5      R                  5       $ )Nzutf-8)r   reprencode	hexdigest)raws    r   _hashThrottledHttpClientBase._hashh   s%    d3i&&w/0::<<r   )r[   rY   )r/   r0   r1   r2   rN   r   r^   r!   re   staticmethodrl   r3   r4   r   r   rR   rR   K   s6     37 JI( = =r   rR   c                   4   ^  \ rS rSrSrSS.U 4S jjrSrU =r$ )ThrottledHttpClientm   zLA throttled http client that is used by MSAL's non-managed identity clients.N)default_throttle_timec                  >^  [         [        T ]
  " U0 UD6  [        T R                  U 4S j[        U=(       d    S5      R                  S9" T R                  5      T l        [        T R                  U 4S jS	S jS9" T R                  5      T l        [        T R                  U 4S jS
S jS9" T R                  5      T l        g)z/Decorate self.post() and self.get() dynamicallyc                    > SR                  US   [        US5      [        US5      TR                  [        US[        US[        US5      5      5      5      5      $ )Nz9POST {} client_id={} scope={} hash={} 429/5xx/Retry-Afterr   	client_idscoperefresh_tokencodeusername)rJ   r<   rl   funcr`   r9   r   s      r   <lambda>.ThrottledHttpClient.__init__.<locals>.<lambda>v   s_    KRRG!&+6!&'2JJ &fo)&& -fj ACD	E	r   r   )rV   	key_maker
expires_inc                    > SR                  US   TR                  [        UR                  S5      5      [        UR                  S5      5      -   5      5      $ )NzPOST {} hash={} 400r   paramsr6   )rJ   rl   strr!   rz   s      r   r|   r}      sK    1F1M1MQ

 

8,-FJJv4F0GGI2r   Nc                    U R                   S:X  ao  [        UR                  S5      [        5      (       a  US   R                  S5      [        :X  d/  [
        R                  [        S [        U 5       5       5      ;  a  S$ S$ )NrG   r6   
grant_typec              3   >   #    U H  oR                  5       v   M     g 7fr.   )r   ).0hs     r   	<genexpr>AThrottledHttpClient.__init__.<locals>.<lambda>.<locals>.<genexpr>   s      A=';!GGII';s   <   r   )	r   r7   r!   r8   DEVICE_AUTH_GRANTr   r    setr   )r%   r9   r&   s      r   r|   r}      s}    %%, vzz&1488v**<8<MM$55S A='3F';A= >= =   r   c           	      l   > SR                  US   TR                  UR                  SS5      5      5      $ )NzGET {} hash={} 2xxr   r    )rJ   rl   r!   rz   s      r   r|   r}      s/    1E1L1LQ

6::h342r   c                 :    SU R                   s=::  a  S:  a  S$   S$ )N   i,  iQ r   )r   )r%   r&   s     r   r|   r}      s"    &"4"4:s:A:Ar   )NNr.   )	rA   rp   r   IndividualCacher[   r   r,   r^   r!   )r   rr   r`   r9   rD   s   `   r   r   ThrottledHttpClient.__init__o   s    !414B6B# ** ((=(BCII#$ ii%	( $**$)#F iiG#	J #**B hhr   )r!   r^   )r/   r0   r1   r2   rN   r   r3   rO   rP   s   @r   rp   rp   m   s    V48 D Dr   rp   r.   )	threadingr   hashlibr   individual_cacher   r   r   rZ   oauth2cli.httpr   
exceptionsr	   r   r   objectr   r<   r>   rR   rp   r4   r   r   <module>r      s_      A A $ ( C ,(v (,@
 6=f =DF1 Fr   