Ruby: отменить OpenURI в зависимости от длины контента - PullRequest
3 голосов
/ 11 августа 2011

Ruby's OpenURI предоставляет опцию content_length_proc, которая позволяет определять * длину содержимого до начала фактической передачи:

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

Есть ли способ для этого процесса прервать фактический, полный поиск?

* Я знаю, что это ненадежно - но для моего случая достаточно простой эвристики

1 Ответ

3 голосов
/ 11 августа 2011

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