From 31be5bfb7c1fec3f1d848a8ff4ab77ee43b19b55 Mon Sep 17 00:00:00 2001
From: James <james@rezo.net>
Date: Thu, 11 May 2006 16:40:30 +0000
Subject: [PATCH] =?UTF-8?q?POST=20orthographique=20simplifi=C3=A9,=20recup?=
 =?UTF-8?q?erer=5Fpage=20se=20charge=20de=20tout?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ecrire/inc/distant.php | 27 +++++++++++++++++++++--
 ecrire/inc/ortho.php   | 50 +++++-------------------------------------
 2 files changed, 30 insertions(+), 47 deletions(-)

diff --git a/ecrire/inc/distant.php b/ecrire/inc/distant.php
index 972be3fc69..ceebf09db2 100644
--- a/ecrire/inc/distant.php
+++ b/ecrire/inc/distant.php
@@ -56,6 +56,25 @@ function copie_locale($source, $mode='auto') {
 }
 
 function prepare_donnees_post($donnees, $boundary = '') {
+  /* boundary automatique */
+  // Si on a plus de 500 octects de donnees, on "boundarise"
+  if($boundary == '' and is_array($donnees)) {
+    $taille = 0;
+    foreach ($donnees as $cle => $valeur) {
+  		if (is_array($valeur)) {
+  			foreach ($valeur as $val2) {
+          $taille += strlen($val2);
+        }
+      } else {
+        // faut-il utiliser spip_strlen() dans inc/charsets ?
+        $taille += strlen($valeur);
+      }
+    }
+    if($taille>500) {
+      $boundary = substr(md5(rand().'spip'), 0, 8);
+    }
+  }
+
 	if($boundary) {
 		// fabrique une chaine HTTP pour un POST avec boundary
 		$entete = "Content-Type: multipart/form-data; boundary=$boundary\r\n";
@@ -98,7 +117,11 @@ function prepare_donnees_post($donnees, $boundary = '') {
 // options : get_headers si on veut recuperer les entetes
 // taille_max : arreter le contenu au-dela (0 = seulement les entetes)
 // Par defaut taille_max = 1Mo.
-function recuperer_page($url, $munge_charset=false, $get_headers=false, $taille_max = 1048576, $datas='') {
+// datas, une chaine ou un tableau pour faire un POST de donnees
+// boundary, pour forcer l'envoi par cette methode
+// et refuser_gz pour forcer le refus de la compression (cas des serveurs orthographiques)
+function recuperer_page($url, $munge_charset=false, $get_headers=false, $taille_max = 1048576,
+  $datas='', $boundary='', $refuser_gz = false) {
 
 	// Accepter les URLs au format feed:// ou qui ont oublie le http://
 	$url = preg_replace(',^feed://,i', 'http://', $url);
@@ -115,7 +138,7 @@ function recuperer_page($url, $munge_charset=false, $get_headers=false, $taille_
 	}
 
 	for ($i=0;$i<10;$i++) {	// dix tentatives maximum en cas d'entetes 301...
-		list($f, $fopen) = init_http($get, $url);
+		list($f, $fopen) = init_http($get, $url, $refuser_gz);
 
 		// si on a utilise fopen() - passer a la suite
 		if ($fopen) {
diff --git a/ecrire/inc/ortho.php b/ecrire/inc/ortho.php
index 21de6cb3e5..86b08a6867 100644
--- a/ecrire/inc/ortho.php
+++ b/ecrire/inc/ortho.php
@@ -158,12 +158,6 @@ function choisir_miroirs_ortho($lang) {
 //
 function post_ortho($url, $texte, $lang) {
 
-	list($f, $fopen) = init_http('POST', $url, true /* refuse gz */);
-	if (!$f OR $fopen) {
-		spip_log("Echec connexion $url");
-		return false;
-	}
-
 	$gz = ($GLOBALS['flag_gz'] && strlen($texte) >= 200);
 	$boundary = '';
 	$vars = array(
@@ -187,54 +181,20 @@ function post_ortho($url, $texte, $lang) {
 		$vars['nul_echap'] = $str_echap;
 		$boundary = substr(md5(rand().'ortho'), 0, 8);
 	}
-	list($content_type, $body) = prepare_donnees_post($vars, $boundary);
-
-	// On envoie le contenu
-	fputs($f, $content_type);
-	fputs($f, "Content-Length: ".strlen($body)."\r\n");
-	fputs($f, "\r\n");	// Fin des entetes
-	fputs($f, $body);
-
-	// Lire les en-tetes HTTP de la reponse et decoder le Content-Length
-	$length = 0;
-	$s = fgets($f, 1000);
-	$statut = 0;
-	if (preg_match(',^HTTP/\d+\.\d+ (\d+) ,', $s, $r))
-		$statut = intval($r[1]);
-	if ($statut != 200) {
-		fclose($f);
-		return false;
-	}
-	$gz_deflate=false; // le serveur web compresse en gz ?
-	while ($s = trim(fgets($f, 1000))) {
-		if (preg_match(',Content-Length:(.*),i', $s, $r))
-			$length = intval($r[1]);
-		if (preg_match(',Content-Encoding:(.*)gzip,i', $s, $r))
-			$gz_deflate = true;
-	}
-	$r = "";
-
-	// Lire le corps de la reponse HTTP
-	if ($length) {
-		while (($l = strlen($r)) < $length) $r .= fread($f, $length - $l);
-	}
-	else while (!feof($f) AND $r .= fread($f, 1024));
-
-	fclose($f);
-
-	// decompression de GZ apache
-	if ($gz_deflate) $r = gzinflate(substr($r,10));
+	
+  $r = recuperer_page($url, false, false, 1048576, $vars, $boundary, true);
 
 	// decompression de GZ ortho
 	if ($gz) $r = gzuncompress($r);
 	return $r;
-
+	
 /*
- * Note a propos de la compression : si on ne refuse pas le gz dans init_http(),
+ * Note a propos de la compression : si on ne refuse pas le gz dans recuperer_page(),
  * le serveur d'ortho va retourner des donnees compressees deux fois ; le code
  * saurait les decompresser deux fois, mais on perd alors beaucoup de temps (on
  * passe, dans un test, de 5 s a 25 s de delai !)
  */
+
 }
 
 //
-- 
GitLab