def validate(href)
url = nil
begin
url = URI.parse(href)
rescue URI::InvalidURIError
return Result.new(href, 'invalid URI')
end
return nil if url.scheme !~ /^https?$/
res = nil
5.times do |i|
begin
Timeout::timeout(10) do
res = request_url_once(url)
if res.code == '405'
res = request_url_once(url, Net::HTTP::Get)
end
end
rescue => e
return Result.new(href, e.message)
end
if res.code =~ /^3..$/
if i == 4
return Result.new(href, 'too many redirects')
end
location = res['Location']
if location !~ /^https?:\/\//
base_url = url.dup
base_url.path = (location =~ /^\// ? '' : '/')
base_url.query = nil
base_url.fragment = nil
location = base_url.to_s + location
end
url = URI.parse(location)
elsif res.code == '200'
return nil
else
return Result.new(href, res.code)
end
end
raise 'should not have gotten here'
end