Как сделать, чтобы время ожидания Ruby было HTTP-запросом по истечении времени X - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь определить, подключен ли хост Vagrant локально к сети, к которой мне нужно получить доступ. Если нет, я хочу требовать и настроить прокси, чтобы я мог загрузить некоторые внутренние ресурсы, необходимые для построения проекта.

Как сделать запрос HTTP, который истекает через заданное количество секунд, независимо от успехаили ошибка?

Я ожидаю, что следующий код вернет 1 или 2 секунды за прошедшее время:

HTTP_NETWORK_TEST_HOST = '172.16.0.1'

start1 = Time.now
begin
    http = Net::HTTP.new(HTTP_NETWORK_TEST_HOST, '80')
    http.read_timeout = 2
    http.open_timeout = 2
    response = http.start do |http|
        http.get('/')
    end
    NETWORK_PROXY_NEEDED = false
rescue Timeout::Error => e
    NETWORK_PROXY_NEEDED = true
end
finish1 = Time.now

start2 = Time.now
begin
    Timeout::timeout(1) {
        http = Net::HTTP.new(HTTP_NETWORK_TEST_HOST, '80')
        response = http.start do |http|
            http.get('/')
        end
    }
    NETWORK_PROXY_NEEDED = false
rescue
    NETWORK_PROXY_NEEDED = true
end
finish2 = Time.now


start3 = Time.now
begin
    http = Net::HTTP.start(HTTP_NETWORK_TEST_HOST, '80', {read_timeout: 5, open_timeout: 5})
    response =  http.get('/')
    NETWORK_PROXY_NEEDED = false
rescue Timeout::Error => e
    NETWORK_PROXY_NEEDED = true
end
finish3 = Time.now


puts 'time 1'
puts finish1 - start1

puts 'time 2'
puts finish2 - start2

puts 'time 3'
puts finish3 - start3

Результат:

time 1
21.003133
time 2
21.012332
time 3
21.009758

Ответ мне предоставил al2o3-cr на #ruby на freenode irc:

https://gist.github.com/gr33n7007h/d041f4fbc08f0e065854bb180330c3ac

NETWORK_PROXY_NEEDED = 
begin
  Socket.tcp(TEST_HOST, 80, connect_timeout: 1)&.close
  false
rescue Errno::ETIMEDOUT
  true
end

1 Ответ

0 голосов
/ 07 ноября 2019

Ответ был предоставлен мне al2o3-cr на #ruby на freenode irc:

https://gist.github.com/gr33n7007h/d041f4fbc08f0e065854bb180330c3ac

NETWORK_PROXY_NEEDED = 
begin
  Socket.tcp(TEST_HOST, 80, connect_timeout: 1)&.close
  false
rescue Errno::ETIMEDOUT
  true
end
...