reports: refresh remote anisette headers

At time of commit, the headers seem to be good for bit over a minute.
This commit is contained in:
Tero Saaristo
2024-07-30 09:48:21 +03:00
parent fc21db7ba3
commit 7ab95f4847

View File

@@ -4,6 +4,7 @@ from __future__ import annotations
import base64 import base64
import locale import locale
import logging import logging
import time
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
from datetime import datetime, timezone from datetime import datetime, timezone
@@ -160,6 +161,8 @@ class BaseAnisetteProvider(Closable, ABC):
class RemoteAnisetteProvider(BaseAnisetteProvider): class RemoteAnisetteProvider(BaseAnisetteProvider):
"""Anisette provider. Fetches headers from a remote Anisette server.""" """Anisette provider. Fetches headers from a remote Anisette server."""
_ANISETTE_DATA_VALID_FOR = 30
def __init__(self, server_url: str) -> None: def __init__(self, server_url: str) -> None:
"""Initialize the provider with URL to te remote server.""" """Initialize the provider with URL to te remote server."""
super().__init__() super().__init__()
@@ -169,6 +172,7 @@ class RemoteAnisetteProvider(BaseAnisetteProvider):
self._http = HttpSession() self._http = HttpSession()
self._anisette_data: dict[str, str] | None = None self._anisette_data: dict[str, str] | None = None
self._anisette_data_expires_at: float = 0
@property @property
@override @override
@@ -197,11 +201,12 @@ class RemoteAnisetteProvider(BaseAnisetteProvider):
with_client_info: bool = False, with_client_info: bool = False,
) -> dict[str, str]: ) -> dict[str, str]:
"""See `BaseAnisetteProvider.get_headers`_.""" """See `BaseAnisetteProvider.get_headers`_."""
if self._anisette_data is None: if self._anisette_data is None or time.time() >= self._anisette_data_expires_at:
logging.info("Fetching anisette data from %s", self._server_url) logging.info("Fetching anisette data from %s", self._server_url)
r = await self._http.get(self._server_url) r = await self._http.get(self._server_url)
self._anisette_data = r.json() self._anisette_data = r.json()
self._anisette_data_expires_at = time.time() + self._ANISETTE_DATA_VALID_FOR
return await super().get_headers(user_id, device_id, serial, with_client_info) return await super().get_headers(user_id, device_id, serial, with_client_info)