From 17c28b7f4d6ea5544dcae981aa5bd76f4edfca04 Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Mon, 15 Jan 2007 14:49:17 +0000
Subject: [PATCH] permettre a la fonction appelante de recuperer_page de
 formatter elle meme ses donnees pour un post (cas d'un appel soap ou on
 envoie des donnees au format xml)

---
 ecrire/inc/distant.php | 108 ++++++++++++++++++++++++-----------------
 1 file changed, 64 insertions(+), 44 deletions(-)

diff --git a/ecrire/inc/distant.php b/ecrire/inc/distant.php
index 218cfaa7da..9cecc5ddde 100644
--- a/ecrire/inc/distant.php
+++ b/ecrire/inc/distant.php
@@ -61,57 +61,77 @@ function copie_locale($source, $mode='auto') {
 
 // http://doc.spip.org/@prepare_donnees_post
 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";
-		$chaine = '';
-		if (is_array($donnees)) {
-			foreach ($donnees as $cle => $valeur) {
+	// permettre a la fonction qui a demande le post de formater elle meme ses donnees
+	// pour un appel soap par exemple
+	// l'entete est separe des donnees par un double retour a la ligne
+	// on s'occupe ici de passer tous les retours lignes (\r\n, \r ou \n) en \r\n
+	if (is_string($donnees) && strlen($donnees)){
+		$entete = "";
+		// on repasse tous les \r\n et \r en simples \n
+		$donnees = str_replace("\r\n","\n",$donnees);
+		$donnees = str_replace("\r","\n",$donnees);
+		// un double retour a la ligne signifie la fin de l'entete et le debut des donnees
+		$p = strpos($donnees,"\n\n");
+  	if ($p!==FALSE){
+  		$entete = str_replace("\n","\r\n",substr($donnees,0,$p+1));
+  		$donnees = substr($donnees,$p+2);
+  	}
+		$chaine = str_replace("\n","\r\n",$donnees);
+  }
+  else {
+	  /* boundary automatique */
+	  // Si on a plus de 500 octects de donnees, on "boundarise"
+	  if($boundary == '') {
+	    $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";
+			$chaine = '';
+			if (is_array($donnees)) {
+				foreach ($donnees as $cle => $valeur) {
+					$chaine .= "\r\n--$boundary\r\n";
+					$chaine .= "Content-Disposition: form-data; name=\"$cle\"\r\n";
+					$chaine .= "\r\n";
+					$chaine .= $valeur;
+				}
 				$chaine .= "\r\n--$boundary\r\n";
-				$chaine .= "Content-Disposition: form-data; name=\"$cle\"\r\n";
-				$chaine .= "\r\n";
-				$chaine .= $valeur;
 			}
-			$chaine .= "\r\n--$boundary\r\n";
-		}
-	} else {
-		// fabrique une chaine HTTP simple pour un POST
-		$entete = 'Content-Type: application/x-www-form-urlencoded'."\r\n";
-		$chaine = array();
-		if (is_array($donnees)) {
-			foreach ($donnees as $cle => $valeur) {
-				if (is_array($valeur)) {
-					foreach ($valeur as $val2) {
-						$chaine[] = rawurlencode($cle).'='.rawurlencode($val2);
+		} else {
+			// fabrique une chaine HTTP simple pour un POST
+			$entete = 'Content-Type: application/x-www-form-urlencoded'."\r\n";
+			$chaine = array();
+			if (is_array($donnees)) {
+				foreach ($donnees as $cle => $valeur) {
+					if (is_array($valeur)) {
+						foreach ($valeur as $val2) {
+							$chaine[] = rawurlencode($cle).'='.rawurlencode($val2);
+						}
+					} else {
+						$chaine[] = rawurlencode($cle).'='.rawurlencode($valeur);
 					}
-				} else {
-					$chaine[] = rawurlencode($cle).'='.rawurlencode($valeur);
 				}
+				$chaine = implode('&', $chaine);
+			} else {
+				$chaine = $donnees;
 			}
-			$chaine = implode('&', $chaine);
-		} else {
-			$chaine = $donnees;
 		}
-	}
+  }
 	return array($entete, $chaine);
 }
 
-- 
GitLab