web-dev-qa-db-fra.com

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

J'ai écrit un script bash qui récupère la sortie d'un site Web à l'aide de curl et effectue un tas de manipulations de chaînes sur la sortie html. Le problème, c'est quand je l'exécute sur un site qui renvoie sa sortie compressée. Aller sur le site dans un navigateur fonctionne bien.

Quand je lance curl à la main, je reçois une sortie compressée:

$ curl "http://example.com"

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

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 renvoyées sont gzippées, car cela renvoie html, comme prévu:

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

Je ne souhaite pas canaliser la sortie via gunzip, car le script fonctionne tel quel sur d'autres sites, et la canalisation via gzip aurait pour effet de supprimer cette fonctionnalité.

Ce que j'ai essayé

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

Tout est venu vide

Des idées?

116
BryanH

curl décompressera automatiquement la réponse si vous définissez la valeur --compressed drapeau:

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

- compressé (HTTP) Demandez une réponse compressée à l'aide de l'un des algorithmes pris en charge par libcurl et enregistrez le document non compressé. Si cette option est utilisée et que le serveur envoie un codage non pris en charge, Curl signalera une erreur.

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

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

Notez que c'est vraiment le site Web en question qui est en cause ici. Si curl n'a pas réussi un Accept-Encoding: gzip en-tête de la demande, le serveur n’aurait pas dû envoyer de réponse compressée.

230
Martin