Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

server.rb - properly cork & uncork ssl clients #2550

Merged
merged 1 commit into from Feb 5, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 2 additions & 1 deletion 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
Expand All @@ -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])
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

whoops good catch


* 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