J'ai écrit un script bash qui obtient la sortie d'un site Web en utilisant curl et fait un tas de manipulations de chaînes sur la sortie html. Le problème est lorsque je l'exécute sur un site qui renvoie sa sortie gzippée. Accéder au site dans un navigateur fonctionne très bien.
Lorsque je lance curl à la main, j'obtiens une sortie gzippé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 du html, comme prévu:
$ curl "http://example.com" | gunzip
Je ne veux pas diriger la sortie via gunzip, car le script fonctionne tel quel sur d'autres sites, et le fait de passer par gzip casserait cette fonctionnalité.
Ce que j'ai essayé
- changer le user-agent (j'ai essayé la même chaîne que mon navigateur envoie, "Mozilla / 4.0", etc.)
- homme curl
- recherche Google
- recherche stackoverflow
Tout est venu vide
Des idées?
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
) - le résolvait en supprimantbr
deAccept-Encoding
. voir stackoverflow.com/questions/18983719/…Réponses:
curl
décompressera automatiquement la réponse si vous définissez l'--compressed
indicateur:gzip est probablement pris en charge, mais vous pouvez le vérifier en exécutant
curl -V
et en recherchant libz quelque part dans la ligne "Features":Notez que c'est vraiment le site Web en question qui est ici en faute. S'il
curl
n'a pas passé un en-Accept-Encoding: gzip
tête de demande, le serveur n'aurait pas dû envoyer de réponse compressée.la source
Accept-Encoding: deflate, gzip
ne suffit pas - même si le serveur renvoie une réponse gzip avecContent-Encoding: gzip
, curl ne le décompressera pas automatiquement. Le--compressed
drapeau est obligatoire.