def read(max_length=nil)
return nil if @eof
if @eof
''
elsif @params[:nonblock]
begin
if max_length
until @read_buffer.length >= max_length
@read_buffer << @socket.read_nonblock(max_length - @read_buffer.length)
end
else
while true
@read_buffer << @socket.read_nonblock(@params[:chunk_size])
end
end
rescue OpenSSL::SSL::SSLError => error
if error.message == 'read would block'
if IO.select([@socket], nil, nil, @params[:read_timeout])
retry
else
raise(Excon::Errors::Timeout.new("read timeout reached"))
end
else
raise(error)
end
rescue Errno::EAGAIN, Errno::EWOULDBLOCK, IO::WaitReadable
if IO.select([@socket], nil, nil, @params[:read_timeout])
retry
else
raise(Excon::Errors::Timeout.new("read timeout reached"))
end
rescue EOFError
@eof = true
end
if max_length
@read_buffer.slice!(0, max_length)
else
@read_buffer.slice!(0, @read_buffer.length)
end
else
begin
Timeout.timeout(@params[:read_timeout]) do
@socket.read(max_length)
end
rescue Timeout::Error
raise Excon::Errors::Timeout.new('read timeout reached')
end
end
end