32 lines
1.4 KiB
Python
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))
|