From 477a2207869ff6b11a1cdee428b55604f2caa69e Mon Sep 17 00:00:00 2001 From: Dylan Thacker-Smith Date: Sat, 25 Mar 2017 21:49:03 -0400 Subject: Check for Socket::TCP_INFO constant before trying to get TCP_INFO The ruby constant Socket::TCP_INFO is only defined if TCP_INFO is defined in C, so we can just check for the presence of that ruby constant instead of rescuing SocketError from the call to getsockopt. --- lib/unicorn/http_request.rb | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/lib/unicorn/http_request.rb b/lib/unicorn/http_request.rb index 6dc0aa7..f83a566 100644 --- a/lib/unicorn/http_request.rb +++ b/lib/unicorn/http_request.rb @@ -29,7 +29,7 @@ class Unicorn::HttpParser EMPTY_ARRAY = [].freeze @@input_class = Unicorn::TeeInput @@check_client_connection = false - @@tcpi_inspect_ok = nil + @@tcpi_inspect_ok = Socket.const_defined?(:TCP_INFO) def self.input_class @@input_class @@ -154,19 +154,8 @@ class Unicorn::HttpParser # Not that efficient, but probably still better than doing unnecessary # work after a client gives up. def check_client_connection(socket) # :nodoc: - if Unicorn::TCPClient === socket && @@tcpi_inspect_ok != false - if @@tcpi_inspect_ok - opt = socket.getsockopt(:IPPROTO_TCP, :TCP_INFO).inspect - else - @@tcpi_inspect_ok = true - opt = begin - socket.getsockopt(:IPPROTO_TCP, :TCP_INFO) - rescue SocketError - @@tcpi_inspect_ok = false - return write_http_header(socket) - end.inspect - end - + if Unicorn::TCPClient === socket && @@tcpi_inspect_ok + opt = socket.getsockopt(Socket::IPPROTO_TCP, Socket::TCP_INFO).inspect if opt =~ /\bstate=(\S+)/ raise Errno::EPIPE, "client closed connection".freeze, EMPTY_ARRAY if closed_state_str?($1) -- cgit v1.2.3-24-ge0c7