Я тестирую кусок кода, чтобы пинговать кучу веб-сайтов, которыми я владею, на регулярной основе, чтобы убедиться, что они работают.
Я использую рельсы, и пока у меня есть это отвратительное тестовое действие, которое я использую, чтобы попробовать его (см. Ниже).
Проблема, однако, в том, что иногда это работает, а иногда нет ... иногда он проходит через код просто отлично, в других случаях кажется, что он полностью игнорирует блок begin / rescue ...
а. Мне нужна помощь, чтобы выяснить, в чем проблема
б. И рефакторинг, чтобы он выглядел респектабельно.
Ваша помощь очень ценится.
edit 1: Вот обновленный код, извините, что так долго, pastie.org со вчерашнего дня не работает http://pastie.org/927201
Он все еще делает то же самое ... пропуская блок начала (потому что он только обновляет up_check_time) ... однако, если один из сайтов отключается, он фактически обновляет все (check_msg, код и т. Д.) Правильно ... сбивает с толку , да?
require 'net/http'
require 'uri'
def ping
@sites = NewsSource.all
@sites.each do |site|
if site.uri and !site.uri.empty?
uri = URI.parse(site.uri)
response = nil
path = uri.path.blank? ? '/' : uri.path
path = uri.query.blank? ? path : "#{path}?#{uri.query}"
begin
Net::HTTP.start(uri.host, uri.port) {|http|
http.open_timeout = 30
http.read_timeout = 30
response = http.head(path)
}
if response.code.eql?('200') or response.code.eql?('301') or response.code.eql?('302')
site.up = true
else
site.up = false
end
site.up_check_msg = response.message
site.up_check_code = response.code
rescue Errno::EBADF
rescue Timeout::Error
site.up = false
site.up_check_msg = 'timeout'
site.up_check_code = '408'
end
site.up_check_time = 0.seconds.ago
site.save
end
end
end