如果未设置Net::HTTP
的{{1}}和open_timeout
,它会无限期等待吗?
According to the docs,open_timeout定义为:
等待连接打开的秒数。任何数字都可以 使用,包括浮点数小秒。如果是HTTP对象 在这很多秒内无法打开连接,它引发了一个 Net :: OpenTimeout异常。默认值为nil。
好的,所以默认值是nil。如果服务器(例如,恶意服务器)从未响应且客户端未设置read_timeout
,会发生什么?客户会无限期地等待吗?
我问,因为我正在尝试调试一个场景,其中我的所有进程都无限期地挂起,并且堆栈顶部有一个SSL连接请求:
open_timeout
这显然是由这个电话引发的:
#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
答案 0 :(得分:2)
这实际上意味着服务器存在并接受请求,但不返回数据,仍保持连接打开。是的,在这种恶意服务器的情况下,客户端将挂断。
Net::HTTP
中没有默认超时。在正常情况下,它将收到HTTPRequestTimeOut
响应(哪个服务器值班。)如果您觉得可能有任何问题,请自行设置超时。但有时你真的需要无限期等待(服务器正在处理大量数据而你知道它。)
实际上,我建议它不是Net::HTTP problem
。 Matz has already had problems与rb_wait_for_single_fd calls
。它实际上看起来像ruby线程同步中的死锁,而不像服务器挂断。