
    Xj)	                         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
 d dlmZ  ee          Zdedefd	Zdefd
Z e            Zd ZdS )    )Request)Limiter_rate_limit_exceeded_handler)RateLimitExceeded)get_remote_address)settings)
get_loggerrequestreturnc                 :    | j         dk    rdS t          |           S )NOPTIONSskip)methodr   )r
   s    A/lsinfo/ai/hellotax_ai/base_platform/app/middleware/rate_limit.pycustom_key_funcr      s"    ~""vg&&&    c                     d} t          t          d          ryt          j        rm	 t          j        } t                              dt          j                    nN# t
          $ r*}t                              d|            d} Y d }~nd }~ww xY wt          t          d          rt          j        r	 t          t          dd           }t          t          dd          }|r#d	| d
t          j         dt          j	         d| } ndt          j         dt          j	         d| } t                              dt          j         dt          j	                    nP# t
          $ r)}t                              d|            d} Y d }~n"d }~ww xY wt                              d           t          t          t          j         dt          j         dgt          j        |           }|S )Nz	memory://	REDIS_URLzUsing Redis for rate limiting: zEFailed to configure Redis for rate limiting, falling back to memory: 
REDIS_HOSTREDIS_PASSWORDREDIS_DBr   z	redis://:@:/zredis://zQRedis not configured, using in-memory rate limiting (not suitable for production)z/minutez/hour)key_funcdefault_limitsenabledstorage_uri)hasattrr   r   loggerinfo	Exceptionwarningr   getattr
REDIS_PORTr   r   RATE_LIMIT_PER_MINUTERATE_LIMIT_PER_HOURRATE_LIMIT_ENABLED)r   eredis_passwordredis_dblimiters        r   get_limiterr-      s6   Kx%% 
(*< 
	&",KKKN(:LNNOOOO 	& 	& 	&NN[XY[[   &KKKKKK		&
 
<	(	( 
X-@ 
	&$X/?FFNxQ77H `q.qq8;NqqQYQdqqgoqq_)<__x?R__U]__KK](2E]]H[]]     	& 	& 	&NN[XY[[   &KKKKKK		& 	_	
 	
 	
  -666+222
 +  G Ns0   3A 
B$B		B3B$E 
F"FFc                     t           j        r3t          | j        _        |                     t
          t                     d S d S )N)r   r(   r,   stateadd_exception_handlerr   r   )apps    r   setup_rate_limitingr2   @   sB    " S#	!!"35QRRRRRS Sr   N)fastapir   slowapir   r   slowapi.errorsr   slowapi.utilr   
app.configr   common_loggingr	   __name__r    strr   r-   r,   r2    r   r   <module>r<      s          9 9 9 9 9 9 9 9 , , , , , , + + + + + +       % % % % % %	H		'W ' ' ' ' '(W ( ( ( (V +--S S S S Sr   