
    h	                         d dl mZ d dlmZmZmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ dee	ef   fd	Zde	d
edefdZdedefdZ G d d      Zy)    )ceil)CallableOptionalUnion)HTTPException)Request)Response)HTTP_429_TOO_MANY_REQUESTS)	WebSocketrequestc                    K   | j                   j                  d      }|r|j                  d      d   }n| j                  j                  }|dz   | j
                  d   z   S w)NzX-Forwarded-For,r   :path)headersgetsplitclienthostscope)r   	forwardedips      c/var/www/html/retail-simulation-api/retail/lib/python3.12/site-packages/fastapi_limiter/__init__.pydefault_identifierr      sX     ##$56I__S!!$^^  8gmmF+++s   AA responsepexpirec                 `   K   t        |dz        }t        t        ddt        |      i      w)z
    default callback when too many requests
    :param request:
    :param pexpire: The remaining milliseconds
    :param response:
    :return:
      Too Many RequestsRetry-Afterr   r   r   r
   str)r   r   r   expires       r   http_default_callbackr%      s7      'D.!F
"$7-QTU[Q\A]    ,.wsc                 `   K   t        |dz        }t        t        ddt        |      i      w)z|
    default callback when too many requests
    :param ws:
    :param pexpire: The remaining milliseconds
    :return:
    r   r   r    r!   r"   )r'   r   r$   s      r   ws_default_callbackr)   "   s7      'D.!F
"$7-QTU[Q\A] r&   c                       e Zd ZU dZdZee   ed<   dZee   ed<   dZ	ee
   ed<   dZee
   ed<   dZee
   ed<   dZedeeefdede
de
de
d	df
d
       Zedd       Zy)FastAPILimiterNprefixlua_sha
identifierhttp_callbackws_callbackaO  local key = KEYS[1]
local limit = tonumber(ARGV[1])
local expire_time = ARGV[2]

local current = tonumber(redis.call('get', key) or "0")
if current > 0 then
 if current + 1 > limit then
 return redis.call("PTTL",key)
 else
        redis.call("INCR", key)
 return 0
 end
else
    redis.call("SET", key, 1,"px",expire_time)
 return 0
endzfastapi-limiterreturnc                    K   || _         || _        || _        || _        || _        |j                  | j                         d {   | _        y 7 
wN)redisr,   r.   r/   r0   script_load
lua_scriptr-   )clsr4   r,   r.   r/   r0   s         r   initzFastAPILimiter.initG   sH      	
#)%!--cnn===s   AAAAc                 T   K   | j                   j                          d {    y 7 wr3   )r4   close)r7   s    r   r:   zFastAPILimiter.closeW   s     iioos   (&()r1   N)__name__
__module____qualname__r4   r,   r   r#   __annotations__r-   r.   r   r/   r0   r6   classmethodr   r%   r)   r8   r:        r   r+   r+   /   s    E FHSM !GXc]!%)J")(,M8H%,&*K(#*J"  (1"7 3> > 	>
  > > 
> >    rA   r+   N)mathr   typingr   r   r   fastapir   starlette.requestsr   starlette.responsesr	   starlette.statusr
   starlette.websocketsr   r   intr%   r)   r+   r@   rA   r   <module>rJ      sj     , , ! & ( 7 *,eGY,>&? , H s 
) 
c 
*  * rA   