Bash 使用curl时如何正确处理gzip页面?
我编写了一个bash脚本,它使用curl从一个网站获取输出,并对html输出执行一系列字符串操作。问题是当我在一个返回其输出gzip的站点上运行它时。在浏览器中访问站点效果很好 当我手动运行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
$ 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管道将破坏该功能
我试过的
有什么想法吗?
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