diff --git a/History.md b/History.md index 9f57e08355..70b89f9300 100644 --- a/History.md +++ b/History.md @@ -1,6 +1,8 @@ ## 5.2.1 / 2021-01- * Bugfixes + * Fix TCP cork/uncork operations to work with ssl clients (#2550) + * Require rack/common_logger explicitly if :verbose is true ([#2547]) * MiniSSL::Socket#write - use data.byteslice(wrote..-1) ([#2543]) ## 5.2.0 / 2021-01-27 @@ -19,7 +21,6 @@ * Fix phased restart errors related to nio4r gem when using the Puma control server ([#2516]) * Add `#string` method to `Puma::NullIO` ([#2520]) * Fix binding via Rack handler to IPv6 addresses ([#2521]) - * Require rack/common_logger explicitly if :verbose is true ([#2547]) * Refactor * Refactor MiniSSL::Context on MRI, fix MiniSSL::Socket#write ([#2519]) diff --git a/lib/puma/request.rb b/lib/puma/request.rb index 415d15cc75..8a629bf3d9 100644 --- a/lib/puma/request.rb +++ b/lib/puma/request.rb @@ -30,7 +30,7 @@ module Request # def handle_request(client, lines) env = client.env - io = client.io + io = client.io # io may be a MiniSSL::Socket return false if closed_socket?(io) diff --git a/lib/puma/server.rb b/lib/puma/server.rb index d60d64742f..8985b83c27 100644 --- a/lib/puma/server.rb +++ b/lib/puma/server.rb @@ -120,17 +120,13 @@ def current # :nodoc: # @version 5.0.0 def tcp_cork_supported? - RbConfig::CONFIG['host_os'] =~ /linux/ && - Socket.const_defined?(:IPPROTO_TCP) && - Socket.const_defined?(:TCP_CORK) + Socket.const_defined?(:TCP_CORK) && Socket.const_defined?(:IPPROTO_TCP) end # :nodoc: # @version 5.0.0 def closed_socket_supported? - RbConfig::CONFIG['host_os'] =~ /linux/ && - Socket.const_defined?(:IPPROTO_TCP) && - Socket.const_defined?(:TCP_INFO) + Socket.const_defined?(:TCP_INFO) && Socket.const_defined?(:IPPROTO_TCP) end private :tcp_cork_supported? private :closed_socket_supported? @@ -138,6 +134,7 @@ def closed_socket_supported? # On Linux, use TCP_CORK to better control how the TCP stack # packetizes our stream. This improves both latency and throughput. + # socket parameter may be an MiniSSL::Socket, so use to_io # if tcp_cork_supported? UNPACK_TCP_STATE_FROM_TCP_INFO = "C".freeze @@ -146,16 +143,18 @@ def closed_socket_supported? # 3 == TCP_CORK # 1/0 == turn on/off def cork_socket(socket) + skt = socket.to_io begin - socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_CORK, 1) if socket.kind_of? TCPSocket + skt.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_CORK, 1) if skt.kind_of? TCPSocket rescue IOError, SystemCallError Thread.current.purge_interrupt_queue if Thread.current.respond_to? :purge_interrupt_queue end end def uncork_socket(socket) + skt = socket.to_io begin - socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_CORK, 0) if socket.kind_of? TCPSocket + skt.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_CORK, 0) if skt.kind_of? TCPSocket rescue IOError, SystemCallError Thread.current.purge_interrupt_queue if Thread.current.respond_to? :purge_interrupt_queue end