Тайм-аут ruby ​​restclient не работает должным образом, он выдает исключение после удвоения заданного времени ожидания - PullRequest
0 голосов
/ 12 октября 2018

Заметил, что Ruby RestClient точно не следует заданному параметру тайм-аута, однако работает, удваивая текущую настройку тайм-аута.

Кто-нибудь заметил то же самое?Прикрепленный пример тестового кода ниже.

Поскольку httpbin.org имеет максимальную задержку 10, нам нужно использовать небольшие тайм-ауты:

  def test_timeout(delay)
    start = Time.now.to_i
    RestClient::Request.execute(url:     "http://httpbin.org/delay/10",
                                method:  'GET',
                                timeout: delay)
    return 0
  rescue RestClient::Exceptions::ReadTimeout => exception
    endtime = Time.now.to_i
    return endtime - start
  end

pry(main)> test_timeout 1
RestClient.get "http://httpbin.org/delay/10", "Accept"=>"*/*", "Accept-Encoding"=>"gzip, deflate"

=> 3

pry(main)> test_timeout 5
RestClient.get "http://httpbin.org/delay/10", "Accept"=>"*/*", "Accept-Encoding"=>"gzip, deflate"

=> 10

Используя Ruby RestClient 2.0.2, а также протестирован с 2.1.0.rc1

Также протестирован с параметрами read_timeout и open_timeout, которые имели одинаковые значения

  def test_timeout(delay)
    start = Time.now.to_i
    RestClient::Request.execute(url: "http://httpbin.org/delay/10",
                                method: 'GET',
                                open_timeout: 1,
                                read_timeout: delay)
    return 0
  rescue RestClient::Exceptions::ReadTimeout => exception
    endtime = Time.now.to_i
    return endtime - start
  end

pry(main)> test_timeout 2
RestClient.get "http://httpbin.org/delay/10", "Accept"=>"*/*", "Accept-Encoding"=>"gzip, deflate"

=> 4
pry(main)> test_timeout 3
RestClient.get "http://httpbin.org/delay/10", "Accept"=>"*/*", "Accept-Encoding"=>"gzip, deflate"

=> 6

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Как итог,

это полезная функция в библиотеке Net :: HTTP.В Ruby 2.5 должен быть параметр для отмены функции.

Дополнительная информация от https://engineering.wework.com/ruby-users-be-wary-of-net-http-f284747288b2

Спасибо всем за ваши ответы!

0 голосов
/ 12 октября 2018

Timeout = read_timeout + open_timeout

open_timeout: время, по истечении которого, если не удается установить соединение, запрос будет отклонен

read_timeout: время, которое вы готовы подождать некоторое времяданные, которые будут получены с сервера

  RestClient::Request.execute(url: "http://httpbin.org/delay/#{delay * 10}",
                            method: 'GET',
                            timeout: 1)
...