Ruby 如果Net::HTTP';s打开超时和读取超时未设置,是否会无限期等待?

Ruby 如果Net::HTTP';s打开超时和读取超时未设置,是否会无限期等待?,ruby,net-http,Ruby,Net Http,如果未设置Net::HTTP的open\u timeout和read\u timeout,它会无限期等待吗 ,打开超时被定义为: 等待连接打开的秒数。任何数字都可以 可以使用,包括分数秒的浮动。如果HTTP对象 无法在这么多秒内打开连接,它会引发 Net::OpenTimeout异常。默认值为零 好的,那么默认值是nil。如果服务器(比如恶意服务器)从未响应,并且客户端未设置打开超时,会发生什么情况?客户会无限期地等待吗 我之所以这样问,是因为我正在尝试调试一个场景,在该场景中,我的所有进程都无

如果未设置
Net::HTTP
open\u timeout
read\u timeout
,它会无限期等待吗

,打开超时被定义为:

等待连接打开的秒数。任何数字都可以 可以使用,包括分数秒的浮动。如果HTTP对象 无法在这么多秒内打开连接,它会引发 Net::OpenTimeout异常。默认值为零

好的,那么默认值是nil。如果服务器(比如恶意服务器)从未响应,并且客户端未设置
打开超时
,会发生什么情况?客户会无限期地等待吗

我之所以这样问,是因为我正在尝试调试一个场景,在该场景中,我的所有进程都无限期挂起,SSL连接请求位于堆栈顶部:

#0  0x00007f33a07acb13 in ppoll () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00007f33a1962558 in rb_wait_for_single_fd (fd=<optimized out>, events=<optimized out>, tv=0x0) at thread.c:3583
#2  0x00007f33a1966ea2 in rb_thread_wait_fd_rw (read=1, fd=<optimized out>) at thread.c:3422
#3  rb_thread_wait_fd (fd=<optimized out>) at thread.c:3433
#4  0x00007f33a1854ebf in rb_io_wait_readable (f=40) at io.c:1081
#5  0x00007f339ed72184 in ossl_start_ssl (self=139859849103720, func=0x7f339eb1ab20 <SSL_connect>, funcname=0x7f339ed82d89 "SSL_connect", nonblock=<optimized out>) at ossl_ssl.c:1278

这实际上意味着服务器存在并接受请求,但不返回数据,仍然保持连接打开。是的,在这种恶意服务器的情况下,客户端将挂断

Net::HTTP
中没有默认超时。在正常情况下,它将收到
HTTPRequestTimeOut
响应(哪个服务器负责)。如果您觉得可能有任何问题,请自行设置超时。但有时您确实需要无限期地等待(服务器正在处理大量数据,您知道这一点)


实际上,我建议这不是一个
Net::HTTP问题
。使用
rb\u wait\u等待单次\u fd呼叫的Matz
。它实际上看起来像ruby线程同步中的死锁,而不像服务器挂断。

这实际上意味着服务器存在并接受请求,但不返回数据,仍然保持连接打开。是的,在这种恶意服务器的情况下,客户端将挂断。是否存在客户端永远不会挂断/超时的Net::HTTP配置?嗯……设置
open\u timeout
似乎是一种解决方案。您也可以对原始代码进行猴头补丁,将
打开\u超时
设置为非零值。但是开箱即用的
Net:HTTP
是一个库;它没有配置文件,并且提供了无限等待的机制(例如长时间的服务器端处理)。这很有趣……我深入研究了一下,我认为这不是
Net::HTTP
问题。Matz已经有了与
rb\u wait\u for\u single\u fd
的通话。实际上,它看起来像ruby线程同步中的死锁,而不像服务器挂断。@mudasobwa好的,像死锁这样的坏东西对我来说更有意义……任何网络库都允许客户端在不使用某种默认超时的情况下执行网络操作(我觉得通常是60秒…)似乎有点疯狂
from /usr/local/lib/ruby/gems/2.0.0/gems/httparty-0.11.0/lib/httparty.rb:497:in `post'
from /usr/local/lib/ruby/gems/2.0.0/gems/httparty-0.11.0/lib/httparty.rb:414:in `post'
from /usr/local/lib/ruby/gems/2.0.0/gems/httparty-0.11.0/lib/httparty.rb:461:in `perform_request'
from /usr/local/lib/ruby/gems/2.0.0/gems/httparty-0.11.0/lib/httparty/request.rb:92:in `perform'
from /usr/local/lib/ruby/2.0.0/net/http.rb:1367:in `request'
from /usr/local/lib/ruby/2.0.0/net/http.rb:851:in `start'
from /usr/local/lib/ruby/2.0.0/net/http.rb:862:in `do_start'
from /usr/local/lib/ruby/2.0.0/net/http.rb:918:in `connect'
from /usr/local/lib/ruby/2.0.0/timeout.rb:52:in `timeout'
from /usr/local/lib/ruby/2.0.0/net/http.rb:918:in `block in connect'
from /usr/local/lib/ruby/2.0.0/net/http.rb:918:in `connect'