From 32d3b1f052810eb15362d001d1501be0e2da88d8 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 28 Aug 2010 06:50:51 +0000 Subject: "keepalive_timeout 0" (really) disables keepalive Although this behavior is mentioned on the documentation, this was broken under EventMachine, Rev*, and Revactor. Furthermore, we set the "Connection: close" header to allow the client to optimize is handling of non-keepalive connections. --- lib/rainbows/event_machine.rb | 3 ++- lib/rainbows/response.rb | 1 + lib/rainbows/rev/heartbeat.rb | 2 +- lib/rainbows/revactor.rb | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) (limited to 'lib/rainbows') diff --git a/lib/rainbows/event_machine.rb b/lib/rainbows/event_machine.rb index 2a41015..cf59cbf 100644 --- a/lib/rainbows/event_machine.rb +++ b/lib/rainbows/event_machine.rb @@ -95,7 +95,8 @@ module Rainbows # long-running async response (response.nil? || -1 == response[0]) and return @state = :close - em_write_response(response, alive = @hp.keepalive? && G.alive) + alive = @hp.keepalive? && G.alive && G.kato > 0 + em_write_response(response, alive) if alive @env.clear @hp.reset diff --git a/lib/rainbows/response.rb b/lib/rainbows/response.rb index 3e196d1..ac09d6c 100644 --- a/lib/rainbows/response.rb +++ b/lib/rainbows/response.rb @@ -34,6 +34,7 @@ module Rainbows::Response # called after forking def self.setup(klass) + Rainbows::G.kato == 0 and KEEP_ALIVE.replace(CLOSE) range_class = body_class = klass case Rainbows::Const::RACK_DEFAULTS['rainbows.model'] when :WriterThreadSpawn diff --git a/lib/rainbows/rev/heartbeat.rb b/lib/rainbows/rev/heartbeat.rb index da1a1e2..f348a08 100644 --- a/lib/rainbows/rev/heartbeat.rb +++ b/lib/rainbows/rev/heartbeat.rb @@ -11,7 +11,7 @@ module Rainbows class Heartbeat < ::Rev::TimerWatcher def on_timer - if (ot = G.kato) > 0 + if (ot = G.kato) >= 0 ot = Time.now - ot KATO.delete_if { |client, time| time < ot and client.timeout? } end diff --git a/lib/rainbows/revactor.rb b/lib/rainbows/revactor.rb index 10b7d3c..388efa6 100644 --- a/lib/rainbows/revactor.rb +++ b/lib/rainbows/revactor.rb @@ -62,7 +62,7 @@ module Rainbows::Revactor if hp.headers? headers = HH.new(headers) range = make_range!(env, status, headers) and status = range.shift - env = false unless hp.keepalive? && G.alive + env = false unless hp.keepalive? && G.alive && G.kato > 0 headers[CONNECTION] = env ? KEEP_ALIVE : CLOSE client.write(response_header(status, headers)) end -- cgit v1.2.3-24-ge0c7