1from __future__ import annotations
2
3from typing import TYPE_CHECKING
4
5from plain.http import HttpMiddleware, ResponseRedirect
6
7if TYPE_CHECKING:
8 from plain.http import Request, Response
9
10
11class RedirectionMiddleware(HttpMiddleware):
12 def process_request(self, request: Request) -> Response:
13 response = self.get_response(request)
14
15 if response.status_code == 404:
16 from .models import NotFoundLog, Redirect, RedirectLog
17
18 redirects = Redirect.query.filter(enabled=True).only(
19 "id", "from_pattern", "to_pattern", "http_status", "is_regex"
20 )
21 for redirect in redirects:
22 if redirect.matches_request(request):
23 # Log it
24 redirect_log = RedirectLog.from_redirect(redirect, request)
25 # Then redirect
26 return ResponseRedirect(
27 str(redirect_log.to_url), status_code=redirect.http_status
28 )
29
30 # Nothing matched, just log the 404
31 NotFoundLog.from_request(request)
32
33 return response