是什么导致OpenSSL :: SSL :: SSLErrorWaitReadable"读取会阻塞"?

Aut*_*ico 10 ruby net-http

什么OpenSSL::SSL::SSLErrorWaitReadable "read would block"意思?

我收到错误OpenSSL::SSL::SSLErrorWaitReadable消息read would block.我认为这是因为超时,但我找不到有关该主题的任何文档.

任何人都可以帮我找出造成这种情况的原因吗?我还能做些什么来防止这个问题呢?

偶尔产生此错误的代码:

data = {hello: "world"}
path = "https://example.com/api"
uri = URI.parse(path)
http = Net::HTTP.new(uri.host, uri.port)

http.use_ssl = (uri.scheme == "https")
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
request = Net::HTTP::Post.new(uri.request_uri)
request.body = Oj.dump(data)
request["Content-Type"] = "application/json"
begin
    response = http.request(request) #this line produces the error.
rescue
    return nil
end
Run Code Online (Sandbox Code Playgroud)

我在osx上使用ruby版本2.1.5p273和openssl版本.1.0.1i10.10.3

使用命令找到版本 ruby -v -ropenssl -rfiddle -e 'puts Fiddle::Function.new(Fiddle.dlopen(nil)["SSLeay_version"], [Fiddle::TYPE_INT], Fiddle::TYPE_VOIDP).call(0)' 感谢@bayendor

小智 0

无法在我的本地机器上重现。有用。这是我的版本,你能和你的系统确认一下吗?或者,如果您的机器是 Mac,并且您使用系统 openssl 和 readline 安装了 ruby​​,则可能是因为它太旧了。尝试安装新的 openssl 和 readline 并构建 ruby​​,然后再次执行脚本。

% brew install openssl readline
% RUBY_CONFIGURE_OPTS="--enable-shared --with-readline-dir=$(brew --prefix readline) --with-openssl-dir=$(brew --prefix openssl)" rbenv install 2.0.0-p598
Run Code Online (Sandbox Code Playgroud)
OS: MaxOSX 10.10.2  
ruby: 2.1.2p95 (2014-05-08 revision 45877) [x86_64-darwin12.0]  
oj (2.12.9)
Run Code Online (Sandbox Code Playgroud)
% ruby test.rb
OK

% cat test.rb

require 'uri'
require 'net/http'
require 'openssl'
require 'oj'

data = {hello: "world"}
path = "https://example.com/api"
uri = URI.parse(path)
http = Net::HTTP.new(uri.host, uri.port)

http.use_ssl = (uri.scheme == "https")
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
request = Net::HTTP::Post.new(uri.request_uri)
request.body = Oj.dump(data)
request["Content-Type"] = "application/json"
begin
    response = http.request(request) #this line produces the error.
    puts('OK')
rescue
    return nil
end
Run Code Online (Sandbox Code Playgroud)