3

Ruby のOpenURIcontent_length_procは、実際の転送が開始される前にコンテンツの長さを決定*できるオプションを提供します。

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

このプロシージャが実際の完全な取得を中止する方法はありますか?

*これが信頼できないことは承知していますが、私の場合、単純なヒューリスティックには十分です

4

1 に答える 1

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
于 2011-08-11T09:46:12.337 に答える