SRobertJames
SRobertJames

Reputation: 9198

Setting an HTTP Timeout in Ruby 1.9.3

I'm using Ruby 1.9.3 and need to GET a URL. I have this working with Net::HTTP, however, if the site is down, Net::HTTP ends up hanging.

While searching the internet, I've seen many people faced similar problems, all with hacky solutions. However, many of those posts are quite old.

Requirements:

Using Ruby 1.9.3, how can I GET a URL while setting a timeout?


To clarify, my existing code looks like:

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

Trying to add:

Net::HTTP.open_timeout(1000)

Results in:

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

Upvotes: 3

Views: 3251

Answers (2)

peter
peter

Reputation: 42182

I tried all the solutions here and on the other questions about this problem but I only got everything right with the following code, The open-uri gem is a wrapper for net::http. I needed a get that had to wait longer than the default timeout and read the response. The code is also simpler.

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

Upvotes: 2

Max
Max

Reputation: 22315

You can set the open_timeout attribute of the Net::HTTP object before making the connection.

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

Upvotes: 3

Related Questions