2011-12-03 5 views
91

私はcurlを使用してウェブサイトから出力を取得し、html出力で一連の文字列操作を実行するbashスクリプトを作成しました。問題は、出力をgzippedに戻しているサイトに対して実行したときです。ブラウザでサイトに行っても問題ありません。これはHTMLを返すので、私は返されたデータがgzipで圧縮されて知っているカールを使用するときにgzippedページを正しく扱うには?

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圧縮された出力を得る:

$ curl "http://example.com" 

は、ここでその特定のサイトからヘッダです

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

出力がgunzipでパイプ処理されないようにするには、スクリプトの作業が必要です他のサイトではそのままですが、gzipを通るとその機能が損なわれます。私は

  • (私は私のブラウザが "Mozillaの/ 4.0" など、送信と同じ文字列を試してみました)ユーザーエージェントを変更するカール
  • google search
  • 男を
    1. を試してみた何

      検索stackoverflow

    すべてが空になった

    アイデア?あなたが--compressedフラグを設定した場合

  • 答えて

    181

    curlは、自動的に応答を解凍します:

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

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

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

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

    注意それはここに欠点があります。 curlAccept-Encoding: gzip要求ヘッダーを渡さなかった場合、サーバーは圧縮応答を送信してはなりません。

    +0

    美しい!チャンピオンのように動作します。ありがとうございました。 – BryanH

    +3

    +1最後に4時間の検索は - 圧縮されています。どうも! – Eugene

    +17

    これはカールバグのように見えます。なぜなら、レスポンスに基づいてデコードを開始する必要があります(gzipをサポートしているため)。 HTTP 1.1を引用する場合: "要求にAccept-Encodingフィールドがない場合、サーバーはクライアントがコンテンツコーディングを受け入れると仮定してもよい(MAY)。しかし、サーバーはそのような場合にはコンテンツをエンコードしてはならないと言います。 –

    関連する問題