Skip to content
Extraits de code Groupes Projets
Valider 5ba670f0 rédigé par cerdic's avatar cerdic
Parcourir les fichiers

Refactoring de la gestion des options headers/datas de recuperer_url() pour...

Refactoring de la gestion des options headers/datas de recuperer_url() pour mieux gerer les sequences POST => 301 + Location => GET sur la nouvelle URL
voire POST => 307 sur url2 => POST sur url2 => 302 sur url3 => GET sur url3 le tout sans perdre les headers d'origine
en consequence on refabrique les donnes formattes a chaque redirection si besoin a partir des options headers+datas dont la derniere est eventuellement videe en cours de route
parent 42b7904f
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -453,30 +453,28 @@ function recuperer_url($url, $options = []) { ...@@ -453,30 +453,28 @@ function recuperer_url($url, $options = []) {
// Ajout des en-têtes spécifiques si besoin // Ajout des en-têtes spécifiques si besoin
$head_add = ''; $formatted_data = '';
if (!empty($options['headers'])) { if (!empty($options['headers'])) {
foreach ($options['headers'] as $champ => $valeur) { foreach ($options['headers'] as $champ => $valeur) {
$head_add .= $champ . ': ' . $valeur . "\r\n"; $formatted_data .= $champ . ': ' . $valeur . "\r\n";
} }
// ne pas le repasser a recuperer_url si on follow un location, car ils seront dans datas
unset($options['headers']);
} }
if (!empty($options['datas'])) { if (!empty($options['datas'])) {
[$head, $postdata] = prepare_donnees_post($options['datas'], $options['boundary']); [$head, $postdata] = prepare_donnees_post($options['datas'], $options['boundary']);
$head .= $head_add; $head .= $formatted_data;
if (stripos($head, 'Content-Length:') === false) { if (stripos($head, 'Content-Length:') === false) {
$head .= 'Content-Length: ' . strlen($postdata) . "\r\n"; $head .= 'Content-Length: ' . strlen($postdata) . "\r\n";
} }
$options['datas'] = $head . "\r\n" . $postdata; $formatted_data = $head . "\r\n" . $postdata;
if ( if (
strlen($postdata) strlen($postdata)
and !$methode_demandee and !$methode_demandee
) { ) {
$options['methode'] = 'POST'; $options['methode'] = 'POST';
} }
} elseif ($head_add) { } elseif ($formatted_data) {
$options['datas'] = $head_add . "\r\n"; $formatted_data .= "\r\n";
} }
// Accepter les URLs au format feed:// ou qui ont oublie le http:// ou les urls relatives au protocole // Accepter les URLs au format feed:// ou qui ont oublie le http:// ou les urls relatives au protocole
...@@ -508,7 +506,7 @@ function recuperer_url($url, $options = []) { ...@@ -508,7 +506,7 @@ function recuperer_url($url, $options = []) {
$url, $url,
$refuser_gz, $refuser_gz,
$options['uri_referer'], $options['uri_referer'],
$options['datas'], $formatted_data,
$options['version_http'], $options['version_http'],
$options['if_modified_since'] $options['if_modified_since']
); );
...@@ -551,7 +549,15 @@ function recuperer_url($url, $options = []) { ...@@ -551,7 +549,15 @@ function recuperer_url($url, $options = []) {
fclose($handle); fclose($handle);
include_spip('inc/filtres'); include_spip('inc/filtres');
$url = suivre_lien($url, $res['location']); $url = suivre_lien($url, $res['location']);
spip_log("recuperer_url recommence sur $url", 'distant');
// une redirection doit se faire en GET, sauf status explicite 307 ou 308 qui indique de garder la meme methode
if ($options['methode'] !== 'GET') {
if (empty($res['status']) or !in_array($res['status'], [307, 308])) {
$options['methode'] = 'GET';
$options['datas'] = '';
}
}
spip_log("recuperer_url recommence " . $options['methode']. " sur $url", 'distant');
return recuperer_url($url, $options); return recuperer_url($url, $options);
} elseif ($res['status'] !== 200) { } elseif ($res['status'] !== 200) {
......
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