Это соответствующий код из 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