ti-enxame.com

Como lidar corretamente com uma página gzipada ao usar o curl?

Eu escrevi um script bash que obtém a saída de um site usando curl e faz um monte de manipulação de string na saída html. O problema é quando eu o executo em um site que está retornando sua saída gzipped. Ir ao site em um navegador funciona bem.

Quando executo o curl à mão, recebo a saída gzipada:

$ 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 gzipados, porque isso retorna html, como 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 canalizar através do gzip quebraria essa funcionalidade.

O que eu tentei

  1. alterando o user-agent (tentei a mesma string que meu navegador envia, "Mozilla/4.0", etc)
  2. onda de homem
  3. pesquisa do google
  4. pesquisando stackoverflow

Tudo ficou vazio

Alguma ideia?

113
BryanH

curl irá descomprimir automaticamente a resposta se você definir o sinalizador --compressed:

curl --compressed "http://example.com"

- compactado (HTTP) Solicite uma resposta compactada usando um dos algoritmos que o libcurl suporta e salve o documento descompactado. Se esta opção for usada e o servidor enviar uma codificação não suportada, o curl informará um erro.

é mais provável que o gzip seja suportado, mas você pode verificar isso executando curl -V e procurando libz em algum lugar na linha "Features":

$ curl -V
...
Protocols: ...
Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz 

Note que é realmente o site em questão que está em falta aqui. Se curl não passou um cabeçalho de solicitação Accept-Encoding: gzip, o servidor não deveria ter enviado uma resposta compactada.

224
Martin