
    F2jG<              
      "   d Z ddlmZ ddlZddlZddlZddlZddlmZ ddl	m
Z
 ddlmZmZmZmZmZ ej        rddlmZmZ g d	Zd*dZd+dZd,dZ G d dej        eej        ej        eef                  f         ej        e                   Z G d dee                   Z G d dee                   Z G d d          Z G d  d!          Z  G d" d#ee          Z! G d$ d%ee          Z" G d& d'e e          Z# G d( d)e e          Z$dS )-a  
requests.hooks
~~~~~~~~~~~~~~

This module provides the capabilities for the Requests hooks system.

Available hooks:

``pre_request``:
    The prepared request just got built. You may alter it prior to be sent through HTTP.
``pre_send``:
    The prepared request got his ConnectionInfo injected.
    This event is triggered just after picking a live connection from the pool.
``on_upload``:
    Permit to monitor the upload progress of passed body.
    This event is triggered each time a block of data is transmitted to the remote peer.
    Use this hook carefully as it may impact the overall performance.
``response``:
    The response generated from a Request.
    )annotationsN)MutableMapping   )iscoroutinefunction)_HVAsyncHookCallableTypeAsyncHookTypeHookCallableTypeHookType)PreparedRequestResponsepre_requestpre_send	on_uploadearly_responseresponsereturnHookType[_HV]c                 $    d t           D             S )Nc                    i | ]}|g S  r   ).0events     V/home/thesage/.hermes/hermes-agent/venv/lib/python3.11/site-packages/niquests/hooks.py
<dictcomp>z!default_hooks.<locals>.<dictcomp>4   s    )))%E2)))    )HOOKSr   r   r   default_hooksr   3   s    ))5))))r   keystrhooksHookType[_HV] | None	hook_datar   kwargs
typing.Anyc                    ||S |                     |           }|rAt          |          r|g}|D ],}	  ||fi |}n# t          $ r  ||          }Y nw xY w||}-|S )z6Dispatches a hook dictionary on a given piece of data.)getcallable	TypeErrorr    r"   r$   r%   	callableshook
_hook_datas          r   dispatch_hookr/   7   s    }49IIcNNI 	'I 	$"I 	' 	'D-!T)66v66

 - - -!T)__


-%&	s   	=AAAsyncHookType[_HV] | Nonec                D  K   ||S |                     |           }|rt          |          r|g}|D ]m}t          |          r2	  ||fi | d{V }nG# t          $ r  ||           d{V }Y n*w xY w	  ||fi |}n# t          $ r  ||          }Y nw xY w||}n|S )zEDispatches a hook dictionary on a given piece of data asynchronously.N)r(   r)   r   r*   r+   s          r   async_dispatch_hookr2   L   s/     }QVQZQZ[^Q_Q_I 'I 	$"I 	' 	'D"4(( 	17'+tI'@'@'@'@!@!@!@!@!@!@JJ  7 7 7'+tI!6!6!6!6!6!6JJJ71!%i!:!:6!:!:JJ  1 1 1!%iJJJ1 %&	s$   AA21A26	B  BBc                  N    e Zd ZddZddZdd
ZddZddZd Zd Z	d Z
d ZdS )_BaseLifeCycleHookr   Nonec                     g g g g g d| _         d S Nr   _storeselfs    r   __init__z_BaseLifeCycleHook.__init__k   s%     f
 f
