这是来自 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