【问题标题】:use ruby to get content length of URLs使用 ruby​​ 获取 URL 的内容长度
【发布时间】:2011-06-16 06:12:16
【问题描述】:

我正在尝试编写一个 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 标头会自动从列表中删除(帮助我,谢谢)所以我似乎无法可靠地处理这些信息。

感谢任何帮助(包括其他宝石,如果他们能更容易地做到这一点)。

【问题讨论】:

    标签: ruby net-http


    【解决方案1】:

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

    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), 
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-23
        • 2011-06-18
        • 1970-01-01
        • 1970-01-01
        • 2012-01-31
        • 1970-01-01
        • 1970-01-01
        • 2013-06-12
        相关资源
        最近更新 更多