r   r    str | bytesvalue8list[HookCallableType[_HV] | AsyncHookCallableType[_HV]]c                     t          d          NzLifeCycleHook is Read OnlyNotImplementedError)r;   r    r>   s      r   __setitem__z_BaseLifeCycleHook.__setitem__t       !">???r   r!   c                    | j         |         S Nr8   r;   r    s     r   __getitem__z_BaseLifeCycleHook.__getitem__w   s    {3r   c                    | |         S rG   r   rH   s     r   r(   z_BaseLifeCycleHook.getz   s    Cyr   c                    t          |t                    st          i }t                      }| j                                        D ]%\  }}|||<   ||xx         |j        |         z  cc<   &||_        |S rG   )
isinstancer4   r*   r9   items)r;   other	tmp_storecombined_hookshfnss         r   __add__z_BaseLifeCycleHook.__add__}   s    %!344 	O	2D2F2Fk'')) 	, 	,FAsIaLaLLLELO+LLLL )r   c              #  $   K   | j         E d {V  d S rG   r8   r:   s    r   __iter__z_BaseLifeCycleHook.__iter__   s&      ;r   c              #  ,   K   | D ]}|| |         fV  d S rG   r   rH   s     r   rM   z_BaseLifeCycleHook.items   s6       	! 	!CtCy.    	! 	!r   c                     t          d          rA   rB   rH   s     r   __delitem__z_BaseLifeCycleHook.__delitem__   rE   r   c                *    t          | j                  S rG   )lenr9   r:   s    r   __len__z_BaseLifeCycleHook.__len__   s    4;r   Nr   r5   )r    r=   r>   r?   r   r5   )r    r!   r   r?   )r   r4   )__name__
__module____qualname__r<   rD   rI   r(   rS   rU   rM   rX   r[   r   r   r   r4   r4   h   s        
 
 
 
@ @ @ @               ! ! !@ @ @         r   r4   c                  L     e Zd ZdZd fdZdd
ZddZddZddZddZ	 xZ
S )LifeCycleHookzP
    A sync-only middleware to be used in your request/response lifecycles.
    r   r5   c                    t                                                       | j                            | j        g| j        g| j        g| j        g| j        gd           d S r7   	superr<   r9   updater   r   r   r   r   r;   	__class__s    r   r<   zLifeCycleHook.__init__   o     $ 01!]O"n-#'#6"7!]O 	
 	
 	
 	
 	
r   prepared_requestr   r%   r&   PreparedRequest | Nonec                    dS zTThe prepared request just got built. You may alter it prior to be sent through HTTP.Nr   r;   ri   r%   s      r   r   zLifeCycleHook.pre_request       tr   c                    dS zThe prepared request got his ConnectionInfo injected. This event is triggered just
        after picking a live connection from the pool. You may not alter the prepared request.Nr   rm   s      r   r   zLifeCycleHook.pre_send   	     tr   c                    dS a  Permit to monitor the upload progress of passed body. This event is triggered each time
        a block of data is transmitted to the remote peer. Use this hook carefully as
        it may impact the overall performance. You may not alter the prepared request.Nr   rm   s      r   r   zLifeCycleHook.on_upload   s	     tr   r   r   c                    dS zAn early response caught before receiving the final Response for a given Request.
        Like but not limited to 103 Early Hints.Nr   r;   r   r%   s      r   r   zLifeCycleHook.early_response   rq   r   Response | Nonec                    dS zJThe response generated from a Request. You may alter the response at will.Nr   rv   s      r   r   zLifeCycleHook.response   rn   r   r\   ri   r   r%   r&   r   rj   ri   r   r%   r&   r   r5   r   r   r%   r&   r   r5   r   r   r%   r&   r   rw   r]   r^   r_   __doc__r<   r   r   r   r   r   __classcell__rg   s   @r   ra   ra               

 

 

 

 

 

      
      
       r   ra   c                  L     e Zd ZdZd fdZdd
ZddZddZddZddZ	 xZ
S )AsyncLifeCycleHookzR
    An async-only middleware to be used in your request/response lifecycles.
    r   r5   c                    t                                                       | j                            | j        g| j        g| j        g| j        g| j        gd           d S r7   rc   rf   s    r   r<   zAsyncLifeCycleHook.__init__   rh   r   ri   r   r%   r&   rj   c                
   K   dS rl   r   rm   s      r   r   zAsyncLifeCycleHook.pre_request         tr   c                
   K   dS rp   r   rm   s      r   r   zAsyncLifeCycleHook.pre_send          tr   c                
   K   dS rs   r   rm   s      r   r   zAsyncLifeCycleHook.on_upload   s       tr   r   r   c                
   K   dS ru   r   rv   s      r   r   z!AsyncLifeCycleHook.early_response   r   r   rw   c                
   K   dS ry   r   rv   s      r   r   zAsyncLifeCycleHook.response   r   r   r\   rz   r{   r|   r}   r~   r   s   @r   r   r      r   r   r   c                  J    e Zd ZU dZded<   ded<   ded<   dd	Zdd
