Bash 使用curl时如何正确处理gzip页面?

Bash 使用curl时如何正确处理gzip页面?,bash,curl,gzip,Bash,Curl,Gzip,我编写了一个bash脚本,它使用curl从一个网站获取输出,并对html输出执行一系列字符串操作。问题是当我在一个返回其输出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 La

我编写了一个bash脚本,它使用curl从一个网站获取输出,并对html输出执行一系列字符串操作。问题是当我在一个返回其输出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
我不想通过gunzip管道输出,因为脚本与其他站点上的脚本一样工作,而通过gzip管道将破坏该功能

我试过的
  • 更改用户代理(我尝试了浏览器发送的字符串“Mozilla/4.0”等)
  • 男子卷发
  • 搜索堆栈溢出
  • 所有的东西都空了


    有什么想法吗?

    curl
    如果设置
    --compressed
    标志,则会自动解压缩响应:

    curl --compressed "http://example.com"
    
    --压缩的 (HTTP)使用libcurl支持的算法之一请求压缩响应,并保存未压缩的文档。如果使用此选项并且服务器发送不支持的编码,curl将报告错误

    gzip很可能是受支持的,但您可以通过运行
    curl-V
    并在“功能”行中的某个地方查找libz来检查这一点:



    请注意,这确实是有问题的网站在这里是错误的。如果
    curl
    没有传递
    Accept Encoding:gzip
    请求头,服务器不应该发送压缩响应。

    这似乎是一个curl错误,因为它应该根据响应触发解码,而不是根据请求触发解码(假设它确实支持gzip)。引用HTTP 1.1:“如果请求中不存在接受编码字段,服务器可能会假定客户端将接受任何内容编码。”但它确实会继续说,在这种情况下,服务器不应该对内容进行编码,嗯,见图。实际上,在我的版本上,works--comp--compress--compressedthis还设置了请求头:“Accept Encoding:deflate,gzip”这很好,因为如果服务器提供gzip而没有gzip,那么您只需要——压缩,而不是添加Accept Encoding头,您可以在1分钟内帮助我的QA使用此解决方案!谢谢!也就是说,我的应用程序实际上正在发送带有内容编码的gzip响应:gzip.浏览器和现代工具(例如httpie)自动处理。我想curl只需要一个“提示”令人惊讶的是,设置
    Accept Encoding:deflate,gzip
    是不够的-即使服务器返回带有
    Content Encoding:gzip
    的gzip响应,curl也不会自动将其解压缩。
    --compressed
    标志是必需的。对我来说,问题是cURL无法解压缩Brotli(
    cURL 7.54.0(x86_64-apple-darwin17.0)libcurl/7.54.0 libpressl/2.0.20 zlib/1.2.11 nghttp2/1.24.0
    )-通过从
    接受编码
    中删除
    br
    ,解决了这个问题。看,行为被认为已经改变了。尝试
    curl-sSvhttps://stackoverflow.com/ |&rg-i'gzip | accept'
    单独使用,并使用
    --compressed
    。除非
    curl
    通过
    Accept Encoding
    ,否则服务器不会gzip响应。
    $ curl -V
    ...
    Protocols: ...
    Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz