我正在尝试编写一个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标题会自动从列表中删除(到 help me,哎呀),所以我似乎无法对这些信息进行可靠的处理。
任何帮助都表示赞赏(包括其他宝石,如果他们更容易做到这一点)。
答案 0 :(得分:3)
知道了!只有在未指定自己的accept-encoding标头时,才会出现“魔术”行为。修改后的代码如下:
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),
答案 1 :(得分:0)
您可以尝试使用套接字以更快的速度(无内容)向服务器发送HEAD请求,并且不发送“Accept-Encoding:gzip”,因此您的响应将不会是gzip。