class Redis::Connection::SSLSocket

def self.connect(host, port, timeout, ssl_params)

def self.connect(host, port, timeout, ssl_params)
  # NOTE: this is using Redis::Connection::TCPSocket
  tcp_sock = TCPSocket.connect(host, port, timeout)
  ctx = OpenSSL::SSL::SSLContext.new
  # The provided parameters are merged into OpenSSL::SSL::SSLContext::DEFAULT_PARAMS
  ctx.set_params(ssl_params || {})
  ssl_sock = new(tcp_sock, ctx)
  ssl_sock.hostname = host
  begin
    # Initiate the socket connection in the background. If it doesn't fail
    # immediately it will raise an IO::WaitWritable (Errno::EINPROGRESS)
    # indicating the connection is in progress.
    # Unlike waiting for a tcp socket to connect, you can't time out ssl socket
    # connections during the connect phase properly, because IO.select only partially works.
    # Instead, you have to retry.
    ssl_sock.connect_nonblock
  rescue Errno::EAGAIN, Errno::EWOULDBLOCK, IO::WaitReadable
    if ssl_sock.wait_readable(timeout)
      retry
    else
      raise TimeoutError
    end
  rescue IO::WaitWritable
    if ssl_sock.wait_writable(timeout)
      retry
    else
      raise TimeoutError
    end
  end
  unless ctx.verify_mode == OpenSSL::SSL::VERIFY_NONE || (
    ctx.respond_to?(:verify_hostname) &&
    !ctx.verify_hostname
  )
    ssl_sock.post_connection_check(host)
  end
  ssl_sock
end

def wait_readable(timeout = nil)

def wait_readable(timeout = nil)
  to_io.wait_readable(timeout)
end

def wait_writable(timeout = nil)

def wait_writable(timeout = nil)
  to_io.wait_writable(timeout)
end