test-curl.sh : contourner les proxys de l'environnement, comme boot-from-copy.sh #41
Labels
No labels
autopilot:pending-human
source:analyste
source:defenseur
source:human
source:medic
status:approved
status:blocked
status:in-progress
status:needs-clarification
status:needs-fix
status:ready
status:review
status:triage
type:bug
type:feature
type:infra
type:refactor
type:schema
type:security
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: maximus/vps-health-api#41
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Constat relevé pendant #35, hors de son périmètre. Analyse du 2026-10-01 : prémisse remesurée et confirmée, épingle et portée arrêtées.
Contexte
Depuis #35,
scripts/boot-from-copy.shexporteNO_PROXY='*'etno_proxy='*'en tête (l. 28) : tous sescurlvisent la boucle locale, et un proxy de l'environnement répondrait à la place du serveur démarré.test-curl.sha la même exposition, sans aucun contournement : 18 lignes de code y appellentcurlvers ses propres serveurs (3099 et 3098), dont les deux boucles d'attente (l. 163 et 167) et les wrappershttp_codeethttp_body(l. 188 et 191).Remesuré le 2026-10-01 sur
main(198e1cf) :http_proxy=http://127.0.0.1:9 bash test-curl.shsort en code 7 après 11,3 s, avec 0 octet de sortie. Les deux boucles d'attente épuisent leurs 5 s sans joindre les serveurs, puis le premiercode=$(curl ...)(cas 1, l. 195, hors wrapper) échoue sur la connexion refusée par le proxy, etset -earrête le script sans un mot. L'échec est franc par le code de sortie, ce n'est pas un faux vert, mais il ne donne aucun diagnostic. Avec un proxy qui répond, les cas recevraient les réponses du proxy au lieu de celles de l'API.Sans proxy, le script passe ses 45 cas en 1,6 s. Le coût d'un passage complet sous vitest, que la première version de cette issue craignait, est donc faible.
Décisions
export NO_PROXY='*' no_proxy='*'en tête detest-curl.sh, avec le même commentaire queboot-from-copy.sh(curl lit d'abord la minuscule, d'où les deux graphies).never sends a request through a proxy from the environmentde__tests__/ci.test.js: faux proxy qui répond à tout et enregistre ce qui l'atteint, vivacité prouvée d'abord par uncurlnu, environnementhttp_proxy+ALL_PROXY+no_proxy=example.invalidavecNO_PROXYretiré, puisbash test-curl.sh: rien n'atteint le proxy, sortie 0. Les variantes écartées : un proxy mort dans l'étape CI (rien en local, ne montre pas le proxy qui répond) et une épingle sur le source (lit du texte, pas un comportement).curlnu. Cela vaut pour toute cause de non-démarrage (port pris, plantage au boot), pas seulement le proxy.Travail à faire
test-curl.sh: export des deux graphies avant le premiercurl, avec son commentaire.test-curl.sh: après chaque boucle d'attente, détecter l'épuisement (drapeau posé aubreak, oufor ... elsesimulé), message sur stderr,exit 1. Letrap EXITexistant nettoie déjà les serveurs et le dossier temporaire.__tests__/ci.test.js: nouveaudescribe("test-curl.sh")avec le cas du faux proxy. Réutiliserrun();runBootScriptreste propre au boot check. Délai de test à fixer d'après la mesure (1,6 s nominal).__tests__/ci.test.js: un cas pour l'échec bruyant, par exemple un voisin qui tient déjà 3099 et 3098 n'est pas un bon témoin (il répondrait à la boucle) ; préférer unnodeintrouvable ou unPATHqui fait échouer le démarrage, à trancher à l'implémentation, avec message et code 1 exigés.CLAUDE.md: paragraphebash test-curl.shde la section Tests (contournement des proxys, échec bruyant), compte de cas deci.test.jset total denpm test.Fichiers concernés
test-curl.sh: en-tête (aprèsset -euo pipefail, l. 19) et boucles d'attente (l. 161 à 169).__tests__/ci.test.js: helpersrun()etfreePort()déjà présents (l. 130 à 157), modèle du test à suivre l. 180 à 216.CLAUDE.md: section Tests..forgejo/workflows/ci.yml: aucun changement.Surface de test
bash test-curl.shlui-même (45 cas, étape CI « Socket-level pass ») ;__tests__/ci.test.js(25 cas) couvre le workflow etboot-from-copy.sh, rien surtest-curl.sh.NO_PROXYaussi.Risques
test-curl.shdémarre ses serveurs sur 3099 et 3098 en dur (BASE_URLse surcharge, pas lePORTdu serveur). Lancé depuis vitest, il échoue si un autre processus tient ces ports pendantnpm test, et deuxnpm testsimultanés se gênent. En CI, l'étape « Socket-level pass » tourne aprèsnpm test, sans recouvrement. Avec l'échec bruyant, une collision devient au moins lisible. Rendre les ports paramétrables est hors périmètre, à ouvrir en issue séparée si le cas se présente.http_proxy), etLOGTO_HEALTH_URLpointe sur un port fermé : seuls lescurlsont concernés.Critères d'acceptation
http_proxy=http://127.0.0.1:9 bash test-curl.shpasse ses 45 cas, sortie 0.test-curl.shderrière un faux proxy qui répond à tout, avecno_proxyhérité qui laisse la boucle locale hors liste : aucune requête ne l'atteint, sortie 0. Vivacité du proxy prouvée dans le même test.NO_PROXYseul, le test rougit.npm testetbash test-curl.shverts, CI verte, comptes de cas deCLAUDE.mdà jour.Complexité estimée
Simple. Deux fichiers de code, une dizaine de lignes dans le script, deux cas de test calqués sur un modèle existant.