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"))
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
Differencebetween 'Try' and '&.' (Safe Navigation Operator) in Ruby
Rails Carrierwave Base64 Image Upload
Converting from Xml Name-Values into Simple Hash
Using Rbenv Doesn't Work with Sudo
How to Communicate with Threads in Ruby
How to Run Only Specific Tests in Rspec
Best Way to Pretty Print a Hash
To Change Directory Inside a Ruby Script
How to Set Private Instance Variable Used Within a Method Test
Reading and Updating Yaml File by Ruby Code
Does Ruby Call Initialize Method Automatically
Ruby Hash Autovivification (Facets)
Why Does Array.Each Behavior Depend on Array.New Syntax
Exponentiation in Ruby 1.8.7 Returns Wrong Answers
Ruby Design Pattern: How to Make an Extensible Factory Class