2011-01-27 45 views
1

我正在尝试编写一个ruby脚本,该脚本使用net/http获取关于网站上文件的一些详细信息。我的代码如下所示:使用红宝石获取URL的内容长度

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的头被从清单中自动删除(至帮助我,哎呀感谢),所以我似乎无法获得此信息的可靠的手柄。

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

回答

2

Got it!如果你没有指定你自己的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), 
0

您可以尝试使用套接字来发送HEAD请求到服务器更快(无内容)和不发送“接受编码:gzip”,所以你的反应不会在gzip。