Ruby:根据内容长度中止OpenURI

时间:2011-08-11 09:37:20

标签: ruby open-uri

Ruby的OpenURI提供content_length_proc选项,允许在实际传输开始之前确定*内容长度:

open(url, :content_length_proc => lambda { |content_length|
  puts "Content Length: #{content_length}"
}) { |data|
   # data.meta, data.read etc.
}

这个过程是否有办法中止实际的完整检索?

*我知道这不可靠 - 但在我的情况下,这对于简单的启发式就足够了

1 个答案:

答案 0 :(得分:3)

这是open-uri.rb的相应代码:

if options[:content_length_proc] && Net::HTTPSuccess === resp
  if resp.key?('Content-Length')
    options[:content_length_proc].call(resp['Content-Length'].to_i)
  else
    options[:content_length_proc].call(nil)
  end
end
resp.read_body {|str|
  ...
}

因此,您可以看到content_length_proc的返回值被忽略。但是,你可以简单地取消操作的做法是在回调中引发某种形式的错误 - 这将有效地中止进一步的执行。如果你提出一个专门的错误类,你甚至可以拯救它并对这种特定情况做出反应:

begin
  open(url, :content_length_proc => lambda { |content_length|
    puts "Content Length: #{content_length}"
  }) { |data|
    # data.meta, data.read etc.
  }
rescue MyError
  # react to it
end