31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
# File 'lib/excon/socket.rb', line 31
def read(max_length=nil)
if @eof
return max_length ? nil : ''
elsif @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(@data[:chunk_size])
end
end
rescue OpenSSL::SSL::SSLError => error
if error.message == 'read would block'
if IO.select([@socket], nil, nil, @data[: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, @data[:read_timeout])
retry
else
raise(Excon::Errors::Timeout.new("read timeout reached"))
end
rescue EOFError
@eof = true
end
if max_length
if @read_buffer.empty?
nil else
@read_buffer.slice!(0, max_length)
end
else
@read_buffer.slice!(0, @read_buffer.length)
end
else
begin
Timeout.timeout(@data[:read_timeout]) do
@socket.read(max_length)
end
rescue Timeout::Error
raise Excon::Errors::Timeout.new('read timeout reached')
end
end
end
|