2011-12-03 9 views
91

Escribí un script bash que obtiene un resultado de un sitio web usando curl y hace un montón de manipulación de cadenas en el resultado html. El problema es cuando lo ejecuto contra un sitio que devuelve su salida comprimida gzip. Ir al sitio en un navegador funciona bien.¿Cómo manejar adecuadamente una página con gzip al usar curl?

Cuando corro rizo con la mano, me sale de salida gzipped:

$ curl "http://example.com" 

Aquí está la cabecera de ese sitio en particular:

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 

Sé que los datos devueltos se gzipped, porque esto devuelve html , como se esperaba:

$ curl "http://example.com" | gunzip 

No quiero conectar la salida a través de gunzip, porque el script funciona s como está en otros sitios, y la canalización a través de gzip rompería esa funcionalidad.

Lo que he tratado

  1. cambiar el agente de usuario (probé la misma cadena de mi navegador envía, "Mozilla/4.0", etc.)
  2. hombre rizar
  3. google search
  4. buscar stackoverflow

Todo encontró nada

¿Alguna idea?

Respuesta

181

curl descomprimirá automáticamente la respuesta si se establece el indicador --compressed:

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

--compressed (HTTP) Solicitar una respuesta comprimida utilizando uno de los algoritmos libcurl soportes, y guardar la documento sin comprimir. Si se usa esta opción y el servidor envía una codificación no compatible, Curl informará un error.

gzip es más probable compatible, pero se puede comprobar esto ejecutando curl -V y en busca de libz en algún lugar de la línea "Características":

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

Tenga en cuenta que en realidad es el sitio web en cuestión que es la culpa aquí. Si curl no pasó un encabezado de solicitud Accept-Encoding: gzip, el servidor no debería haber enviado una respuesta comprimida.

+0

¡Hermoso! Funciona como un campeón. Gracias. – BryanH

+3

+1 finalmente una búsqueda de 4 horas ha terminado con --comprimido. ¡Gracias! – Eugene

+17

Esto parece ser un error de curvatura, porque debe desencadenar su decodificación en función de la respuesta, no de lo que solicitó (dado que admite gzip). Para citar HTTP 1.1: "Si no hay un campo de aceptación de codificación en una solicitud, el servidor PUEDE suponer que el cliente aceptará cualquier codificación de contenido". Pero continúa diciendo que los servidores DEBERÍAN en ese caso no codificar el contenido, hmm, imagínate. –

Cuestiones relacionadas