使用ruby来获取URL的内容长度

时间:2011-01-27 00:38:46

标签: ruby net-http

我正在尝试编写一个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,哎呀),所以我似乎无法对这些信息进行可靠的处理。

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

2 个答案:

答案 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。