technova69/spip-check
Par Gilles, le 30 août 2026 à 17h25min :
fix: borne réellement la durée des téléchargements et rejette les transferts tronqués
Revue de la branche : deux trous dans la première version.
Budget de temps
- L’échéance ne démarrait qu’après fopen() ; l’établissement de la
connexion, l’attente du premier octet et les redirections passaient
hors budget. - PluginReferencePreparer::download() tente deux conventions de tag, et
chaque tentative repartait avec 25 s + 15 s d’inactivité neufs, soit
~80 s cumulés pour un plugin — le 504 que la MR devait supprimer.
spipCheckHttpDownload() pose désormais l’échéance avant fopen() et ne
transmet que le temps restant à StreamCopy. Le contrat $fetch gagne un
paramètre $deadline (instant absolu) ; download() calcule un budget
unique (DOWNLOAD_BUDGET_SECONDS = 40) partagé par toutes les URL d’un
même plugin. StreamCopy rapproche stream_set_timeout() de l’échéance
restante avant chaque lecture.
Intégrité du fichier
- fwrite() === false ne détectait pas une écriture courte : StreamCopy
écrit maintenant chaque bloc en entier (writeAll()) et échoue sur 0. - spipCheckHttpDownload() compare la taille finale au Content-Length
annoncé quand l’en-tête est présent (HttpHeaders::contentLength()).
Tests : StreamCopyTest (écriture par petits blocs, flux qui se ferme),
HttpHeadersTest (contentLength), PluginReferencePreparerTest (échéance
partagée entre les deux URL), BuildTest. 275 tests unitaires verts.
Modifié
CHANGELOG.md
docs/superpowers/specs/2026-08-30-telechargements-bornes-design.md
spip-check.php
src/SpipCheck.php
templates/spip-check.php.tpl
tests/unit/BuildTest.php
tests/unit/HttpHeadersTest.php
tests/unit/PluginReferencePreparerTest.php
tests/unit/StreamCopyTest.php
Détails : https://git.spip.net/technova69/spip-check/-/commit/1727ce3c52465001948ed8edbbc221057f8b21dd