Saya menulis skrip bash yang mendapatkan output dari situs web menggunakan curl dan melakukan banyak manipulasi string pada output html. Masalahnya adalah ketika saya menjalankannya terhadap situs yang mengembalikan outputnya dalam bentuk gzip. Membuka situs di browser berfungsi dengan baik.
Saat saya menjalankan curl dengan tangan, saya mendapatkan hasil gzip:
$ curl "http://example.com"
Berikut tajuk dari situs tersebut:
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
Saya tahu data yang dikembalikan adalah gzip, karena ini mengembalikan html, seperti yang diharapkan:
$ curl "http://example.com" | gunzip
Saya tidak ingin menyalurkan output melalui gunzip, karena skrip berfungsi sebagaimana adanya di situs lain, dan menyalurkan melalui gzip akan merusak fungsi itu.
Apa yang saya coba
- mengubah agen pengguna (Saya mencoba string yang sama yang dikirimkan browser saya, "Mozilla / 4.0", dll)
- pria ikal
- pencarian Google
- mencari stackoverflow
Semuanya kosong
Ada ide?
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
) - menyelesaikannya dengan menghapusbr
dariAccept-Encoding
. lihat stackoverflow.com/questions/18983719/…Jawaban:
curl
akan secara otomatis mendekompresi respons jika Anda menyetel--compressed
bendera:curl --compressed "http://example.com"
gzip kemungkinan besar didukung, tetapi Anda dapat memeriksanya dengan menjalankan
curl -V
dan mencari libz di suatu tempat di baris "Fitur":Perhatikan bahwa sebenarnya situs web tersebut yang salah di sini. Jika
curl
tidak meneruskanAccept-Encoding: gzip
header permintaan, server seharusnya tidak mengirimkan respons terkompresi.sumber
Accept-Encoding: deflate, gzip
tidak cukup - bahkan jika server mengembalikan respons gzip denganContent-Encoding: gzip
, curl tidak akan secara otomatis melepasnya. The--compressed
flag diperlukan.