summaryrefslogtreecommitdiffstats
path: root/core/middleware.py
blob: f8c552379c008b7bcde7e882f980c44112272a9f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
from time import time

from django.core.exceptions import MiddlewareNotUsed

from core import sentry
from core.models import Config


class HeadersMiddleware:
    """
    Deals with Accept request headers, and Cache-Control response ones.
    """

    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        accept = request.headers.get("accept", "text/html").lower()
        request.ap_json = (
            "application/json" in accept
            or "application/ld" in accept
            or "application/activity" in accept
        )
        response = self.get_response(request)
        if "Cache-Control" not in response.headers:
            response.headers["Cache-Control"] = "no-store, max-age=0"
        return response


class ConfigLoadingMiddleware:
    """
    Caches the system config every request
    """

    refresh_interval: float = 5.0

    def __init__(self, get_response):
        self.get_response = get_response
        self.config_ts: float = 0.0

    def __call__(self, request):
        # Allow test fixtures to force and lock the config
        if not getattr(Config, "__forced__", False):
            if (
                not getattr(Config, "system", None)
                or (time() - self.config_ts) >= self.refresh_interval
            ):
                Config.system = Config.load_system()
                self.config_ts = time()
        response = self.get_response(request)
        return response


class SentryTaggingMiddleware:
    """
    Sets Sentry tags at the start of the request if Sentry is configured.
    """

    def __init__(self, get_response):
        if not sentry.SENTRY_ENABLED:
            raise MiddlewareNotUsed()
        self.get_response = get_response

    def __call__(self, request):
        sentry.set_takahe_app("web")
        response = self.get_response(request)
        return response