
    Vh                        d dl Z d dlmZmZmZmZ d dlmZ d dlm	Z	 d dl
mZmZ d dlmZ d dlmZ d dlmZmZ d d	lmZmZmZmZmZ d d
lmZmZ dee   dedee   fdZdefdZdededee   dedeee   eee    f   f
dZ!dededee   dedeee   ef   f
dZ"dededee   dedeee   ef   f
dZ#dedee   defdZ$ G d de      Z% G d d      Z& G d d      Z'y)    N)CallableIterableOptionalTuple)	Starlette)MutableHeaders)BaseHTTPMiddlewareRequestResponseEndpoint)Request)Response)	BaseRouteMatch)ASGIAppMessageScopeReceiveSend)Limiter_rate_limit_exceeded_handlerroutesscopereturnc                     d }| D ]C  }|j                  |      \  }}|t        j                  k(  s+t        |d      s8|j                  }E |S )Nendpoint)matchesr   FULLhasattrr   )r   r   handlerroutematch_s         `/var/www/catia.catastroantioquia-mas.com/tasa/lib/python3.12/site-packages/slowapi/middleware.py_find_route_handlerr#      sO     G %=='qEJJ75*#=nnG% N    r   c                 8    | j                    d| j                   S )N.)
__module____name__)r   s    r"   _get_route_namer)      s!      !7#3#3"455r$   limiterrequestappc                     | j                   r,t        |j                  dd      s	 | j                  ||d       yy# t        $ r8}|j
                  j                  t        |      t              }|d|fcY d}~S d}~ww xY w)a  
    Utils to check (if needed) current requests limit.
    It returns a tuple of size 3:
        1. The exception handler to run, if needed
        2. a bool, True if we need to inject some headers, False otherwise
        3. the exception that happened, if any
    _rate_limiting_completeFTN)NTN)NFN)	_auto_checkgetattrstate_check_request_limit	Exceptionexception_handlersgettyper   )r*   r+   r   r,   eexception_handlers         r"   _check_limitsr9   !   s     70%$	/(('4@    	/ # 6 6 : :Q5! %eQ..	/s   : 	A;-A60A;6A;c                     t        | |||      \  }}}|r|sd|fS t        j                  |      rt        } |||      |fS )a  
    Returns a `Response` object if an error occurred, as well as a boolean to know
    whether we should inject headers or not.
    Used in our WSGI middleware, it only supports synchronous exception_handler.
    This will fallback on _rate_limit_exceeded_handler otherwise.
    N)r9   inspectiscoroutinefunctionr   r*   r+   r   r,   r8   _boolexcs          r"   sync_check_limitsr@   ;   sT     %2'7GS$Q!ucCU{ ""#458Wc*E11r$   c                    K   t        | |||      \  }}}|sd|fS t        j                  |      r |||       d{   |fS  |||      |fS 7 w)z
    Returns a `Response` object if an error occurred, as well as a boolean to know
    whether we should inject headers or not.
    Used in our ASGI middleware, this support both synchronous or asynchronous exception handlers.
    N)r9   r;   r<   r=   s          r"   async_check_limitsrB   P   sh      %2'7GS$Q!ucU{""#45&w44e;; #.55 5s   :AAAc                 \    |yt        |      }|| j                  v ry|| j                  v ryy)NTF)r)   _exempt_routes_route_limits)r*   r   names      r"   _should_exemptrG   b   s=    7#D w%%% w$$$r$   c                        e Zd ZdededefdZy)SlowAPIMiddlewarer+   	call_nextr   c                   K   |j                   }|j                  j                  }|j                  s ||       d {   S t	        |j
                  |j                        }t        ||      r ||       d {   S t        ||||      \  }}||S  ||       d {   }|r&|j                  ||j                  j                        }|S 7 7 U7 2wN)r,   r1   r*   enabledr#   r   r   rG   r@   _inject_headersview_rate_limit)	selfr+   rJ   r,   r*   r   error_responseshould_inject_headersresponses	            r"   dispatchzSlowAPIMiddleware.dispatchu   s      !99,,"7+++%cjj'--@'7+"7+++0AWgs1
