
    Pqhj                     d    d dl mZ d dlmZ ddlmZ ddlmZ dZ	d Z
dd	Zdd
Z G d de      Zy)    )Lock)sha256   )_IndividualCache)_ExpiringMappingz,urn:ietf:params:oauth:grant-type:device_codec                 d    t        t        |       j                  d            j                         S )Nzutf-8)r   reprencode	hexdigest)raws    [/srv/www/ollama/chat-ollama/venv/lib/python3.12/site-packages/msal/throttled_http_client.py_hashr      s%    $s)""7+,6688    Nc                 n   | J d       | }t        |di       j                         D ci c]  \  }}|j                         | }}}|j                  dk(  s|j                  dk\  sd|v syd}t	        |j                  d|            }	 t	        |      }t        d|      S c c}}w # t        $ r |}Y w xY w)	zReturn seconds to throttlez
        The signature defines it with a default value None,
        only because the its shape is already decided by the
        IndividualCache's.__call__().
        In actual code path, the result parameter here won't be None.
        headersi  i  retry-afterr   <   i  )getattritemslowerstatus_codeintget
ValueErrormin)	resultignoredresponsekvlowercase_headersdefaultretry_afterdelay_secondss	            r   _parse_http_429_5xx_retry_afterr%      s         H29)R3!!&*$!QA * *   C'8+?+?3+F 11G'++M7CDK  K( t]##*    s   B 	B& &B43B4c                 l    | j                  di       }t        |t              r|j                  |      S |S )Ndata)r   
isinstancedict)kwargskeyr"   r'   s       r   _extract_datar,   +   s.    ::fb!D&tT2488C=??r   c                       e Zd Zd Zd Zy)ThrottledHttpClientc                    t        ||ni dt                     }|j                  } t        |d t              |      } t        |d d
d      |      }|| _         t        |d dd	      |j
                        | _        || _        y)zThrottle the given http_client by storing and retrieving data from cache.

        This wrapper exists so that our patching post() and get() would prevent
        re-patching side effect when/if same http_client being reused.
        Ni   )mappingcapacitylockc                     dj                  |d   t        |d      t        |d      t        t        |dt        |dt        |d                              S )Nz9POST {} client_id={} scope={} hash={} 429/5xx/Retry-Afterr   	client_idscoperefresh_tokencodeusername)formatr,   r   funcargsr*   s      r   <lambda>z.ThrottledHttpClient.__init__.<locals>.<lambda>C   s_    KRRG!&+6!&'2 &fo)&& -fj ACD	E	 r   )r0   	key_maker
expires_inc                     dj                  |d   t        t        |j                  d            t        |j                  d            z               S )NzPOST {} hash={} 400r   paramsr'   )r9   r   strr   r:   s      r   r=   z.ThrottledHttpClient.__init__.<locals>.<lambda>U   sH    1F1M1MQ 

8,-FJJv4F0GGI2 r   c           	          | j                   dk(  rit        |j                  d      t              r|d   j                  d      t        k(  s/dt        d t        | di       j                         D              vrdS dS )	Ni  r'   
grant_typer   c              3   <   K   | ]  }|j                           y wN)r   ).0hs     r   	<genexpr>zAThrottledHttpClient.__init__.<locals>.<lambda>.<locals>.<genexpr>s   s      -N"#AGGI-Ns   r   r   r   )r   r(   r   r)   DEVICE_AUTH_GRANTsetr   keys)r   r*   r   s      r   r=   z.ThrottledHttpClient.__init__.<locals>.<lambda>g   s    %%, vzz&148v**<8<MM! -N'.vy"'E'J'J'L-N *N N    r   c           	      ^    dj                  |d   t        |j                  dd                  S )NzGET {} hash={} 2xxr   rA    )r9   r   r   r:   s      r   r=   z.ThrottledHttpClient.__init__.<locals>.<lambda>|   s,    1E1L1LQfjj2./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   r=   z.ThrottledHttpClient.__init__.<locals>.<lambda>   s&    &"4"4:s: : r   )NNrF   )ExpiringMappingr   postIndividualCacher%   r   _http_client)selfhttp_client
http_cacheexpiring_mapping_posts        r   __init__zThrottledHttpClient.__init__1   s     +","8Jb    % 7#$ %(#$$)#F G#J 	?$B oo (r   c                 6    | j                   j                         S )zGMSAL won't need this. But we allow throttled_http_client.close() anyway)rT   close)rU   s    r   r\   zThrottledHttpClient.close   s      &&((r   N)__name__
__module____qualname__rZ   r\    r   r   r.   r.   0   s    S(r)r   r.   rF   )	threadingr   hashlibr   individual_cacher   rS   r   rQ   rJ   r   r%   r,   objectr.   r`   r   r   <module>re      s8      A A C 9$6@
\)& \)r   