From baccf80a090ed7ef990a74d4fde2f5512013d1f3 Mon Sep 17 00:00:00 2001 From: Simon Eskildsen Date: Sat, 25 Feb 2017 10:21:07 -0500 Subject: [PATCH] Don't handle closed clients --- lib/puma/server.rb | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lib/puma/server.rb b/lib/puma/server.rb index 727cfb15..c7bc1d11 100644 --- a/lib/puma/server.rb +++ b/lib/puma/server.rb @@ -100,6 +100,8 @@ module Puma # packetizes our stream. This improves both latency and throughput. # if RUBY_PLATFORM =~ /linux/ + UNPACK_TCP_STATE_FROM_TCP_INFO = "C".freeze + # 6 == Socket::IPPROTO_TCP # 3 == TCP_CORK # 1/0 == turn on/off @@ -116,12 +118,24 @@ module Puma rescue IOError, SystemCallError end end + + def closed_socket?(socket) + return false unless socket.kind_of? TCPSocket + tcp_info = socket.getsockopt(Socket::SOL_TCP, Socket::TCP_INFO) + state = tcp_info.unpack(UNPACK_TCP_STATE_FROM_TCP_INFO)[0] + # TIME_WAIT: 6, CLOSE: 7, CLOSE_WAIT: 8, LAST_ACK: 9, CLOSING: 11 + (state >= 6 && state <= 9) || state == 11 + end else def cork_socket(socket) end def uncork_socket(socket) end + + def closed_socket?(socket) + false + end end def backlog @@ -550,6 +564,8 @@ module Puma env = req.env client = req.io + return false if closed_socket?(client) + normalize_env env, req env[PUMA_SOCKET] = client