-- %!!"7++ ..x9V9VWH , , ,s3   :CC;C8C9$CC/CCCN)r(   r'   __qualname__r   r
   r   rT    r$   r"   rI   rI   t   s    +B	r$   rI   c                   4    e Zd ZdeddfdZdedededdfdZy)	SlowAPIASGIMiddlewarer,   r   Nc                     || _         y rL   )r,   rP   r,   s     r"   __init__zSlowAPIASGIMiddleware.__init__   s	    r$   r   receivesendc                    K   |d   dk7  r| j                  |||       d {   S  t        | j                         |||       d {    y 7 *7 w)Nr6   http)r,   _ASGIMiddlewareResponder)rP   r   r\   r]   s       r"   __call__zSlowAPIASGIMiddleware.__call__   sO     =F"%$7770&txx0FFF 8Fs!   AA$AAAA)	r(   r'   rU   r   r[   r   r   r   ra   rV   r$   r"   rX   rX      s;    G  GE GG G4 GD Gr$   rX   c                   D    e Zd ZdeddfdZdeddfdZdeded	e	ddfd
Z
y)r`   r,   r   Nc                 <    || _         d | _        i | _        d| _        y )NF)r,   rQ   initial_messageinject_headersrZ   s     r"   r[   z!_ASGIMiddlewareResponder.__init__   s!    26(*#r$   messagec                   K   |d   dk(  r|| _         y |d   dk(  r| j                  r#| j                  j                  | j                   d<   | j                  rSt	        | j                   d         }| j
                  j                  || j                  j                  j                        }| j                  | j                          d {    | j                  |       d {    y y 7 7 w)Nr6   zhttp.response.startzhttp.response.bodystatusheaders)raw)rd   rQ   status_codere   r   r*   _inject_asgi_headersr+   r1   rO   r]   )rP   rf   ri   s      r"   send_wrapperz%_ASGIMiddlewareResponder.send_wrapper   s     6?33 $+D V_ 44""151D1D1P1P$$X.""(T-A-A)-LM,,;;T\\//?? ))D00111))G$$$ 5 2$s$   CC+C'C+ C)!C+)C+r   r\   r]   c                 h  K   || _         |d   }|j                  j                  }|j                  s%| j	                  ||| j                          d {   S t        |j                  |      }t        ||| j                         }t        ||      r%| j	                  ||| j                          d {   S t        ||||       d {   \  }}	| |||| j                         d {   S |	rd| _        || _        || _        | j	                  ||| j                         d {   S 7 7 y7 e7 F7 w)Nr,   )r\   r]   T)r]   r1   r*   rM   r,   r#   r   r   rG   rB   rm   re   r+   )
rP   r   r\   r]   _appr*   r   r+   rQ   rR   s
             r"   ra   z!_ASGIMiddlewareResponder.__call__   s    	,::--%$))<<<%dkk59%tyyA'7+%$))<<<6HWgt7
 1
-- %'w8I8IJJJ "&D"DL"DLXXeWd.?.?@@@% =
 =1
 K As[   AD2D(AD20D*1D2D, D2'D.(;D2#D0$D2*D2,D2.D20D2)r(   r'   rU   r   r[   r   rm   r   r   r   ra   rV   r$   r"   r`   r`      sN    $G $ $%' %d %*AE AG A4 AD Ar$   r`   )(r;   typingr   r   r   r   starlette.applicationsr   starlette.datastructuresr   starlette.middleware.baser	   r
   starlette.requestsr   starlette.responsesr   starlette.routingr   r   starlette.typesr   r   r   r   r   slowapir   r   r#   r)   boolr3   r9   r@   rB   rG   rI   rX   r`   rV   r$   r"   <module>rz      sn    6 6 , 3 ' ( . B B 9Y(-h6X 6&19(1CJS
8HtXi%889422&219(1C2JS2
8Ht#$2*66&619(1C6JS6
8Ht#$6$G hx.@ T $* 4G G5A 5Ar$   