AccroCBio/backend/core/origins.py
Louis Mazin 4fd1c14d1d test
2026-10-15 16:45:02 +02:00

32 lines
1.4 KiB
Python

"""Helpers indépendants de Django pour composer les origines HTTP depuis .env."""
from urllib.parse import urlsplit, urlunsplit
def csv_values(raw):
return list(dict.fromkeys(item.strip() for item in str(raw or "").split(",") if item.strip()))
def append_port(origin, port):
"""Ajoute un port aux origines sans port explicite, sans doubler un port existant."""
value = origin.strip().rstrip("/")
parsed = urlsplit(value)
if parsed.scheme not in ("http", "https") or not parsed.netloc:
raise ValueError(f"Origine invalide : {origin!r}. Utiliser http:// ou https://")
if parsed.username or parsed.password or parsed.path or parsed.query or parsed.fragment:
raise ValueError(f"Une origine ne doit pas contenir de chemin ou d'identifiants : {origin!r}")
if not (1 <= int(port) <= 65535):
raise ValueError(f"Port hors plage : {port}")
# parsed.port valide aussi la syntaxe des ports explicites.
netloc = parsed.netloc if parsed.port is not None else f"{parsed.netloc}:{int(port)}"
return urlunsplit((parsed.scheme, netloc, "", "", ""))
def effective_origins(raw, port, auto_port=True):
items = csv_values(raw)
if auto_port:
items = [append_port(origin, port) for origin in items]
else:
for origin in items:
append_port(origin, port) # Valide la syntaxe sans changer les ports.
return list(dict.fromkeys(items))