diff --git a/ecrire/inc/distant.php b/ecrire/inc/distant.php
index 71ce1f935138f98b5f0acbbab17beab5c7d49684..d60dfd88f3a0a15d9b394afed9e03c25d85270b5 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);