about summary refs log tree commit homepage
path: root/lib/rainbows
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2010-08-28 06:50:51 +0000
committerEric Wong <normalperson@yhbt.net>2010-08-28 06:53:12 +0000
commit32d3b1f052810eb15362d001d1501be0e2da88d8 (patch)
tree3e36ef1c071eb736c431d0972a24024ba2347aa9 /lib/rainbows
parent108d6afd7ff390bb594c99ba23c91163fa98d8c0 (diff)
downloadrainbows-32d3b1f052810eb15362d001d1501be0e2da88d8.tar.gz
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.
Diffstat (limited to 'lib/rainbows')
-rw-r--r--lib/rainbows/event_machine.rb3
-rw-r--r--lib/rainbows/response.rb1
-rw-r--r--lib/rainbows/rev/heartbeat.rb2
-rw-r--r--lib/rainbows/revactor.rb2
4 files changed, 5 insertions, 3 deletions
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