Trouble with timeout

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

begin
downloader
rescue Timeout::Error
puts ‘Timeout was detected. Trying again…’
retry
end

I’ll try it out, thanks!

Walle W. wrote:

begin
downloader
rescue Timeout::Error
puts ‘Timeout was detected. Trying again…’
retry
end