これは、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