From 251488aeb8909f0caac348c56f3fc4aa8bdbe28b Mon Sep 17 00:00:00 2001 From: Christophe Taton Date: Wed, 17 Jun 2020 21:29:19 -0700 Subject: [PATCH] Excon::Socket.readline to use buffered reads `Excon::Socket.readline` currently reads 1 byte at a time, by performing one syscall for each byte (through `::Socket::read_nonblock`). This change proposes to use the private `Excon::Socket.read_nonblock` primitive instead, to benefit from the read buffer. Tests & specs seem to run fine with this change. --- lib/excon/socket.rb | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/lib/excon/socket.rb b/lib/excon/socket.rb index 19b80951..d2d256bf 100644 --- a/lib/excon/socket.rb +++ b/lib/excon/socket.rb @@ -60,18 +60,8 @@ def read(max_length = nil) def readline return legacy_readline if RUBY_VERSION.to_f <= 1.8_7 buffer = String.new - begin - buffer << @socket.read_nonblock(1) while buffer[-1] != "\n" - buffer - rescue *READ_RETRY_EXCEPTION_CLASSES - select_with_timeout(@socket, :read) && retry - rescue OpenSSL::SSL::SSLError => error - if error.message == 'read would block' - select_with_timeout(@socket, :read) && retry - else - raise(error) - end - end + buffer << read_nonblock(1) while buffer[-1] != "\n" + buffer end def legacy_readline