class Bunny::JRuby::SSLSocket

TLS-enabled TCP socket that implements convenience methods found in Bunny::Socket.

Public Class Methods

new(*args) click to toggle source
Calls superclass method Bunny::SSLSocket::new
# File lib/bunny/jruby/ssl_socket.rb, line 11
def initialize(*args)
  super
  @__bunny_socket_eof_flag__ = false
end

Public Instance Methods

read_fully(count, timeout = nil) click to toggle source

Reads given number of bytes with an optional timeout

@param [Integer] count How many bytes to read @param [Integer] timeout Timeout

@return [String] Data read from the socket @api public

# File lib/bunny/jruby/ssl_socket.rb, line 23
def read_fully(count, timeout = nil)
  return nil if @__bunny_socket_eof_flag__

  value = ''
  begin
    loop do
      value << read_nonblock(count - value.bytesize)
      break if value.bytesize >= count
    end
  rescue EOFError => e
    @__bunny_socket_eof_flag__ = true
  rescue OpenSSL::SSL::SSLError => e
    if e.message == "read would block"
      if IO.select([self], nil, nil, timeout)
        retry
      else
        raise Timeout::Error, "IO timeout when reading #{count} bytes"
      end
    else
      raise e
    end
  rescue *READ_RETRY_EXCEPTION_CLASSES => e
    if IO.select([self], nil, nil, timeout)
      retry
    else
      raise Timeout::Error, "IO timeout when reading #{count} bytes"
    end
  end
  value
end