From c17073e97d8f4577b3fc2e0b457d61f0d75b9f74 Mon Sep 17 00:00:00 2001 From: Cerdic <cedric@yterium.com> Date: Mon, 27 Nov 2023 14:35:16 +0100 Subject: [PATCH] =?UTF-8?q?fix:=20si=20la=20lecture=20d'un=20stream=20ne?= =?UTF-8?q?=20trig=20jamais=20feof,=20se=20fier=20=C3=A0=20fread()=3D=3D?= =?UTF-8?q?=3Dfalse=20+=20reduire=20le=20timeout=20pour=20eviter=20de=20de?= =?UTF-8?q?grader=20trop=20les=20perf?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refs: #5769 --- ecrire/inc/distant.php | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/ecrire/inc/distant.php b/ecrire/inc/distant.php index 71ce1f9351..d60dfd88f3 100644 --- a/ecrire/inc/distant.php +++ b/ecrire/inc/distant.php @@ -761,15 +761,32 @@ function recuperer_body($handle, $taille_max = _INC_DISTANT_MAX_SIZE, $fichier = } $result = 0; // on renvoie la taille du fichier } + + $max_longueur_morceaux = 16384; while (!feof($handle) && $taille < $taille_max) { - $res = fread($handle, 16384); - $taille += strlen($res); + $res = fread($handle, $max_longueur_morceaux); + // si feof ne trig pas mais on est à la fin, fread retourne false + if ($res === false) { + break; + } + + $taille_morceau = strlen($res); + $taille += $taille_morceau; + if ($fp) { fwrite($fp, $res); $result = $taille; } else { $result .= $res; } + + // si on a un morceau plus court que taille maxi mais que feof ne trig pas + // reduire le timeout par precaution, car on a surement atteint la fin et le prochain fread va sinon durer 10s + if (($taille_morceau < $max_longueur_morceaux) + && !feof($handle) + && (_INC_DISTANT_CONNECT_TIMEOUT > 1)) { + @stream_set_timeout($handle, 1); + } } if ($fp) { spip_fclose_unlock($fp); -- GitLab