Skip to content

Commit

Permalink
server.rb - properly cork & uncork ssl client (#2550)
Browse files Browse the repository at this point in the history
  • Loading branch information
MSP-Greg committed Feb 5, 2021
1 parent 475f860 commit e3380e9
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 10 deletions.
3 changes: 2 additions & 1 deletion History.md
@@ -1,6 +1,8 @@
## 5.2.1 / 2021-02-

* 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])
* Set `@env[CONTENT_LENGTH]` value as string.

Expand All @@ -20,7 +22,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])
Expand Down
2 changes: 1 addition & 1 deletion lib/puma/request.rb
Expand Up @@ -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)

Expand Down
15 changes: 7 additions & 8 deletions lib/puma/server.rb
Expand Up @@ -120,24 +120,21 @@ 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?
end

# 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
Expand All @@ -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
Expand Down

0 comments on commit e3380e9

Please sign in to comment.