Установите read_timeout для вызова службы в Ruby Net:: HTTP.start

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

res = Net::HTTP.start(@@task_url.host, @@task_url.port) do |http|
    http.get("/tasks/#{task_id}")
end          

Я пытался установить время read_timeout как под, но потом я получил исключение NoMethodError в своем коде.

res = Net::HTTP.start(@@task_url.host, @@task_url.port)
res.read_timeout = 10
res do |http|
    http.get("/tasks/#{task_id}")
end

Предложите мне, как мне установить read_timeout. И я хочу установить read_timeout где-то глобально, чтобы использовать этот тайм-аут для всего моего вызова службы через Net:: HTTPP.start()

Ответы

Ответ 1

Если вы используете Ruby 1.8, вы должны использовать Net::HTTP.new:

http = Net::HTTP.new(host, port)
http.read_timeout = 10

response = http.get("/")    
# or intead of above line if you need block
# http.start do
#   response = http.get("/")
# end

Если вы посмотрите исходный код Net::HTTP.start, вы увидите, что ::start просто вызывает ::new с помощью #start метод:

# File net/http.rb, line 439
def HTTP.start(address, port = nil, p_addr = nil, p_port = nil, p_user = nil, p_pass = nil, &block) # :yield: +http+
  new(address, port, p_addr, p_port, p_user, p_pass).start(&block)
end

>= Ruby 1.9

Вы можете установить read_timeout в выбрать аргумент: start(address, ..., opt, &block)

вот так:

res = Net::HTTP.start(host, port, :read_timeout => 10)

Ответ 2

Вы можете использовать open от OpenURI. Этот метод имеет параметр :read_timeout. Я не знаю, как установить параметр глобально, но вы можете обернуть его внутри настраиваемой функции, которая устанавливает этот параметр.

require 'open-uri'
module NetCustom

  def open_url(url, &task)
     open(url, :read_timeout => 20) do |file|
       yield file.read
     end
  end

end

Использование:

class Foo
  include NetCustom

  def bar
    open_url('http://example.org/tasks/') do |content|
      # Handle page text content
    end
  end
end