Kıvrılma kullanırken sıkıştırılmış bir sayfa nasıl düzgün şekilde işlenir?


139

Curl kullanarak bir web sitesinden çıktı alır ve html çıktısında dize manipülasyon bir sürü yapar bir bash komut dosyası yazdım. Sorun çıktı gzip dönen bir siteye karşı çalıştırdığınızda. Bir tarayıcıda siteye gitmek iyi çalışıyor.

Kıvrımı elle çalıştırdığımda gzip çıktısı alıyorum:

$ curl "http://example.com"

İşte o sitenin başlığı:

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

Bu beklendiği gibi html döndürür çünkü döndürülen veri gzip, biliyorum:

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

Ben gunzip aracılığıyla çıkış boru istemiyorum, çünkü komut dosyası diğer sitelerde olduğu gibi çalışır ve gzip ile boru bu işlevi kıracaktır.

Ne denedim

  1. kullanıcı aracısını değiştirme (tarayıcımın gönderdiği dizeyi "Mozilla / 4.0" vb. denedim)
  2. adam kıvırmak
  3. Google arama
  4. yığın akışı aranıyor

Her şey boş çıktı

Herhangi bir fikir?


Benim için sorun cURL Brotli (sıkıştırmasını mümkün değildi olmasıydı 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) - kaldırarak çözmüş brdan Accept-Encoding. bkz. stackoverflow.com/questions/18983719/…
Nino Škopac

Yanıtlar:


260

curl--compressedBayrağı ayarlarsanız yanıtı otomatik olarak açar :

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

--compressed (HTTP) libcurl tarafından desteklenen algoritmalardan birini kullanarak sıkıştırılmış yanıt isteyin ve sıkıştırılmamış belgeyi kaydedin. Bu seçenek kullanılırsa ve sunucu desteklenmeyen bir kodlama gönderirse, curl bir hata bildirir.

gzip büyük olasılıkla desteklenir, ancak "Özellikler" satırında bir yerde libz çalıştırarak curl -Vve arayarak bunu kontrol edebilirsiniz :

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

Burada hatalı olan söz konusu web sitesi olduğunu unutmayın. Eğer curlbir geçemedi Accept-Encoding: gzipisteği başlığını, sunucu sıkıştırılmış bir yanıt gönderdi olmamalıdır.


24
Bu bir kıvrılma hatası gibi görünecektir, çünkü kod çözmesini istediği şeye değil, yanıta göre tetiklemesi gerekir (gzip'i desteklediği göz önüne alındığında). HTTP 1.1 alıntılamak için: "Bir istekte Kabul Et-Kodlama alanı yoksa, sunucu istemcinin herhangi bir içerik kodlamasını kabul edeceğini varsayabilir." Ancak sunucuların bu durumda içeriği kodlamaması gerektiğini söyler, hmm, şekil ver.
George Lund

Aslında benim versiyonumda çalışır --comp --compress --compressed
Radu Toader

3
bu da istek üstbilgisini ayarlar: "Accept-Encoding: deflate, gzip" harika çünkü sunucu gzip ve gzip sunmuyorsa, sadece sıkıştırılmış ve kabul kodlama başlığını kendiniz
eklemeyin

1 dakika içinde bu çözümle KG'ye yardım et! teşekkür ederim ! Bununla birlikte, uygulamam aslında Content-Encoding: gzip ile gzip yanıtı gönderiyor. Tarayıcılar ve modern araçlar (ör. Httpie) otomatik olarak işler. Sanırım kıvırmak sadece bir "ipucu" lazım
Faraway

Şaşırtıcı bir şekilde, ayar Accept-Encoding: deflate, gzipyeterli değildir - sunucu bir gzip yanıtı Content-Encoding: gzipdöndürse bile, curl otomatik olarak çözülmez. --compressedBayrak gereklidir.
rjh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.