如果没有设置Net :: HTTP的open_timeout和read_timeout,它会无限期地等待吗?

时间:2013-12-08 05:42:02

标签: ruby net-http

如果未设置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

1 个答案:

答案 0 :(得分:2)

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

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

实际上,我建议它不是Net::HTTP problem。 Matz has already had problemsrb_wait_for_single_fd calls。它实际上看起来像ruby线程同步中的死锁,而不像服务器挂断。