[解決済み] curl を使用しているときに gzip されたページを適切に処理するにはどうすればよいですか?
2022-04-26 02:58:31
質問
私は、curlを使用してウェブサイトから出力を取得し、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
これは予想通りhtmlを返すので、返されたデータはgzipされていることがわかります。
$ curl "http://example.com" | gunzip
なぜなら、このスクリプトは他のサイトではそのまま動作し、gzipを通してパイプを通すとその機能が壊れてしまうからです。
試してみたこと
- ユーザーエージェントを変更する(ブラウザが送信するのと同じ文字列、"Mozilla/4.0"などを試しました)。
- man curl
- グーグル検索
- stackoverflowの検索
すべて空振り
何か思い当たることはありますか?
解決方法は?
curl
を設定すると、自動的にレスポンスが伸長されます。
--compressed
フラグを使用します。
curl --compressed "http://example.com"
--圧縮 (HTTP) libcurl がサポートするアルゴリズムの 1 つを使用して圧縮されたレスポンスを要求し、圧縮されていないドキュメントを保存します。 このオプションが使用され、サーバーがサポートされていないエンコーディングを送信した場合、curl はエラーを報告します。
gzipがサポートされている可能性が高いですが、これを確認するには
curl -V
を検索し
libz
Features"の行のどこかにあるはずです。
$ curl -V
...
Protocols: ...
Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz
ここで、本当に悪いのは問題のあるウェブサイトであることに注意してください。もし
curl
を渡さなかった。
Accept-Encoding: gzip
リクエストヘッダがない場合、サーバーは圧縮されたレスポンスを送信するべきではありませんでした。
関連
-
[解決済み】Bashのif条件で「unary operator expected」エラーが発生する。
-
[解決済み] '\r': command not found - .bashrc / .bash_profile [duplicate].
-
[解決済み] OS X で 'find' コマンドを使用して 'sed' を使用するとエラーが発生する。"無効なコマンドコードです。"
-
[解決済み] zip警告 - 名前が一致しない
-
[解決済み] mkdir コマンドが bash スクリプトで見つかりません。
-
[解決済み] cURLでJSONデータをPOSTするにはどうすればよいですか?
-
[解決済み] cURL呼び出しによるHTTPリクエストを使用してヘッダーを送信する方法は?
-
[解決済み] Git上でシェルコマンドを実行する際に使用するSSH-keyの秘密鍵を指定する方法は?
-
[解決済み] cURLでプログレスバーを表示しないようにするにはどうしたらいいですか?
-
[解決済み】cURLを使用して、リクエストとレスポンスタイムを一度に測定する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] bashスクリプトでタブ文字をエコーする
-
[解決済み] Bashで$()と`の違いはあるのでしょうか?重複] [重複
-
[解決済み] OS X で 'find' コマンドを使用して 'sed' を使用するとエラーが発生する。"無効なコマンドコードです。"
-
[解決済み] curl: 引数リストが長すぎる
-
[解決済み] bashで::演算子は何をするのですか?
-
[解決済み] bash スクリプトを実行している docker エントリポイントに "permission denied" が表示される。
-
[解決済み] シェルスクリプトでの連想配列
-
[解決済み] 環境変数を表示/エコーするには?
-
[解決済み] Bashスクリプトのset -o pipefailの意味を教えてください。
-
[解決済み] Bashのforeachループ