/* * csrf_fetch.js — pose automatiquement le jeton CSRF (voir core/csrf.py/ * core/csrf_guard.py) sur CHAQUE fetch() non-GET de l'appli, sans avoir à * modifier individuellement les nombreux appels fetch() déjà écrits à la * main (screen_edit.html, game_dashboard.html, play.html...) ni les * formulaires classiques (pjax.js les transforme lui-même en fetch(), voir * son commentaire d'en-tête — cette rustine s'applique donc aussi à eux). * * window.CSRF_TOKEN est posé une fois par templates/base.html (valeur * injectée par Jinja, voir core/csrf.py::get_csrf_token) — chargé AVANT ce * script pour qu'il soit déjà disponible ici. */ (function () { "use strict"; if (window.fetch.__forgeCsrfPatched) return; // rejoué par pjax.js (runScriptsIn) sans effet une 2e fois var originalFetch = window.fetch; function patchedFetch(input, init) { init = init || {}; var method = (init.method || "GET").toUpperCase(); if (method !== "GET" && method !== "HEAD" && method !== "OPTIONS") { var headers = new Headers(init.headers || {}); if (!headers.has("X-CSRFToken") && window.CSRF_TOKEN) { headers.set("X-CSRFToken", window.CSRF_TOKEN); } init = Object.assign({}, init, { headers: headers }); } return originalFetch(input, init); } patchedFetch.__forgeCsrfPatched = true; window.fetch = patchedFetch; })();