
    i                     $   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'dS )    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 ]A}|                     |          \  }}|t          j        k    rt          |d          r|j        }B|S )Nendpoint)matchesr   FULLhasattrr   )r   r   handlerroutematch_s         b/var/www/html/crypto-mining-system/backend/venv/lib/python3.11/site-packages/slowapi/middleware.py_find_route_handlerr#      sV     G % %==''qEJ75*#=#=nGN    r   c                 $    | j          d| j         S )N.)
__module____name__)r   s    r"   _get_route_namer)      s     557#3555r$   limiterrequestappc                    | j         rzt          |j        dd          sd	 |                     ||d           nI# t          $ r<}|j                            t          |          t                    }|d|fcY d}~S d}~ww xY wdS dS )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 : :Q5! ! %eQ.......	/  s   7 
A=1A82A=8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@   ;   sl     %2'7GS$Q$Q!uc C U{ "#455 98Wc**E11r$   c                    K   t          | |||          \  }}}|sd|fS t          j        |          r |||           d{V |fS  |||          |fS )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'7GS$Q$Q!uc U{"#455 6&&w44444444e;;  #..55r$   c                 X    |dS t          |          }|| j        v rdS || j        v rdS dS )NTF)r)   _exempt_routes_route_limits)r*   r   names      r"   _should_exemptrG   b   sH    t7##D w%%%t w$$$t5r$   c                   "    e Zd ZdededefdZdS )SlowAPIMiddlewarer+   	call_nextr   c                 n  K   |j         }|j        j        }|j        s ||           d {V S t	          |j        |j                  }t          ||          r ||           d {V S t          ||||          \  }}||S  ||           d {V }|r |	                    ||j        j
                  }|S 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, 	,"7+++++++++%cj'-@@'7++ 	,"7+++++++++0AWgs1
 1
-- %!!"7++++++++  	X..x9VWWHr$   N)r(   r'   __qualname__r   r
   r   rT    r$   r"   rI   rI   t   s@        +B	     r$   rI   c                   6    e Zd ZdeddfdZdedededdfdZdS )	SlowAPIASGIMiddlewarer,   r   Nc                     || _         d S rL   )r,   rP   r,   s     r"   __init__zSlowAPIASGIMiddleware.__init__   s    r$   r   receivesendc                    K   |d         dk    r|                      |||           d {V S  t          | j                   |||           d {V  d S )Nr6   http)r,   _ASGIMiddlewareResponder)rP   r   r\   r]   s       r"   __call__zSlowAPIASGIMiddleware.__call__   st      =F""%$7777777770&tx00FFFFFFFFFFFr$   )	r(   r'   rU   r   r[   r   r   r   ra   rV   r$   r"   rX   rX      sp        G     GE GG G4 GD G G G G G Gr$   rX   c                   F    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
dS )r`   r,   r   Nc                 >    || _         d | _        i | _        d| _        d S )NF)r,   rQ   initial_messageinject_headersrZ   s     r"   r[   z!_ASGIMiddlewareResponder.__init__   s'    26(*#r$   messagec                   K   |d         dk    r	|| _         d S |d         dk    r| j        r| j        j        | j         d<   | j        rEt	          | j         d                   }| j                            || j        j        j	                  }| 
                    | j                    d {V  | 
                    |           d {V  d S d S )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3 $+D   V_ 444" Q151D1P$X." (T-A)-LMMM,;;T\/?  ))D0111111111))G$$$$$$$$$$$ 54r$   r   r\   r]   c                 &  K   || _         |d         }|j        j        }|j        s"|                     ||| j                    d {V S t          |j        |          }t          ||| j                   }t          ||          r"|                     ||| j                    d {V S t          ||||           d {V \  }}	| |||| j
                   d {V S |	rd| _        || _        || _        |                     ||| j
                   d {V S )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__   sm     	,:- 	=%$)<<<<<<<<<%dk599%tyAAA'7++ 	=%$)<<<<<<<<<6HWgt7
 7
 1
 1
 1
 1
 1
 1
-- %'w8IJJJJJJJJJ  	#"&D"DL"DLXXeWd.?@@@@@@@@@r$   )r(   r'   rU   r   r[   r   rm   r   r   r   ra   rV   r$   r"   r`   r`      s        $G $ $ $ $ $%' %d % % % %*AE AG A4 AD A A A A A 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      s    6 6 6 6 6 6 6 6 6 6 6 6 , , , , , , 3 3 3 3 3 3        ' & & & & & ( ( ( ( ( ( . . . . . . . . B B B B B B B B B B B B B B 9 9 9 9 9 9 9 9Y(-h   6X 6 6 6 6&19(1CJS
8HtXi%889   422&219(1C2JS2
8Ht#$2 2 2 2*66&619(1C6JS6
8Ht#$6 6 6 6$G hx.@ T    $    *   4G G G G G G G G5A 5A 5A 5A 5A 5A 5A 5A 5A 5Ar$   