Skip to content

fix: handle network errors in the captchetat healthcheck - #426

Merged
azmeuk merged 1 commit into
numerique-gouv:mainfrom
Dev-next-gen:fix-captchetat-healthcheck-network-error
Sep 15, 2026
Merged

azmeuk merged 1 commit into
numerique-gouv:mainfrom
Dev-next-gen:fix-captchetat-healthcheck-network-error

Conversation

@Dev-next-gen

Copy link
Copy Markdown
Contributor

En lisant web/b3desk/endpoints/captcha.py, j'ai remarqué que captchetat_service_status() est le seul appel à CaptchEtat qui n'attrape pas requests.RequestException. captcha_proxy() et captcha_validation() le font déjà, tout comme get_meetings_stats() dans public.py.

Or ce healthcheck sert justement à masquer le captcha quand le service ne répond pas (le « hotfix » commenté dans should_display_captcha()). Si CaptchEtat est injoignable (connexion refusée, timeout, DNS) ou renvoie autre chose que du JSON, l'exception remonte jusqu'à la vue public.home. Un visiteur qui a dépassé CAPTCHA_NUMBER_ATTEMPTS tombe alors sur une erreur 500 à chaque chargement de la page d'accueil. Le compteur de tentatives n'est pas remis à zéro, puisque captcha_error() n'est jamais appelé, donc l'erreur persiste tant que la session vit.

Le correctif enveloppe l'appel et la lecture du JSON dans le même try que les fonctions voisines, journalise le même message « Network issue during connection to captchetat » et renvoie {"success": False}, 503, sur le modèle de captcha_proxy(). La fonction n'a qu'un appelant, should_display_captcha(), qui compare seulement le résultat à "UP". La branche « pas de jeton » renvoie déjà un tuple de ce genre, donc rien ne change pour les autres cas : la page d'accueil s'affiche simplement sans captcha, ce qui est déjà le comportement prévu quand le service est signalé comme indisponible.

Côté utilisateur : plus d'erreur 500 sur /home quand CaptchEtat est injoignable. Côté administrateur : pas de migration ni de nouveau paramètre, seulement une ligne captcha error : Network issue... dans les logs.

J'ai ajouté deux tests dans web/tests/meeting/test_captcha.py, l'un sur captchetat_service_status() et l'autre sur GET /home avec un compteur de tentatives dépassé. Tous les deux échouent sur main avec requests.exceptions.ConnectionError et passent avec le correctif. La suite complète passe en local avec pytest --db=sqlite -nauto (431 passed), et ruff ainsi que ruff format passent sur les fichiers modifiés. Les nouvelles lignes sont couvertes par les tests ajoutés.

AI tools used

@azmeuk

azmeuk commented Sep 15, 2026

Copy link
Copy Markdown
Collaborator

Merci !

@azmeuk
azmeuk merged commit 653ece3 into numerique-gouv:main Sep 15, 2026
16 checks passed
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.

2 participants