ZddZdS )_LeakyBucketMixinz$Shared leaky bucket algorithm logic.floatrateintervalfloat | Nonelast_requestr   r5   c                6    || _         d|z  | _        d | _        d S )N      ?)r   r   r   )r;   r   s     r   _init_leaky_bucketz$_LeakyBucketMixin._init_leaky_bucket   s"    	d
 r   c                h    t          j                    }| j        || j        z
  }| j        |z
  }nd}|S )zDCompute wait time and update state. Returns wait time (may be <= 0).Ng        )time	monotonicr   r   r;   nowelapsed	wait_times       r   _compute_waitz_LeakyBucketMixin._compute_wait   s>    n(D--G/IIIr   c                6    t          j                    | _        dS )zRecord that a request was made.N)r   r   r   r:   s    r   _record_requestz!_LeakyBucketMixin._record_request  s     N,,r   Nr   r   r   r5   )r   r   r\   )r]   r^   r_   r   __annotations__r   r   r   r   r   r   r   r      sv         ..KKKOOO! ! ! !
   - - - - - -r   r   c                  T    e Zd ZU dZded<   ded<   ded<   ded<   dd
ZddZddZdS )_TokenBucketMixinz$Shared token bucket algorithm logic.r   r   capacitytokenslast_updater   r   r5   c                r    || _         ||n|| _        | j        | _        t          j                    | _        d S rG   )r   r   r   r   r   r   )r;   r   r   s      r   _init_token_bucketz$_TokenBucketMixin._init_token_bucket  s8    	$,$8dm>++r   c                    t          j                    }|| j        z
  }t          | j        | j        || j        z  z             | _        || _        | j        dk    r| xj        dz  c_        dS d| j        z
  | j        z  }|S )zUReplenish tokens and try to acquire one. Returns wait time if needed, None otherwise.r   Nr   r   r   minr   r   r   r   s       r   _acquire_tokenz _TokenBucketMixin._acquire_token  s    n(($-w7J)JKK;#KK3KK4 t{*di7Ir   c                    t          j                    }|| j        z
  }t          | j        | j        || j        z  z             | _        || _        | xj        dz  c_        dS )z*Called after waiting to consume the token.r   Nr   )r;   r   r   s      r   
_post_waitz_TokenBucketMixin._post_wait&  sY    n(($-w7J)JKKsr   Nr   r   r   r   r   r5   )r   r   r\   )r]   r^   r_   r   r   r   r   r   r   r   r   r   r   	  s         ..KKKOOOMMM, , , ,        r   r   c                  .     e Zd ZdZdd fdZddZ xZS )LeakyBucketLimiterap  Rate limiter using the leaky bucket algorithm.

    Requests "leak" out at a constant rate. When a request arrives, it waits
    until enough time has passed since the last request to maintain the rate.

    Usage::

        limiter = LeakyBucketLimiter(rate=10.0)  # 10 requests per second
        with niquests.Session(hooks=limiter) as session:
            ...
          $@r   r   r   r5   c                    t                                                       |                     |           t          j                    | _        dS zjInitialize the leaky bucket limiter.

        Args:
            rate: Maximum requests per second
        N)rd   r<   r   	threadingLock_lockr;   r   rg   s     r   r<   zLeakyBucketLimiter.__init__>  sB     	%%%^%%


r   ri   r   r%   r&   rj   c                    | j         5  |                                 }|dk    rt          j        |           |                                  ddd           n# 1 swxY w Y   dS )*Wait if needed to maintain the rate limit.r   N)r   r   r   sleepr   r;   ri   r%   r   s       r   r   zLeakyBucketLimiter.pre_requestH  s    Z 	# 	#**,,I1}}
9%%%  """		# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#
 ts   AAAAr   r   rz   r]   r^   r_   r   r<   r   r   r   s   @r   r   r   1  s`        
 
& & & & & & &       r   r   c                  .     e Zd ZdZdd fdZddZ xZS )AsyncLeakyBucketLimitera  Rate limiter using the leaky bucket algorithm.

    Requests "leak" out at a constant rate. When a request arrives, it waits
    until enough time has passed since the last request to maintain the rate.

    Usage::

        limiter = AsyncLeakyBucketLimiter(rate=10.0)  # 10 requests per second
        async with niquests.AsyncSession(hooks=limiter) as session:
            ...
    r   r   r   r   r5   c                    t                                                       |                     |           t          j                    | _        dS r   )rd   r<   r   asyncior   r   r   s     r   r<   z AsyncLeakyBucketLimiter.__init___  s@     	%%%\^^


r   ri   r   r%   r&   rj   c                   K   | j         4 d{V  |                                 }|dk    rt          j        |           d{V  |                                  ddd          d{V  n# 1 d{V swxY w Y   dS )r   Nr   )r   r   r   r   r   r   s       r   r   z#AsyncLeakyBucketLimiter.pre_requesti  s     : 	# 	# 	# 	# 	# 	# 	# 	#**,,I1}}mI.........  """		# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#
 ts   A	A++
A58A5r   r   rz   r   r   s   @r   r   r   R  s`        
 
$ $ $ $ $ $ $       r   r   c                  .     e Zd ZdZdd fd
ZddZ xZS )TokenBucketLimitera{  Rate limiter using the token bucket algorithm.

    Tokens are added to a bucket at a constant rate up to a maximum capacity.
    Each request consumes one token. Allows bursts up to the bucket capacity.

    Usage::

        limiter = TokenBucketLimiter(rate=10.0, capacity=50.0)  # 10/s, burst of 50
        with niquests.Session(hooks=limiter) as session:
            ...
    r   Nr   r   r   r   r   r5   c                    t                                                       |                     ||           t          j                    | _        dS zInitialize the token bucket limiter.

        Args:
            rate: Token replenishment rate (tokens per second)
            capacity: Maximum bucket capacity (defaults to rate, allowing 1 second burst)
        N)rd   r<   r   r   r   r   r;   r   r   rg   s      r   r<   zTokenBucketLimiter.__init__  sD     	h///^%%


r   ri   r   r%   r&   rj   c                    | j         5  |                                 }|(t          j        |           |                                  ddd           n# 1 swxY w Y   dS z1Wait until a token is available, then consume it.N)r   r   r   r   r   r   s       r   r   zTokenBucketLimiter.pre_request  s    Z 	" 	"++--I$
9%%%!!!		" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"
 ts   ?AAAr   Nr   rz   r   r   s   @r   r   r   s  s`        
 
	& 	& 	& 	& 	& 	& 	&       r   r   c                  .     e Zd ZdZdd fd
ZddZ xZS )AsyncTokenBucketLimitera  Rate limiter using the token bucket algorithm.

    Tokens are added to a bucket at a constant rate up to a maximum capacity.
    Each request consumes one token. Allows bursts up to the bucket capacity.

    Usage::

        limiter = AsyncTokenBucketLimiter(rate=10.0, capacity=50.0)  # 10/s, burst of 50
        async with niquests.AsyncSession(hooks=limiter) as session:
            ...
    r   Nr   r   r   r   r   r5   c                    t                                                       |                     ||           t          j                    | _        dS r   )rd   r<   r   r   r   r   r   s      r   r<   z AsyncTokenBucketLimiter.__init__  sB     	h///\^^


r   ri   r   r%   r&   rj   c                   K   | j         4 d{V  |                                 }|.t          j        |           d{V  |                                  ddd          d{V  n# 1 d{V swxY w Y   dS r   )r   r   r   r   r   r   s       r   r   z#AsyncTokenBucketLimiter.pre_request  s     : 	" 	" 	" 	" 	" 	" 	" 	"++--I$mI.........!!!		" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"
 ts   AA''
A14A1r   r   rz   r   r   s   @r   r   r     s`        
 
	$ 	$ 	$ 	$ 	$ 	$ 	$       r   r   )r   r   )
r    r!   r"   r#   r$   r   r%   r&   r   r   )
r    r!   r"   r0   r$   r   r%   r&   r   r   )%r   
__future__r   r   r   r   typingcollections.abcr   _compatr   r   r   r	   r
   r   TYPE_CHECKINGmodelsr   r   r   r   r/   r2   r!   ListUnionGenericr4   ra   r   r   r   r   r   r   r   r   r   r   <module>r      s   * # " " " " "        * * * * * * ( ( ( ( ( (              
 211111111	 	 	* * * *   *   8/  /  /  /  / 
#v{6<8HJ_8_+`aabdjdrsvdw/  /  / d' ' ' ' '&s+ ' ' 'T' ' ' ' '+C0 ' ' 'T- - - - - - - -6% % % % % % % %P    *M   B    /1C   B    *M   D    /1C     r   