Ë
    ²ŒjÒ  ã                   óÂ  — 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/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/slowapi/middleware.pyÚ_find_route_handlerr#      sJ   € ð €GÛˆØ—=‘= Ó'‰ˆˆqØ”E—J‘JÓ¤7¨5°*Õ#=Ø—n‘n‰Gð ð €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ó!Ðð % e¨QÐ.Õ.ûð	/ú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°'¸7ÀGÈSÓ$QÑ!Ð�u˜cÙ¡CØ�Uˆ{Ðô ×"Ñ"Ð#4Ô5Ü8Ðá˜W cÓ*¨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°'¸7ÀGÈSÓ$QÑ!Ð�u˜cÙØ�Uˆ{Ðä×"Ñ"Ð#4Ô5Ù& w°Ó4×4°eÐ;Ð;á  ¨#Ó.°Ð5Ð5ð 5ús   ‚: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Ê   è ø€ ð !Ÿ™ˆØŸ9™9×,Ñ,ˆà�ŠÙ" 7Ó+×+Ð+ä% c§j¡j°'·-±-Ó@ˆÜ˜' 7Ô+Ù" 7Ó+×+Ð+ä0AØ�W˜g só1
Ñ-ˆÐ-ð Ð%Ø!Ð!á" 7Ó+×+ˆÙ Ø×.Ñ.¨x¸¿¹×9VÑ9VÓWˆHØˆð ,øð ,øð ,ú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Ô& t§x¡xÓ0°¸ÀÓF×FÑFð 8øàFús!   ‚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Ø×"Ò"Ø15×1DÑ1D×1PÑ1P�×$Ñ$ 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  è ø€ ØˆŒ	à ™,ˆØŸ:™:×-Ñ-ˆà�ŠØŸ™ %¨°$·)±)Ó<×<Ð<ä% d§k¡k°5Ó9ˆÜ˜%¨°t·y±yÔAˆÜ˜' 7Ô+ØŸ™ %¨°$·)±)Ó<×<Ð<ä6HØ�W˜g tó7
÷ 1
Ñ-ˆÐ-ð Ð%Ù'¨¨w¸×8IÑ8IÓJ×JÐJá Ø"&ˆDÔØ"ˆDŒLØ"ˆDŒLà—X‘X˜e W¨d×.?Ñ.?Ó@×@Ð@ð% =øð
 =øð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Ñóð6˜Xó 6ðØðØ&ðØ19¸(Ñ1CðØJSðà
ˆ8�HÑ˜t X¨iÑ%8Ð8Ñ9óð42Øð2Ø&ð2Ø19¸(Ñ1Cð2ØJSð2à
ˆ8�HÑ˜tÐ#Ñ$ó2ð*6Øð6Ø&ð6Ø19¸(Ñ1Cð6ØJSð6à
ˆ8�HÑ˜tÐ#Ñ$ó6ð$˜Gð ¨h°xÑ.@ð ÀTó ô$Ð*ô ÷4Gñ G÷5Aò 5Ar$   