Decomprimere un file gzip da CURL, il php
Domanda
Qualcuno sa come per decomprimere il contenuto di un file gzip che ho ottenuto con l'arricciatura?
Ad esempio: http://torcache.com/torrent/63ABC1435AA5CD48DCD866C6F7D5E80766034391.torrent
ha risposto
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
poi il gzip compressi,
ho provato gzdecode ma non funziona, gzeflate così non semplicemente non ottengono alcuna risposta, e il contenuto dei file non più di 2k sono
Soluzione
gzdecode
:
<?php
$c = file_get_contents("http://torcache.com/" .
"torrent/63ABC1435AA5CD48DCD866C6F7D5E80766034391.torrent");
echo gzdecode($c);
dà
d8:announce42:http://tracker.openbittorrent.com/announce13:announce-listll42 ...
Altri suggerimenti
Basta dire cURL per decodificare la risposta automaticamente ogni volta che è compresso con gzip
curl_setopt($ch,CURLOPT_ENCODING, '');
Offerte libcurl una caratteristica che lo rende decomprimere automaticamente il contenuto (se costruito con zlib).
Si veda l'opzione CURLOPT_ENCODING: http://curl.haxx.se/libcurl /c/curl_easy_setopt.html#CURLOPTENCODING
Hai provato impostando l'intestazione che indica che si accetta gzip codifica come segue:?
curl_setopt($rCurl, CURLOPT_HTTPHEADER, array('Accept-Encoding: gzip,deflate'));
Con un zlib flusso Wrapper:
file_get_contents("compress.zlib://http://torcache.com/" .
"torrent/63ABC1435AA5CD48DCD866C6F7D5E80766034391.torrent");
Hai provato gzuncompress
o gzinflate
?
gzdeflate
impacchi , il contrario di ciò che si vuole. Per essere onesti, non riesco a capire come gzdecode
differisce da decompressione normale.
C'è anche la possibilità cURL CURLOPT_ENCODING
:
Il contenuto della "Accept-Encoding:" header. Questo permette la decodifica della risposta. codifiche supportati sono "identità", "sgonfiare", e "gzip". Se una stringa vuota, "", viene impostato, un'intestazione contenente tutti i tipi di codifica supportati viene inviato.
Sembra voler dire che sarà decomprimere automaticamente la risposta, ma non ho ancora testato questo.
Si può farlo con gzinflate (fingendo che $ intestazioni contiene tutto il tuo intestazioni HTTP, e $ buffer contiene i dati):
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;
}
}