
    9i?#                         d dl mZ d dlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ dZd	 Z G d
 de      ZddZ G d de
      Z G d de      Z G d de      Zy)    )Lock)sha256   )_IndividualCache)_ExpiringMapping)Response)MsalServiceErrorz,urn:ietf:params:oauth:grant-type:device_codec                     t        | di       S )Nheaders)getattr)responses    M/var/www/html/venv/lib/python3.12/site-packages/msal/throttled_http_client.py_get_headersr      s     8Y++    c                   :    e Zd Zdj                         ZddZd Zy)RetryAfterParserzRetry-AfterNc                 &    |d| _         y || _         y )N   )_default_value)selfdefault_values     r   __init__zRetryAfterParser.__init__   s    #0#8amr   c                   |}t        |      j                         D ci c]  \  }}|j                         | }}}|j                  dk(  s|j                  dk\  s| j                  |v sy|j                  | j                  | j                        }	 t        |      }t        d|      S c c}}w # t        $ r | j                  }Y )w xY w)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   parsezRetryAfterParser.parse   s    6B86L6R6R6TUdaQWWY\UU$$+x/C/Cs/J((,=='++D,A,A4CVCVW	0  ,M 4'' V  	0 //M	0s   B(B. .CCN)__name__
__module____qualname__r   r   r   r)    r   r   r   r      s    $**,L(r   r   Nc                 l    | j                  di       }t        |t              r|j                  |      S |S )Ndata)r   
isinstancedict)kwargskeydefaultr0   s       r   _extract_datar6   +   s.    ::fb!D&tT2488C=??r   c                   (     e Zd ZdZ fdZd Z xZS )NormalizedResponsezoA http response with the shape defined in Response,
    but contains only the data we will store in cache.
    c                     t         |           |j                  | _        |j                  | _        t	        |      j                         D ci c]  \  }}|j                         | c}}| _        y c c}}w r*   )superr   r   textr   r   r   r   )r   raw_responser$   r%   	__class__s       r   r   zNormalizedResponse.__init__4   sa    '33 %%	%1,%?%E%E%G
!QAGGIqL
 
s   A3c                 p    | j                   dk\  r't        dj                  | j                         d d       y )N  zHTTP Error: {})errorerror_description)r   r	   formatr   s    r   raise_for_statusz#NormalizedResponse.raise_for_statusC   s;    s"" ''(8(89d  #r   )r+   r,   r-   __doc__r   rD   __classcell__r=   s   @r   r8   r8   0   s    

r   r8   c                   >    e Zd ZdZdddZd Zd Zd Zed        Z	y)	ThrottledHttpClientBasea  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                    t        |t              r|j                  n|| _        t        ||ni dt	                     | _        y )Ni   )mappingcapacitylock)r1   rI   http_clientExpiringMappingr   _expiring_mapping)r   rO   rJ   s      r   r   z ThrottledHttpClientBase.__init__U   sD    6@072;227B 	 "1","8Jb"r   c                 L    t         | j                  j                  |i |      S r*   )r8   rO   postr   argsr3   s      r   rS   zThrottledHttpClientBase.post_   s&    !"7$"2"2"7"7"H"HIIr   c                 L    t         | j                  j                  |i |      S r*   )r8   rO   r   rT   s      r   r   zThrottledHttpClientBase.getb   s&    !"6$"2"2"6"6"G"GHHr   c                 6    | j                   j                         S r*   )rO   closerC   s    r   rX   zThrottledHttpClientBase.closee   s    %%''r   c                 d    t        t        |       j                  d            j                         S )Nzutf-8)r   reprencode	hexdigest)raws    r   _hashzThrottledHttpClientBase._hashh   s%    d3i&&w/0::<<r   )
r+   r,   r-   rE   r   rS   r   rX   staticmethodr^   r.   r   r   rI   rI   K   s6     37 JI( = =r   rI   c                   (     e Zd ZdZdd fd
Z xZS )ThrottledHttpClientzLA throttled http client that is used by MSAL's non-managed identity clients.N)default_throttle_timec          	          t        t         
  |i |  t         j                   fdt        |xs d      j                         j                         _         t         j                   fdd	d       j                         _         t         j                   fdd
d       j                         _        y)z/Decorate self.post() and self.get() dynamicallyc                     dj                  |d   t        |d      t        |d      j                  t        |dt        |dt        |d                              S )Nz9POST {} client_id={} scope={} hash={} 429/5xx/Retry-Afterr   	client_idscoperefresh_tokencodeusername)rB   r6   r^   funcrU   r3   r   s      r   <lambda>z.ThrottledHttpClient.__init__.<locals>.<lambda>v   sd    KRRG!&+6!&'2JJ &fo)&& -fj ACD	E	 r   r   )rL   	key_maker
expires_inc                     dj                  |d   j                  t        |j                  d            t        |j                  d            z               S )NzPOST {} hash={} 400r   paramsr0   )rB   r^   strr   rj   s      r   rl   z.ThrottledHttpClient.__init__.<locals>.<lambda>   sM    1F1M1MQ

 

8,-FJJv4F0GGI2 r   Nc                     | j                   dk(  rgt        |j                  d      t              r|d   j                  d      t        k(  s-t
        j                  t        d t        |       D              vrdS dS )Nr?   r0   
grant_typec              3   <   K   | ]  }|j                           y wr*   )r   ).0hs     r   	<genexpr>zAThrottledHttpClient.__init__.<locals>.<lambda>.<locals>.<genexpr>   s      A="#AGGIA=s   <   r   )	r   r1   r   r2   DEVICE_AUTH_GRANTr   r   setr   )r"   r3   r#   s      r   rl   z.ThrottledHttpClient.__init__.<locals>.<lambda>   sz    %%, vzz&148v**<8<MM$55S A='3F';A= >= =    r   c           	      l    dj                  |d   j                  |j                  dd                  S )NzGET {} hash={} 2xxr   rp    )rB   r^   r   rj   s      r   rl   z.ThrottledHttpClient.__init__.<locals>.<lambda>   s1    1E1L1LQ

6::h342 r   c                 6    d| j                   cxk  rdk  rdS  dS )N   i,  iQ r   )r   )r"   r#   s     r   rl   z.ThrottledHttpClient.__init__.<locals>.<lambda>   s&    &"4"4:s: : r   )NNr*   )	r:   ra   r   IndividualCacherQ   r   r)   rS   r   )r   rb   rU   r3   r=   s   `   r   r   zThrottledHttpClient.__init__o   s    !414B6BO ** ((=(BCII#$ ii%	(#O**$)#F iiG#	J?**B hhr   )r+   r,   r-   rE   r   rF   rG   s   @r   ra   ra   m   s    V48 D Dr   ra   r*   )	threadingr   hashlibr   individual_cacher   r   r   rP   oauth2cli.httpr   
exceptionsr	   ry   r   objectr   r6   r8   rI   ra   r.   r   r   <module>r      s_      A A $ ( C ,(v (,@
 6=f =DF1 Fr   