
    0j#                         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dS )    )Lock)sha256   )_IndividualCache)_ExpiringMapping)Response)MsalServiceErrorz,urn:ietf:params:oauth:grant-type:device_codec                 $    t          | di           S )Nheaders)getattr)responses    b/home/rurouni/.hermes/hermes-agent/venv/lib/python3.11/site-packages/msal/throttled_http_client.py_get_headersr      s     8Y+++    c                   D    e Zd Zd                                ZddZd ZdS )RetryAfterParserzRetry-AfterNc                     |dn|| _         d S )N   )_default_value)selfdefault_values     r   __init__zRetryAfterParser.__init__   s    #0#8aamr   c                N   |}d t          |                                          D             }|j        dk    s|j        dk    s| j        |v sdS |                    | j        | j                  }	 t          |          }n# t          $ r
 | j        }Y nw xY wt          d|          S )zReturn seconds to throttlec                 >    i | ]\  }}|                                 |S  lower.0kvs      r   
<dictcomp>z*RetryAfterParser.parse.<locals>.<dictcomp>   s&    UUUdaQWWYYUUUr   i  i  r   i  )	r   itemsstatus_codeFIELD_NAME_LOWERgetr   int
ValueErrormin)r   resultignoredr   lowercase_headersretry_afterdelay_secondss          r   parsezRetryAfterParser.parse   s    UUl86L6L6R6R6T6TUUU$++x/Cs/J/J(,===1'++D,A4CVWW	0  ,,MM 	0 	0 	0 /MMM	04'''s   0B   BBN)__name__
__module____qualname__r   r%   r   r/   r   r   r   r   r      sM        $**,,L L L L( ( ( ( (r   r   Nc                     |                      di           }t          |t                    r|                     |          n|S )Ndata)r&   
isinstancedict)kwargskeydefaultr5   s       r   _extract_datar;   +   s8    ::fb!!D&tT22?488C===?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        | _        d t	          |                                          D             | _        d S )Nc                 >    i | ]\  }}|                                 |S r   r   r   s      r   r"   z/NormalizedResponse.__init__.<locals>.<dictcomp>8   s3     
 
 
!QAGGIIq
 
 
r   )superr   r$   textr   r#   r   )r   raw_response	__class__s     r   r   zNormalizedResponse.__init__4   sf    '3 %	
 
%1,%?%?%E%E%G%G
 
 
r   c                 p    | j         dk    r*t          d                    | j                   d d           d S )N  zHTTP Error: {})errorerror_description)r$   r	   formatr   s    r   raise_for_statusz#NormalizedResponse.raise_for_statusC   sH    s""" ''(899d    #"r   )r1   r2   r3   __doc__r   rJ   __classcell__rC   s   @r   r=   r=   0   sQ         

 

 

 

 

      r   r=   c                   F    e Zd ZdZdddZd Zd Zd Zed             Z	dS )	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	                                | _        d S )Ni   )mappingcapacitylock)r6   rO   http_clientExpiringMappingr   _expiring_mapping)r   rU   rP   s      r   r   z ThrottledHttpClientBase.__init__U   sc    6@072 72 C;227B 	 "1","8JJb" " "r   c                 @    t           | j        j        |i |          S r0   )r=   rU   postr   argsr8   s      r   rY   zThrottledHttpClientBase.post_   s&    !"7$"2"7"H"H"HIIIr   c                 @    t           | j        j        |i |          S r0   )r=   rU   r&   rZ   s      r   r&   zThrottledHttpClientBase.getb   s&    !"6$"2"6"G"G"GHHHr   c                 4    | j                                         S r0   )rU   closerI   s    r   r^   zThrottledHttpClientBase.closee   s    %%'''r   c                     t          t          |                               d                                                    S )Nzutf-8)r   reprencode	hexdigest)raws    r   _hashzThrottledHttpClientBase._hashh   s0    d3ii&&w//00::<<<r   )
r1   r2   r3   rK   r   rY   r&   r^   staticmethodrd   r   r   r   rO   rO   K   s          37     J J JI I I( ( ( = = \= = =r   rO   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                     j        |i |  t           j         fdt          |pd          j                   j                   _         t           j         fdd	d           j                   _         t           j         fdd
d           j                   _        dS )z/Decorate self.post() and self.get() dynamicallyc                    d                     |d         t          |d          t          |d                              t          |dt          |dt          |dt          |d                                                            S )	Nz9POST {} client_id={} scope={} hash={} 429/5xx/Retry-Afterr   	client_idscoperefresh_tokencodeusernameuser_id)rH   r;   rd   funcr[   r8   r   s      r   <lambda>z.ThrottledHttpClient.__init__.<locals>.<lambda>v   s    KRRG!&+66!&'22JJ &fo)&& -fj$1&)$D$D!F !FG GH H	I I	  r   r   )rR   	key_maker
expires_inc                     d                     |d                             t          |                    d                    t          |                    d                    z                       S )NzPOST {} hash={} 400r   paramsr5   )rH   rd   strr&   rq   s      r   rs   z.ThrottledHttpClient.__init__.<locals>.<lambda>   sd    1F1M1MQ

 

8,,--FJJv4F4F0G0GGI I2 2 r   Nc                    | j         dk    rt          |                    d          t                    r$|d                             d          t          k    s4t
          j        t          d t          |           D                       vrdndS )NrE   r5   
grant_typec              3   >   K   | ]}|                                 V  d S r0   r   )r   hs     r   	<genexpr>zAThrottledHttpClient.__init__.<locals>.<lambda>.<locals>.<genexpr>   sC       A= A="#AGGIIA= A= A= A= A= A=r   <   r   )	r$   r6   r&   r7   DEVICE_AUTH_GRANTr   r%   setr   )r*   r8   r+   s      r   rs   z.ThrottledHttpClient.__init__.<locals>.<lambda>   s    %,, vzz&11488 - v**<88<MMM$5S A= A='3F';';A= A= A= >= >= = =   r   c           	          d                     |d                             |                    dd                              S )NzGET {} hash={} 2xxr   rw    )rH   rd   r&   rq   s      r   rs   z.ThrottledHttpClient.__init__.<locals>.<lambda>   s<    1E1L1LQ

6::h33442 2 r   c                 4    d| j         cxk    rdk     rn ndndS )N   i,  iQ r   )r$   )r*   r+   s     r   rs   z.ThrottledHttpClient.__init__.<locals>.<lambda>   s2    &"4::::s::::: r   )NNr0   )	r@   rg   r   IndividualCacherW   r   r/   rY   r&   )r   rh   r[   r8   rC   s   `   r   r   zThrottledHttpClient.__init__o   s6   1!4((14B6BBBO *    ((=(BCCI%  & i' 	*#O*   $  )# # #F iG# #	J?*   B B B   h r   )r1   r2   r3   rK   r   rL   rM   s   @r   rg   rg   m   sV        VV48 E E E E E E E E E E Er   rg   r0   )	threadingr   hashlibr   individual_cacher   r   r   rV   oauth2cli.httpr   
exceptionsr	   r   r   objectr   r;   r=   rO   rg   r   r   r   <module>r      s_               A A A A A A A A A A A A $ $ $ $ $ $ ( ( ( ( ( ( C , , ,( ( ( ( (v ( ( (,@ @ @ @
       6= = = = =f = = =DG G G G G1 G G G G Gr   