From 88d6566d0b72429e792553bd405f767d34155d8a Mon Sep 17 00:00:00 2001 From: MSP-Greg Date: Thu, 8 Apr 2021 22:23:39 -0500 Subject: [PATCH] minissl.rb - allow chaining with '<<', improve/simplify write --- lib/puma/minissl.rb | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/lib/puma/minissl.rb b/lib/puma/minissl.rb index 64534872fb..d6b05370bc 100644 --- a/lib/puma/minissl.rb +++ b/lib/puma/minissl.rb @@ -114,31 +114,34 @@ def read_nonblock(size, *_) end end + # When returning a large response body (2MB), Ubuntu works fine with + # `syswrite`, but macOS & Windows have OpenSSL errors on the client. + # def write(data) return 0 if data.empty? + n = 0 + byte_size = data.bytesize + enc_wr = ''.dup + enc = nil - data_size = data.bytesize - need = data_size + while n < byte_size + n += @engine.write(n == 0 ? data : data.byteslice(n..-1)) - while true - wrote = @engine.write data + enc_wr << enc while (enc = @engine.extract) - enc_wr = ''.dup - while (enc = @engine.extract) - enc_wr << enc - end @socket.write enc_wr unless enc_wr.empty? - - need -= wrote - - return data_size if need == 0 - - data = data.byteslice(wrote..-1) + enc_wr.clear end + enc.clear unless enc.nil? + byte_size end alias_method :syswrite, :write - alias_method :<<, :write + + def <<(data) + write data + self + end # This is a temporary fix to deal with websockets code using # write_nonblock.