Dylan Thacker-Smith wrote:
> 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.
Good catch! I forget there's systems without TCP_INFO at all :x
> +++ 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
Is the last line to set "@@tcpi_inspect_ok = true" still
necessary? It was necessary in Jeremy's version, but I think
you can safely omit it, now.
>raise Errno::EPIPE, "client closed connection".freeze,
> EMPTY_ARRAY if closed_state_str?($1)
> else
Anyways, I'm inclined to apply your patch with the redundant
assignment removed (no need to resend). Thanks.
--
unsubscribe: unicorn-public+unsubscr...@bogomips.org
archive: https://bogomips.org/unicorn-public/