# SPDX-License-Identifier: GPLv3
# Copyright © 2025 pygaindalf Rui Pinheiro
from requests import Session
from requests.adapters import HTTPAdapter
from requests_cache import CacheMixin
from requests_ratelimiter import LimiterMixin, LimiterAdapter
[docs]
class CustomSession(CacheMixin, LimiterMixin, Session): # pyright: ignore [reportIncompatibleMethodOverride] as this is caused by the mixins which are in library code we do not control
"""
Custom session class that includes caching and rate limiting capabilities by default.
"""
[docs]
def __init__(self, *args, **kwargs):
from .manager import RequestsManager
self._requests_manager = RequestsManager()
self._requests_config = self._requests_manager.config
if self._requests_config is None:
raise RuntimeError("RequestsManager must be initialized before using CustomSession")
# Initialize the rate limiter if not already done
if 'limiter' not in kwargs:
kwargs['limiter'] = self._requests_config.rate_limit.limiter
super().__init__(*args, **kwargs)
# Per-host rate limits
for host, rate_config in self._requests_config.rate_limit.hosts.items():
if rate_config is None:
adapter = HTTPAdapter()
else:
adapter = LimiterAdapter(limiter=rate_config.limiter)
self.mount(f'http://{host}/', adapter)
self.mount(f'https://{host}/', adapter)