class Excon::Socket

def read_nonblock(max_length)

def read_nonblock(max_length)
  begin
    if max_length
      until @read_buffer.length >= max_length
        @read_buffer << @socket.read_nonblock(max_length - @read_buffer.length)
      end
    else
      loop do
        @read_buffer << @socket.read_nonblock(@data[:chunk_size])
      end
    end
  rescue OpenSSL::SSL::SSLError => error
    if error.message == 'read would block'
      select_with_timeout(@socket, :read) && retry
    else
      raise(error)
    end
  rescue Errno::EAGAIN, Errno::EWOULDBLOCK, IO::WaitReadable
    if @read_buffer.empty?
      # if we didn't read anything, try again...
      select_with_timeout(@socket, :read) && retry
    end
  rescue EOFError
    @eof = true
  end
  if max_length
    if @read_buffer.empty?
      nil # EOF met at beginning
    else
      @read_buffer.slice!(0, max_length)
    end
  else
    # read until EOFError, so return everything
    @read_buffer.slice!(0, @read_buffer.length)
  end
end