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), status_code=redirect.http_status
21 )
22
23 # Nothing matched, just log the 404
24 NotFoundLog.from_request(request)
25
26 return response