Eu escrevi um script bash que obtém saída de um site usando curl e faz um monte de manipulação de strings na saída html. O problema é quando eu o executo em um site que está retornando sua saída compactada em gzip. Ir ao site em um navegador funciona bem.
Quando executo o enrolamento manualmente, recebo a saída compactada em gzip:
$ curl "http://example.com"
Aqui está o cabeçalho desse site específico:
HTTP/1.1 200 OK
Server: nginx
Content-Type: text/html; charset=utf-8
X-Powered-By: PHP/5.2.17
Last-Modified: Sat, 03 Dec 2011 00:07:57 GMT
ETag: "6c38e1154f32dbd9ba211db8ad189b27"
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Cache-Control: must-revalidate
Content-Encoding: gzip
Content-Length: 7796
Date: Sat, 03 Dec 2011 00:46:22 GMT
X-Varnish: 1509870407 1509810501
Age: 504
Via: 1.1 varnish
Connection: keep-alive
X-Cache-Svr: p2137050.pubip.peer1.net
X-Cache: HIT
X-Cache-Hits: 425
Eu sei que os dados retornados são compactados com gzip, porque isso retorna html, conforme o esperado:
$ curl "http://example.com" | gunzip
Eu não quero canalizar a saída através do gunzip, porque o script funciona como está em outros sites, e o canal através do gzip quebraria essa funcionalidade.
O que eu tentei
- alterando o user agent (tentei a mesma string que meu navegador envia, "Mozilla / 4.0", etc)
- homem enrolar
- pesquisa do Google
- pesquisando stackoverflow
Tudo saiu vazio
Alguma ideia?
curl 7.54.0 (x86_64-apple-darwin17.0) libcurl/7.54.0 LibreSSL/2.0.20 zlib/1.2.11 nghttp2/1.24.0
) - resolveu-o removendobr
-oAccept-Encoding
. veja stackoverflow.com/questions/18983719/…Respostas:
curl
descomprimirá automaticamente a resposta se você definir o--compressed
sinalizador:O gzip provavelmente é suportado, mas você pode verificar isso executando
curl -V
e procurando a libz em algum lugar na linha "Recursos":Observe que é realmente o site em questão que está com falha aqui. Se
curl
não passou umAccept-Encoding: gzip
cabeçalho de solicitação, o servidor não deveria ter enviado uma resposta compactada.fonte
Accept-Encoding: deflate, gzip
não é suficiente - mesmo que o servidor retorne uma resposta gzip comContent-Encoding: gzip
, o curl não descompactará automaticamente. A--compressed
bandeira é obrigatória.