カールを使用するときにgzip圧縮されたページを適切に処理する方法


139

curlを使用してWebサイトから出力を取得し、HTML出力に対して一連の文字列操作を実行するbashスクリプトを作成しました。問題は、出力をgzip圧縮して返しているサイトに対して実行した場合です。ブラウザでサイトにアクセスしても問題はありません。

curlを手動で実行すると、gzipされた出力が表示されます。

$ curl "http://example.com"

これがその特定のサイトのヘッダーです。

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

返されたデータはgzip圧縮されています。これは期待どおりにhtmlを返すためです。

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

他のサイトではスクリプトがそのまま機能し、gzipを介してパイプするとその機能が損なわれるため、gunzipを介して出力をパイプ処理したくありません。

私が試したこと

  1. ユーザーエージェントの変更(ブラウザーが送信するのと同じ文字列、「Mozilla / 4.0」などを試しました)
  2. マンカール
  3. Google検索
  4. Stackoverflowの検索

すべてが空になった

何か案は?


私にとっての問題は、cURLがBrotli(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)を解凍できないことでした- brから削除することで解決しましたAccept-Encodingstackoverflow.com/questions/18983719/…を
NinoŠkopac2018

回答:


260

curl--compressedフラグを設定すると、応答が自動的に解凍されます。

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

--compressed (HTTP)libcurlがサポートするアルゴリズムの1つを使用して圧縮応答を要求し、非圧縮ドキュメントを保存します。このオプションを使用し、サーバーがサポートされていないエンコードを送信すると、curlはエラーを報告します。

gzipがサポートされている可能性が最も高いですが、これを確認するには、「機能」行のどこかでlibzを実行curl -Vして探します。

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

ここで問題があるのは、実際には問題のWebサイトであることに注意してください。要求ヘッダーをcurl渡さなかった場合Accept-Encoding: gzip、サーバーは圧縮された応答を送信してはなりません。


24
これは、カールバグのように見えます。これは、要求に基づいてではなく、応答に基づいてデコードをトリガーする必要があるためです(gzipをサポートしている場合)。HTTP 1.1を引用するには:「リクエストにAccept-Encodingフィールドが存在しない場合、サーバーはクライアントがすべてのコンテンツコーディングを受け入れると見なす場合があります。」しかし、その場合、サーバーはコンテンツをエンコードしないほうがよいと言い続けます。
ジョージルンド

実際に私のバージョンでは動作します--comp --compress --compressed
Radu Toader

3
これはリクエストヘッダーも設定します: "Accept-Encoding:deflate、gzip"これはサーバーがgzipを提供し、gzipを提供しない場合、
-compressed

このソリューションでQAを1分で支援してください!ありがとうございました !そうは言っても、私のアプリケーションは実際にはContent-Encoding:gzipでgzip応答を送信しています。ブラウザと最新のツール(httpieなど)が自動的に処理します。カールには「ヒント」が必要なだけだと思います
Faraway

驚いたことに、設定Accept-Encoding: deflate, gzipだけでは十分ではありません。サーバーがでgzip応答を返してもContent-Encoding: gzip、curlは自動的にzipを解凍しません。--compressedフラグが必要です。
rjh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.