Skip to content
Extraits de code Groupes Projets
Valider 31be5bfb rédigé par JamesRezo's avatar JamesRezo :tada:
Parcourir les fichiers

POST orthographique simplifié, recuperer_page se charge de tout

parent 7b451119
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -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) {
......
......@@ -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 !)
*/
}
//
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter