"""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))