[spip-check ↪ telechargement-plugins-robuste] fix : borne réellement la durée des téléchargements et (…)

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