Pergunta

Alguém sabe como descompactar o conteúdo de um arquivo GZIP que obtive com o CURL?

por exemplo: http://torcache.com/torrent/63abc1435aa5cd48dcd866c6f7d5e80766034391.torrent

respondeu

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

Então o gzip compactado,

Eu tentei gzdecode, mas não funciona, o gzeflate também não apenas não obtém resposta, e o conteúdo dos arquivos não passa mais de 2k

Foi útil?

Solução

Usar gzdecode:

<?php
    $c = file_get_contents("http://torcache.com/" .
        "torrent/63ABC1435AA5CD48DCD866C6F7D5E80766034391.torrent");
    echo gzdecode($c);

d8:announce42:http://tracker.openbittorrent.com/announce13:announce-listll42
...

Outras dicas

Basta dizer a Curl para decodificar a resposta automaticamente sempre que for gzipada

curl_setopt($ch,CURLOPT_ENCODING, '');

O Libcurl oferece um recurso que o faz descomprimir o conteúdo automaticamente (se construído com o ZLIB).

Veja a opção Curlot_Encoding: http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#curloptencoding

Você já tentou definir o cabeçalho afirmando que aceita a codificação GZIP da seguinte maneira?:

curl_setopt($rCurl, CURLOPT_HTTPHEADER, array('Accept-Encoding: gzip,deflate'));

Com um Wrapper Zlib Stream:

file_get_contents("compress.zlib://http://torcache.com/" .
    "torrent/63ABC1435AA5CD48DCD866C6F7D5E80766034391.torrent");

Você tentou gzuncompress ou gzinflate?

gzdeflate Compressa, o oposto do que você quer. Para ser sincero, não consigo descobrir como gzdecode difere da descomposição normal.

Há também a opção Curl CURLOPT_ENCODING:

O conteúdo do cabeçalho "aceitar-se-codificação:". Isso permite a decodificação da resposta. As codificações suportadas são "identidade", "deflate" e "gzip". Se uma string vazia, "", estiver definida, um cabeçalho que contém todos os tipos de codificação suportado será enviado.

Parece significar descomprimir automaticamente a resposta, mas eu não testei isso.

Você pode fazer isso com o Gzinflate (fingindo que o $ Headers contém todos os seus cabeçalhos HTTP e $ Buffer contém seus dados):

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;
        }
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top