Cómo manejar correctamente un gzipped página cuando se utiliza curl?

Escribí un script en bash que recibe la salida de un sitio web con curl y hace un montón de manipulación de cadenas en el código html de salida. El problema es que cuando lo ejecuto en contra de un sitio que está volviendo a su salida en formato gzip. Ir a la página en un navegador funciona bien.

Cuando ejecuto el rizo de la mano, me sale en formato gzip salida:

$ 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 gzip, porque esto devuelve html, como se esperaba:

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

No quiero a la tubería de la salida a través de gunzip, debido a que el script funciona como es en otros sitios, y la tubería mediante gzip rompería esa funcionalidad.

Lo he intentado

  1. cambiar el agente de usuario (he intentado de la misma cadena de mi navegador envía, «Mozilla/4.0», etc)
  2. hombre curl
  3. la búsqueda de google
  4. la búsqueda de stackoverflow

Todo lo que vino vacías

Alguna idea?

  • Para mí, el problema fue que el rizo no era capaz de descomprimir Brotli (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) – resuelto por la extracción de br de Accept-Encoding. consulte stackoverflow.com/questions/18983719/…
InformationsquelleAutor BryanH | 2011-12-03

1 Kommentar

  1. 239

    curl se descomprimen automáticamente la respuesta si se establece la --compressed bandera:

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

    –comprimido
    (HTTP) Solicitar una respuesta comprimida usando uno de los algoritmos de libcurl admite, sin comprimir y guardar el documento. Si se utiliza esta opción y el servidor envía una codificación no compatible, la curvatura se informa de un error.

    gzip más probable es que es compatible, pero esto se puede verificar mediante la ejecución de curl -V y buscando libz en algún lugar en las «Características» de la línea:

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

    Nota que es realmente la web en cuestión, lo que falla aquí. Si curl no pasar un Accept-Encoding: gzip el encabezado de la solicitud, el servidor no debería haber enviado una respuesta comprimida.

    • Esto parece ser un rizo error, porque se debe activar su decodificación basado en la respuesta, no en lo que se solicitó (dado que no soporte gzip). Para citar HTTP 1.1: «Si no Accept-Encoding campo está presente en una solicitud, el servidor PUEDE asumir que el cliente aceptará cualquier codificación de contenido.» Pero no van a decir que los servidores en ese caso no codificar el contenido, hmm, vaya usted a saber.
    • en realidad en mi versión funciona –comp –compress –comprimido
    • esto también establece el encabezado de la solicitud: «Accept-Encoding: deflate, gzip» eso es genial ya que si el servidor sirve gzip y no gzip, sólo se necesita –comprimido y no añadir el aceptar encabezado de codificación de ti mismo
    • ayudar a mi QA con esta solución en 1 minuto ! gracias ! Dicho esto, mi solicitud es en realidad el envío de gzip respuesta con Content-Encoding: gzip. Navegadores y herramientas modernas (por ejemplo, httpie) automáticamente se encarga de ello. Supongo curl sólo necesita una «sugerencia»
    • Sorprendentemente, la configuración de Accept-Encoding: deflate, gzip no es suficiente, incluso si el servidor devuelve una gzip respuesta con Content-Encoding: gzip, curl no automáticamente ungzip ella. El --compressed bandera es necesario.
    • (y quitar –crudos si es que hay).

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea