
    Ii                        S SK r S SKJrJrJrJr  S SKJr  S SKJ	r	  S SK
JrJr  S SKJr  S SKJr  S SKJrJr  S S	KJrJrJrJrJr  S S
KJrJr  S\\   S\S\\   4S jrS\4S jrS\S\S\\   S\S\\\   \\\    4   4
S jr!S\S\S\\   S\S\\\   \4   4
S jr"S\S\S\\   S\S\\\   \4   4
S jr#S\S\\   S\4S jr$ " S S\5      r% " S S5      r& " S S5      r'g)    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                     S nU  HK  nUR                  U5      u  pEU[        R                  :X  d  M,  [        US5      (       d  M?  UR                  nMM     U$ )Nendpoint)matchesr   FULLhasattrr   )r   r   handlerroutematch_s         8/venv/lib/python3.13/site-packages/slowapi/middleware.py_find_route_handlerr#      sK     G=='EJJ75*#=#=nnG  N    r   c                 8    U R                    SU R                   3$ )N.)
__module____name__)r   s    r"   _get_route_namer)      s!      !7#3#3"455r$   limiterrequestappc                    U R                   (       a0  [        UR                  SS5      (       d   U R                  XS5        gg! [         a8  nUR
                  R                  [        U5      [        5      nUSU4s SnA$ SnAff = f)z
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 
B-B :B Bc                     [        XX#5      u  pEnU(       a  U(       d  SU4$ [        R                  " U5      (       a  [        nU" X5      U4$ )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@   ;   sO     %2'G$Q!cCU{ ""#4558W*E11r$   c                    #    [        XX#5      u  pEnU(       d  SU4$ [        R                  " U5      (       a  U" X5      I Sh  vN U4$ U" X5      U4$  N7f)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   s`      %2'G$Q!cU{""#455&w44e;; .55 5s   AAAAc                 b    Uc  g[        U5      nX R                  ;   a  gX R                  ;   a  gg)NTF)r)   _exempt_routes_route_limits)r*   r   names      r"   _should_exemptrG   b   s9    7#D %%% $$$r$   c                   *    \ rS rSrS\S\S\4S jrSrg)SlowAPIMiddlewaret   r+   	call_nextr   c                   #    UR                   nUR                  R                  nUR                  (       d  U" U5      I S h  vN $ [	        UR
                  UR                  5      n[        XE5      (       a  U" U5      I S h  vN $ [        XAXS5      u  pgUb  U$ U" U5      I S h  vN nU(       a%  UR                  XR                  R                  5      nU$  N NW N67fN)r,   r1   r*   enabledr#   r   r   rG   r@   _inject_headersview_rate_limit)	selfr+   rK   r,   r*   r   error_responseshould_inject_headersresponses	            r"   dispatchSlowAPIMiddleware.dispatchu   s      !99,,"7+++%cjj'--@'++"7+++0Ag1
- %!!"7++ ..x9V9VWH , , ,s5   ?CC?CC"C$C%3CCC N)	r(   r'   __qualname____firstlineno__r   r
   r   rU   __static_attributes__rW   r$   r"   rI   rI   t   s    +B	r$   rI   c                   @    \ rS rSrS\SS4S jrS\S\S\SS4S	 jr	S
r
g)SlowAPIASGIMiddleware   r,   r   Nc                     Xl         g rM   r,   rQ   r,   s     r"   __init__SlowAPIASGIMiddleware.__init__   s    r$   r   receivesendc                    #    US   S:w  a  U R                  XU5      I S h  vN $ [        U R                   5      " XU5      I S h  vN   g  N) N7f)Nr6   http)r,   _ASGIMiddlewareResponder)rQ   r   rc   rd   s       r"   __call__SlowAPIASGIMiddleware.__call__   sF     =F"%$777&txx0FFF 8Fs!   AA#AAAAr_   )r(   r'   rX   rY   r   ra   r   r   r   rh   rZ   rW   r$   r"   r\   r\      s;    G  GE GG G4 GD Gr$   r\   c                   R    \ rS rSrS\SS4S jrS\SS4S jrS\S	\	S
\
SS4S jrSrg)rg      r,   r   Nc                 :    Xl         S U l        0 U l        SU l        g )NF)r,   rR   initial_messageinject_headersr`   s     r"   ra   !_ASGIMiddlewareResponder.__init__   s    26(*#r$   messagec                   #    US   S:X  a  Xl         g US   S:X  a  U R                  (       a#  U R                  R                  U R                   S'   U R                  (       aO  [	        U R                   S   S9nU R
                  R                  X R                  R                  R                  5      nU R                  U R                   5      I S h  vN   U R                  U5      I S h  vN   g g  N N7f)Nr6   zhttp.response.startzhttp.response.bodystatusheaders)raw)rm   rR   status_codern   r   r*   _inject_asgi_headersr+   r1   rP   rd   )rQ   rp   rs   s      r"   send_wrapper%_ASGIMiddlewareResponder.send_wrapper   s     6?33 $+ V_ 44""151D1D1P1P$$X.""(T-A-A)-LM,,;;\\//?? ))D00111))G$$$ 5 2$s$   CC2C.C2'C0(C20C2r   rc   rd   c                 j  #    X0l         US   nUR                  R                  nUR                  (       d$  U R	                  XU R                   5      I S h  vN $ [        UR                  U5      n[        XU R                   S9n[        XV5      (       a$  U R	                  XU R                   5      I S h  vN $ [        XWXd5      I S h  vN u  pUb  U" XU R                  5      I S h  vN $ U	(       a  SU l        XPl        Xpl        U R	                  XU R                  5      I S h  vN $  N Nx Nf NH N7f)Nr,   )rc   rd   T)rd   r1   r*   rN   r,   r#   r   r   rG   rB   rw   rn   r+   )
rQ   r   rc   rd   _appr*   r   r+   rR   rS   s
             r"   rh   !_ASGIMiddlewareResponder.__call__   s    	,::--%$))<<<%dkk59%tyyA'++%$))<<<6Hg7
 1
- %'8I8IJJJ "&D"L"LXXed.?.?@@@% =
 =1
 K As[   AD3D)AD32D+3D3D-D3&D/'=D3$D1%D3+D3-D3/D31D3)r,   rR   rm   rn   r*   r+   rd   )r(   r'   rX   rY   r   ra   r   rw   r   r   r   rh   rZ   rW   r$   r"   rg   rg      sN    $G $ $%' %d %*AE AG A4 AD Ar$   rg   )(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   r\   rg   rW   r$   r"   <module>r      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$   