module Redis::Connection::SocketMixin

def _read_from_socket(nbytes, buffer = nil)

def _read_from_socket(nbytes, buffer = nil)
  loop do
    case chunk = read_nonblock(nbytes, buffer, exception: false)
    when :wait_readable
      unless wait_readable(@timeout)
        raise Redis::TimeoutError
      end
    when :wait_writable
      unless wait_writable(@timeout)
        raise Redis::TimeoutError
      end
    when nil
      raise Errno::ECONNRESET
    when String
      return chunk
    end
  end
end