I'm working on an SSL client/server application using persistent TLSv1
connections. I'm having some issues with my server and what I think
should be a blocking read or select.

I'm basically doing this where @io is an OpenSSL::SSL::SSLSocket:

until @data.length == READ_SIZE do
  tmp = @io.read(READ_SIZE - @data.length)
  if tmp.nil?
    IO.select [@io]
  else
    @data << tmp
  end
end

(I did not initially have the select call, but decided to give that a
try.)

I would expect that the read would block (I have not set O_NONBLOCK on
the socket) until there is data to be read. Instead, when there is no
data, every read call returns nil. I thought the select would fix
that, but it returns immediately and the read call again returns nil.

Am I misunderstanding how this should work? Would the fact that it's
an SSL connection cause the issue?

I'm using 1.8.4 on Linux.

Thanks for any insights you can offer.

Jeremy