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