2011-08-11 3 views
3

Ruby OpenURI fournit une option content_length_proc qui permet de déterminer la longueur du contenu * avant le transfert de démarrage:Ruby: abandon openURI basé sur la longueur du contenu

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

est-il un moyen pour ce proc pour abandonner la réelle, complète récupération?

* Je suis conscient que ce n'est pas fiable - mais il est suffisant pour une heuristique simple dans mon cas

+0

FWIW, op a noté que 'longueur-de-contenu' n'est pas fiable. Une approche fiable consiste à utiliser ': progress_proc' qui indiquera le nombre total d'octets chaque fois qu'un nouveau morceau est retiré du réseau. Vous pouvez donc abandonner si vous obtenez trop de données en fonction des octets réellement téléchargés. – Dan

Répondre

3

Voici le code correspondant de l'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| 
    ... 
} 

Donc, comme vous peut voir la valeur de retour de content_length_proc est ignorée. Mais, ce que vous pouvez simplement faire pour annuler l'opération est d'élever une forme d'erreur dans le rappel - cela annulera effectivement l'exécution ultérieure. Si vous lèvez une classe d'erreur dédiée, vous pouvez même la sauver et réagir à cette situation spécifique:

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

Donne du sens, merci! – AnC

+0

De rien! – emboss

Questions connexes