Skip to content

Un échec de chargement du CMS ne doit plus produire une page blanche - #399

Draft
DnzzL wants to merge 1 commit into
chore/upgrade-next-16from
fix/cms-failure-visibility
Draft

DnzzL wants to merge 1 commit into
chore/upgrade-next-16from
fix/cms-failure-visibility

Conversation

@DnzzL

@DnzzL DnzzL commented Sep 29, 2026

Copy link
Copy Markdown
Contributor

Cette branche s'attaque à une panne silencieuse : quand une requête vers Strapi échoue, le site ne le dit pas. Il sert une page blanche avec un code 200. Le visiteur croit à une page vide, et Google l'indexe comme valide.

Le défaut n'est pas théorique. Pendant la montée de version, un en-tête Authorization mal formé faisait répondre 401 à toutes les requêtes, et les dix-sept pages du site se sont affichées blanches sans qu'aucune alerte ne se déclenche. La cause tient en une ligne : le client openapi-fetch ne lève jamais d'exception, il rend { data, error }, et les pages ne lisaient que data.

Le tri se fait désormais en un seul endroit

resolveCmsOutcome() décide, pour chaque page, entre rendre le contenu, répondre 404 et signaler une erreur. C'est une fonction pure, donc testable sans navigateur ni accès au CMS : treize cas la couvrent. requireCmsData() applique la décision, journalise l'adresse appelée avec le statut HTTP, puis rend le contenu ou interrompt le rendu.

La règle distingue trois situations. Une erreur de requête produit un 500, car une page vide vaut moins qu'une panne avouée. Une adresse de détail qui ne correspond à aucune entrée produit un 404, sans quoi chaque lien périmé deviendrait un 500 et sortirait de l'index. Une page singleton dont le contenu manque produit elle aussi un 500, puisqu'il n'existe pas d'adresse alternative à proposer.

Les pages dont le contenu est statique et dont seules les métadonnées viennent du CMS, comme la charte, la FAQ et les CGU, restent tolérantes : une métadonnée manquante ne justifie pas de faire échouer une page entière.

Vérifications

Le contenu des seize URL de référence est identique avant et après. Les adresses de détail inexistantes passent de 200 à 404. Avec un jeton invalide, les onze pages qui dépendent du CMS répondent 500 et affichent une page d'erreur portant l'en-tête, la navigation et le pied de page, tandis que les trois pages statiques restent en 200. Le journal serveur nomme alors l'adresse fautive, par exemple [cms] /projects-list : HTTP 401 Missing or invalid credentials.

Les 250 tests passent, dont les 13 nouveaux. Le lint descend de 43 à 41 erreurs.

Ce que cette branche ne couvre pas

Un CMS qui répond 200 avec une relation vide reste invisible : c'est une autre classe de panne, qui demandera un détecteur plutôt qu'un garde-fou. Les redirections du CMS pointent par ailleurs vers des chemins internes anglais (/projects/…) là où le public visite /projets/…, ce qui crée des chaînes de redirection en deux sauts ; c'est une donnée à corriger dans Strapi, pas du code.

Le client openapi-fetch rend { data, error } sans jamais lever d'exception.
Les pages ne lisaient que data, si bien qu'une requete en erreur et une
requete sans contenu produisaient le meme rendu : une page blanche servie en
200, invisible pour les visiteurs comme pour les moteurs de recherche.

Le tri se fait desormais en un seul endroit :

- resolveCmsOutcome() decide entre rendre, repondre 404 et signaler une
  erreur ; fonction pure, couverte par 13 tests unitaires
- requireCmsData() applique la decision, journalise l'adresse appelee avec le
  statut HTTP, puis rend le contenu ou interrompt le rendu
- les 12 pages concernees y passent : une adresse de detail inconnue repond
  404, une panne du CMS repond 500 avec une page d'erreur

Les pages dont le contenu est statique et dont seules les metadonnees
viennent du CMS (charte, FAQ, CGU) restent tolerantes : une metadonnee
manquante ne justifie pas de faire echouer la page.

Un projet vitest "unit" tourne en environnement Node, sans navigateur : les
tests de logique pure ne dependent plus de Chromium et durent quelques
centaines de millisecondes.

Verifie en local : contenu identique sur les 16 URL de reference, adresses
mortes en 404, jeton invalide entrainant 500 partout, 41 erreurs ESLint
contre 43 auparavant, 250 tests verts.
@DnzzL
DnzzL added this pull request to stack #400 September 29, 2026 13:25

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant