diff options
-rw-r--r-- | lib/yahns/server.rb | 3 | ||||
-rw-r--r-- | test/test_server.rb | 20 |
2 files changed, 22 insertions, 1 deletions
diff --git a/lib/yahns/server.rb b/lib/yahns/server.rb index 3b9addc..b6663e1 100644 --- a/lib/yahns/server.rb +++ b/lib/yahns/server.rb @@ -315,9 +315,10 @@ class Yahns::Server # :nodoc: inherited = ENV['YAHNS_FD'].to_s.split(',').map! do |fd| io = Socket.for_fd(fd.to_i) opts = sock_opts(io) + io = server_cast(io, opts) set_server_sockopt(io, opts) @logger.info "inherited addr=#{sock_name(io)} fd=#{fd}" - server_cast(io, opts) + io end @listeners.replace(inherited) diff --git a/test/test_server.rb b/test/test_server.rb index 0410f65..50e739a 100644 --- a/test/test_server.rb +++ b/test/test_server.rb @@ -845,4 +845,24 @@ class TestServer < Testcase ensure quit_wait(pid) end + + def test_inherit_tcp_nodelay_set + err = @err + cfg = Yahns::Config.new + host, port = @srv.addr[3], @srv.addr[1] + @srv.setsockopt(:IPPROTO_TCP, :TCP_NODELAY, 0) + assert_equal 0, @srv.getsockopt(:IPPROTO_TCP, :TCP_NODELAY).int + cfg.instance_eval do + ru = lambda { |_| [ 200, { 'Content-Length' => '2' } , [ 'HI' ] ] } + GTL.synchronize { app(:rack, ru) { listen "#{host}:#{port}" } } + logger(Logger.new(err.path)) + end + pid = mkserver(cfg, @srv) { ENV["YAHNS_FD"] = "#{@srv.fileno}" } + run_client(host, port) { |res| assert_equal "HI", res.body } + + # TCP socket option is shared at file level, not FD level: + assert_equal 1, @srv.getsockopt(:IPPROTO_TCP, :TCP_NODELAY).int + ensure + quit_wait(pid) + end end |