Установка тайм-аута HTTP в Ruby 1.9.3

#ruby #httprequest #ruby-1.9.3 #net-http

#ruby #httprequest #ruby-1.9.3 #net-http

Вопрос:

Я использую Ruby 1.9.3 и мне нужно получить URL-адрес. Net::HTTP Однако, если сайт не работает, Net::HTTP он заканчивается зависанием.

Во время поиска в Интернете я видел, как многие люди сталкивались с подобными проблемами, и все с помощью хакерских решений. Однако многие из этих сообщений довольно старые.

Требования:

  • Я бы предпочел использовать Net::HTTP для установки нового драгоценного камня.
  • Мне нужны как тело, так и код ответа. (например, 200)
  • Я не хочу require open-uri , поскольку это вносит глобальные изменения и вызывает некоторые проблемы безопасности.
  • Мне нужно ПОЛУЧИТЬ URL-адрес в течение X секунд или вернуть ошибку.

Используя Ruby 1.9.3, как я могу ПОЛУЧИТЬ URL-адрес при установке тайм-аута?


Чтобы уточнить, мой существующий код выглядит так:

 Net::HTTP.get_response(URI.parse(url))
  

Попытка добавить:

 Net::HTTP.open_timeout(1000)
  

Приводит к:

 NoMethodError: undefined method `open_timeout' for Net::HTTP:Class
  

Ответ №1:

Вы можете установить open_timeout атрибут Net::HTTP объекта перед установлением соединения.

 uri = URI.parse(url)
Net::HTTP.new(uri.hostname, uri.port) do |http|
  http.open_timeout = 1000
  response = http.request_get(uri.request_uri)
end
  

Комментарии:

1.Макс — я не понимаю, как это сделать. Я использую метод класса get_request для Net:HTTP класса; но open_timeout это метод включен HTTPSession . open_timeout Управляет ли глобальная настройка в каком-либо синглтоне?

2. Net::HTTP имеет много запутанных методов класса, которые в основном являются ярлыками для создания Net::HTTP объектов (см. Исходный код get_response ). Смотрите мою правку о том, как создать Net::HTTP объект самостоятельно.

3. Как мне получить результат — тело и код результата http — используя этот код?

4. Пожалуйста, ознакомьтесь с документацией. http.request_get возвращает то же самое, что и Net::HTTP.get_response

5. Я попробовал, и new метод не работает с блоками для меня. Я изменил new метод на start метод, и все это работало нормально.

Ответ №2:

Я перепробовал все решения здесь и по другим вопросам об этой проблеме, но я понял все правильно только со следующим кодом, драгоценный камень open-uri является оболочкой для net::http. Мне нужен был get, который должен был ждать дольше, чем время ожидания по умолчанию, и прочитать ответ. Код также проще.

 require 'open-uri'
open(url, :read_timeout => 5 * 60) do |response|
  if response.read[/Return: Ok/i]
    log "sending ok"
  else
    raise "error sending, no confirmation received"
  end
end