How to specify a read timeout for a Net::HTTP::Post.new request in Ruby 2
Solved via this stackoverflow answer
I've changed my
response = Net::HTTP.start(url.host, url.port) {|http| http.request(request)}
line to be
response = Net::HTTP.start(url.host, url.port, :read_timeout => 500) {|http| http.request(request)}
and this seems to have got around this problem.
Ruby Net::HTTP second request when timeout
It's a feature of Net::HTTP
that it retries idempotent requests. You can limit number of retries by setting max_retries
(in your case to 0).
More on that issue on Ruby redmine
require "net/http"
http = Net::HTTP.new("timeout.free.beeceptor.com", 443)
http.read_timeout = 1
http.max_retries = 0 # <<<<<<<< the change
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
http.request(Net::HTTP::Get.new("/Time"))
Set custom timeout in Net::HTTP::Get.new with Rails
You need to set the read_timeout attribute.
link = URI.parse(url)
request = Net::HTTP::Get.new(link.path)
begin
response = Net::HTTP.start(link.host, link.port) {|http|
http.read_timeout = 100 #Default is 60 seconds
http.request(request)
}
rescue Net::ReadTimeout => e
puts e.message
end
How to set timeout for Net::HTTP.start?
As Ascar pointed out, this is wrong syntax.
But :read_timeout alone doesnt fix the issue, I also needed to add :open_timeout if the host didnt respond at all.
Net::HTTP.start(uri.host, uri.port, {read_timeout: 5, open_timeout: 5})
Ruby 2.3 - Adding Timeout error and notification to net:http request
That's not very beautiful solution (see: https://medium.com/@adamhooper/in-ruby-dont-use-timeout-77d9d4e5a001), but I believe you still can use it here, because you only have one thing happening inside opposite to the example in the link, where multiple actions could cause non-obvious behavior:
def get_url_http_response(url)
uri = URI.parse(URI.encode(url))
request = Timeout.timeout(25) { Net::HTTP.get_response(uri) }
return request
rescue Errno::ECONNREFUSED, SocketError => e
OpenStruct.new(code: -1)
rescue Timeout::Error
# return here anything you want
end
Related Topics
Rubymine 6.0.2, Unable to Debug
How to Push a Custom Gem to Heroku Master
Splitting a String into Words and Punctuation with Ruby
How to Serialize a Ruby Digest::Sha1 Instance Object
Rails 3.2 Create a Form That's Used in the Footer of Every Page
Ruby on Rails: Create Confirmation View Before Creating the Object
Flatten a Ruby Array Without Using Built-In 'Flatten' Method
How to Create an Association Between Two Rails Models
404 Resource Not Found: Domain with Google Directory API
Mini_Magick Gem Doesn't Work with My Imagemagick Install
Problems with Jslint-V8 Ruby Gem Installation on Windows7 64-Bit
How to Send Custom Invitation Using Devise_Invitable
Display Result Data Without Page Refresh on Form Submission in Ruby on Rails
How to Reset Boolean to "Default: False" at End of Day
How to Create Two Routes in One Block in Grape
How to Upgrade Rvm When the Official Way Doesn't Work