mirror of
https://github.com/searxng/searxng.git
synced 2025-12-23 20:20:05 +00:00
fix rate limiting per engine
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import json
|
||||
import time
|
||||
from typing import Optional
|
||||
import threading
|
||||
from typing import Optional, Tuple, Union
|
||||
import uwsgi # pyright: ignore # pylint: disable=E0401
|
||||
from . import shared_abstract
|
||||
|
||||
@@ -12,35 +12,50 @@ _last_signal = 10
|
||||
|
||||
class UwsgiCacheSharedDict(shared_abstract.SharedDict):
|
||||
def get_int(self, key: str) -> Optional[int]:
|
||||
value = uwsgi.cache_get(key)
|
||||
value, _, _ = self._get_value(key)
|
||||
if value is None:
|
||||
return value
|
||||
else:
|
||||
return int.from_bytes(value, 'big')
|
||||
return int(value)
|
||||
|
||||
def set_int(self, key: str, value: int, expire: Optional[int] = None):
|
||||
b = value.to_bytes(4, 'big')
|
||||
uwsgi.cache_update(key, b)
|
||||
if expire:
|
||||
self._expire(key, expire)
|
||||
self._set_value(key, value, expire)
|
||||
|
||||
def get_str(self, key: str) -> Optional[str]:
|
||||
value = uwsgi.cache_get(key)
|
||||
value, _, _ = self._get_value(key)
|
||||
if value is None:
|
||||
return value
|
||||
else:
|
||||
return value.decode('utf-8')
|
||||
return str(value)
|
||||
|
||||
def set_str(self, key: str, value: str, expire: Optional[int] = None):
|
||||
b = value.encode('utf-8')
|
||||
uwsgi.cache_update(key, b)
|
||||
if expire:
|
||||
self._expire(key, expire)
|
||||
self._set_value(key, value, expire)
|
||||
|
||||
def _expire(self, key: str, expire: int):
|
||||
t = threading.Timer(expire, uwsgi.cache_del, args=[key])
|
||||
t.daemon = True
|
||||
t.start()
|
||||
def _get_value(self, key: str) -> Tuple[Optional[Union[str, int]], Optional[float], Optional[int]]:
|
||||
serialized_data = uwsgi.cache_get(key)
|
||||
if not serialized_data:
|
||||
return None, None, None
|
||||
else:
|
||||
data = json.loads(serialized_data.decode())
|
||||
if 'expire' in data:
|
||||
now = time.time()
|
||||
if now - data['created_at'] >= data['expire']:
|
||||
uwsgi.cache_del(key)
|
||||
return None, None, None
|
||||
return data.get('value'), data.get('created_at'), data.get('expire')
|
||||
|
||||
def _set_value(self, key: str, value: Union[str, int], expire: Optional[int] = None):
|
||||
_, created_at, original_expire = self._get_value(key)
|
||||
|
||||
data = {'value': value}
|
||||
if expire is None and created_at is None:
|
||||
serialized_data = json.dumps(data).encode()
|
||||
uwsgi.cache_update(key, serialized_data)
|
||||
else:
|
||||
data['created_at'] = created_at or time.time()
|
||||
data['expire'] = original_expire or expire
|
||||
serialized_data = json.dumps(data).encode()
|
||||
uwsgi.cache_update(key, serialized_data, expire)
|
||||
|
||||
|
||||
def run_locked(func, *args):
|
||||
|
||||
Reference in New Issue
Block a user