From: Luka Stolyarov on
Hi. I have a small script that I use to download archives from the web.
The code looks like this:

require 'rubygems'
require 'mechanize'

def downloader()
agent = WWW::Mechanize.new

# create agent object
page = agent.get('http://www.myurl.com')

#authenticate
form = page.forms.first
form.username = '####'
form.password = '####'

#submit form
page = agent.submit form

#grab all links that have zip in them
mylinks = page.links_with(:href => /zip\//)

#for each link download and rename
mylinks.each do |archive|

name = archive.href.split('zip/')[1].sub('/','').strip

puts "Archive #{name} is saving..."

myfile = agent.click(archive)

output = File.open("/Users/luka/Desktop/#{name}.zip", 'w') {|file|
file << myfile.body }

puts "Done!"

end
end

begin
downloader
rescue Timeout::Error
puts 'Timeout was detected. Trying again...'
downloader
end


However, I've been having problems with timeouts from time to time, so I
ended up making this code into a function and upon timeout invoke this
function once again, as you can see at the bottom of the code. However,
I still get an error, which looks like this on timeout:


Archive 914188 is saving...
Timeout was detected. Trying again...
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/timeout.rb:60:in
`rbuf_fill': execution expired (Timeout::Error)

So it tries to rescue the timeout but obviously calling the same
function again is a bad idea. I was wondering why is it, and what would
be a proper solution.
Thanks!

Luka
--
Posted via http://www.ruby-forum.com/.

From: Walle Wallen on
begin
downloader
rescue Timeout::Error
puts 'Timeout was detected. Trying again...'
retry
end
--
Posted via http://www.ruby-forum.com/.

From: Luka Stolyarov on

I'll try it out, thanks!

Walle Wallen wrote:
> begin
> downloader
> rescue Timeout::Error
> puts 'Timeout was detected. Trying again...'
> retry
> end

--
Posted via http://www.ruby-forum.com/.