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