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