2

我正在尝试编写一个 ruby​​ 脚本,该脚本使用net/http. 我的代码如下所示:

require 'open-uri'
require 'net/http'

url = URI.parse asset
res = Net::HTTP.start(url.host, url.port) {|http|
  http.get(asset)
} 

headers = res.to_hash
p headers

我想从这个请求中获得两条信息:膨胀内容的总长度,以及(视情况而定)压缩内容的长度。

有时,标头会包含一个content-length参数,该参数似乎是内容的压缩长度。我还可以使用 res.body.length 来估计内容的膨胀大小,但这并不是万无一失的。上的文档net/http说 gzip 标头会自动从列表中删除(帮助我,谢谢)所以我似乎无法可靠地处理这些信息。

任何帮助表示赞赏(包括其他宝石,如果他们更容易做到这一点)。

4

2 回答 2

3

知道了!此处的“魔术”行为仅在您未指定自己的接受编码标头时才会发生。修改后的代码如下:

require 'open-uri'
require 'net/http'
require 'date'
require 'zlib' 

headers = { "accept-encoding" => "gzip;q=1.0,deflate;q=0.6,identity;q=0.3" }
url = URI.parse asset
res = Net::HTTP.start(url.host, url.port) {|http|
  http.get(asset, headers)
}

headers = res.to_hash

gzipped = headers['content-encoding'] && headers['content-encoding'][0] == "gzip"
content = gzipped ? Zlib::GzipReader.new(StringIO.new(res.body)).read : res.body 


full_length = content.length,
compressed_length = (headers["content-length"] && headers["content-length"][0] || res.body.length), 
于 2011-01-27T02:30:24.943 回答
0

您可以尝试使用更快(无内容)的套接字向服务器发送 HEAD 请求,并且不要发送“Accept-Encoding: gzip”,因此您的响应不会是 gzip。

于 2011-01-27T01:16:25.850 回答