Quelqu'un sait-il comment décompresser le contenu d'un fichier gzip que j'ai obtenu avec curl?
par exemple: http://torcache.com/torrent/63ABC1435AA5CD48DCD866C6F7D5E80766034391.torrent
a répondu
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 09 Jun 2010 01:11:26 GMT
Content-Type: application/x-bittorrent
Content-Length: 52712
Last-Modified: Tue, 08 Jun 2010 15:09:58 GMT
Connection: keep-alive
Expires: Fri, 09 Jul 2010 01:11:26 GMT
Cache-Control: max-age=2592000
Content-Encoding: gzip
Accept-Ranges: bytes
puis le gzip compressé,
j'ai essayé gzdecode mais ne fonctionne pas, gzeflate aussi ne reçoit-il simplement aucune réponse, et le contenu des fichiers ne dépasse pas 2k
Utilisez gzdecode
:
<?php
$c = file_get_contents("http://torcache.com/" .
"torrent/63ABC1435AA5CD48DCD866C6F7D5E80766034391.torrent");
echo gzdecode($c);
donne
d8: announce42: http: //tracker.openbittorrent.com/announce13: announce-listll42 ...
Dites simplement à cURL de décoder la réponse automatiquement chaque fois qu'elle est compressée
curl_setopt($ch,CURLOPT_ENCODING, '');
libcurl offre une fonctionnalité qui lui permet de décompresser le contenu automatiquement (s'il est construit avec zlib).
Voir l'option CURLOPT_ENCODING: http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTENCODING
Avez-vous essayé de définir l'en-tête indiquant que vous acceptez l'encodage gzip comme suit?:
curl_setopt($rCurl, CURLOPT_HTTPHEADER, array('Accept-Encoding: gzip,deflate'));
Avec un zlib Stream Wrapper:
file_get_contents("compress.zlib://http://torcache.com/" .
"torrent/63ABC1435AA5CD48DCD866C6F7D5E80766034391.torrent");
Avez-vous essayé gzuncompress
ou gzinflate
?
gzdeflate
compresse , l'opposé de ce que vous voulez. Pour être honnête, je ne peux pas comprendre en quoi gzdecode
diffère de la décompression normale.
Il y a aussi l'option cURL CURLOPT_ENCODING
:
Le contenu de l'en-tête "Accept-Encoding:". Cela permet le décodage de la réponse. Les codages pris en charge sont "identité", "dégonfler" et "gzip". Si une chaîne vide, "", est définie, un en-tête contenant tous les types de codage pris en charge est envoyé.
Cela semble signifier que cela décompressera automatiquement la réponse, mais je n'ai pas testé cela.
Vous pouvez le faire avec gzinflate (en prétendant que $ headers contient tous vos en-têtes HTTP et $ buffer contient vos données):
if (isset($headers['Content-Encoding']) && ($headers['Content-Encoding'] === 'gzip' || $headers['Content-Encoding'] === 'deflate'))
{
if ($headers['Content-Encoding'] === 'gzip')
{
$buffer = substr($buffer, 10);
}
$contents = @gzinflate($buffer);
if ($contents === false)
{
return false;
}
}