Note : gniiiiii [RSS][WGet][GZip]

#12746

Je me demandais pourquoi certains flux RSS ne fonctionnaient plus dans mon lecteur RSS (Blogotext).

Par exemple ceux de Kickass : https://kat.cr/usearch/ubuntu%20iso/?rss=1

Quand je fais un Wget ou un Curl dessus, il me sort un fichier binaire, alors que la page fonctionne très bien dans Firefox ou un autre navigateur :

curl https://kat.cr/usearch/ubuntu%20iso/?rss=1 > out.html


En fait, la page est compressée, donc ça foire. Et visiblement, les serveurs de Kickass ne voient pas que Curl ou Wget ne supportent pas la compression par défaut (le header ne doit pas être envoyé) :

Il faut faire
curl --compressed https://kat.cr/usearch/ubuntu%20iso/?rss=1 > out.html


Bon, me reste à voir comment transposer ça en PHP.


C’est assez chiant, ces comportements foireux de temps en temps, qui obligent le logiciel final à détecter les erreurs des sites web et à les corriger, alors que tout serait si simple si tout le monde respectait les standard : faut pas forcer la compression, faut pas obliger un user-agent, faut pas utiliser les encodages à coucher dehors, faut pas servir un flux RSS en JSON, CSV ou autre format…
Mais bon, d’un côté ça permet de découvrir des choses, des problèmes et de créer des solutions. Et surtout, les solutions, faut les partager.

C’est pour ça que j’ai ces pages qui contiennent des scripts et commandes en vrac :
https://lehollandaisvolant.net/tuto/php/
https://lehollandaisvolant.net/linux/ubuntu_tips/
https://lehollandaisvolant.net/linux/checklist/
https://lehollandaisvolant.net/linux/scripts/

ÉDIT : en PHP, avec file_gets_content() :
Il suffit de chercher dans le entêtes si il y a un "content-encoding" suivi de "gzip". Si oui, on utilise gzinflate.

$data = @file_get_contents($url, false, $context, -1, 4000000); // We download at most 4 Mb from source.
if (isset($http_response_header[0])) {
	// detect gzip data
	foreach($http_response_header as $i => $h) {
		// if gzip : decode it
		if(stristr($h, 'content-encoding') and stristr($h, 'gzip')) {
			$data = gzinflate( substr($data,10,-8) );
		}
	}
}
return $data;


Avec cURL (toujours dans PHP), comme j’ai mise à jour ici, il faut ajouter l’option pour gzip :

curl_setopt($handlers[$i], CURLOPT_ENCODING, "gzip");