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 | 18 ++++--------------
1 file changed, 4 insertions(+), 14 deletions(-)
diff --git a/lib/unicorn/http_request.rb b/lib/unicorn/http_request.rb
index 6dc0aa7..8f1638a 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,20 +154,10 @@ def closed_state?(state) # :nodoc:
# 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+)/
+ @@tcpi_inspect_ok = true
raise Errno::EPIPE, "client closed connection".freeze,
EMPTY_ARRAY if closed_state_str?($1)
else
--
2.10.0