181 votes

Comment gérer correctement une page compressée lors de l'utilisation de curl?

J'ai écrit un script bash qui obtient de sortie à partir d'un site web à l'aide de curl et fait un tas de manipulation de chaîne sur la sortie html. Le problème est que quand je le lance contre un site qui est de retour de sa sortie au format gzip. Va sur le site dans un navigateur fonctionne très bien.

Quand je lance le roulage à la main, je reçois format de sortie:

$ curl "http://example.com"

Voici l'en-tête à partir de ce site:

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

Je sais que les données retournées sont au format gzip, parce que cela renvoie html, comme prévu:

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

Je ne veux pas le tuyau de la sortie à travers gunzip, parce que le script fonctionne comme sur d'autres sites, et de la tuyauterie par gzip serait briser cette fonctionnalité.

Ce que j'ai essayé

  1. changer le user-agent (j'ai essayé la même chaîne de mon navigateur envoie, "Mozilla/4.0", etc)
  2. l'homme curl
  3. recherche google
  4. la recherche stackoverflow

Tout est venu vide

Des idées?

345voto

Martin Points 13951

curl sera automatiquement décompresser la réponse, si vous définissez l' --compressed drapeau:

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

--comprimé (HTTP) Demande une réponse compressée à l'aide de l'un des algorithmes de libcurl prend en charge, et enregistrer le document non compressé. Si cette option est utilisée, et le serveur envoie un codage non pris en charge, curl signaler une erreur.

gzip est probablement pris en charge, mais vous pouvez le vérifier en exécutant curl -V et à la recherche d' libz quelque part dans les "Fonctions" de la ligne:

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

Notez que c'est vraiment le site en question qui est en cause ici. Si curl n'ont pas répondu à un Accept-Encoding: gzip - tête de la requête, le serveur ne devrait pas avoir envoyé une réponse compressée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X