Search code examples
rubyhttprequestruby-1.9.3net-http

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:

  • I'd prefer using Net::HTTP to installing a new gem.
  • I need both the Body and the Response Code. (e.g. 200)
  • I do not want to require open-uri, since that makes global changes and raises some security issues.
  • I need to GET a URL within X seconds, or return error.

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

Solution

  • 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