2011-08-11 23 views
3

RubyのOpenURIは、実際の転送が開始される前に*コンテンツの長さを決定することができますcontent_length_procオプションを提供します。ルビー:コンテンツの長さに基づいてOpenURIを中止

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

がいっぱいこのprocが実際のを中止するための方法は、あります検索?

*私は、これは信頼できるものではない知っています - しかし、それは私の場合には、単純なヒューリスティックには十分だ

+0

FWIWは、 'content-length'は信頼できません。信頼できるアプローチは ':progress_proc'です。これは、新しいチャンクがネットから引き出されるたびに合計バイトを報告します。ダウンロードされた実際のバイト数に基づいてデータが多すぎると、中止できます。 – Dan

答えて

3

これはオープン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 
+0

理にかなっています - ありがとう! – AnC

+0

よろしくお願いします! – emboss