diff options
-rw-r--r-- | lib/rainbows/rev.rb | 4 | ||||
-rw-r--r-- | lib/rainbows/rev/client.rb | 6 | ||||
-rw-r--r-- | lib/rainbows/rev/heartbeat.rb | 2 |
3 files changed, 12 insertions, 0 deletions
diff --git a/lib/rainbows/rev.rb b/lib/rainbows/rev.rb index 602545d..eed14f5 100644 --- a/lib/rainbows/rev.rb +++ b/lib/rainbows/rev.rb @@ -24,6 +24,10 @@ module Rainbows # temporary file before the application is entered. module Rev + + # keep-alive timeout scoreboard + KATO = {} + include Core end end diff --git a/lib/rainbows/rev/client.rb b/lib/rainbows/rev/client.rb index 9decac9..b30bd0e 100644 --- a/lib/rainbows/rev/client.rb +++ b/lib/rainbows/rev/client.rb @@ -23,8 +23,13 @@ module Rainbows schedule_write unless out_headers # triggers a write end + def timeout? + @_write_buffer.empty? && @deferred_bodies.empty? and close.nil? + end + def app_call begin + KATO.delete(self) (@env[RACK_INPUT] = @input).rewind @env[REMOTE_ADDR] = @remote_addr response = APP.call(@env.update(RACK_DEFAULTS)) @@ -38,6 +43,7 @@ module Rainbows @state = :headers # keepalive requests are always body-less, so @input is unchanged @hp.headers(@env, @buf) and next + KATO[self] = Time.now else quit end diff --git a/lib/rainbows/rev/heartbeat.rb b/lib/rainbows/rev/heartbeat.rb index 1f07b2d..5f76ed7 100644 --- a/lib/rainbows/rev/heartbeat.rb +++ b/lib/rainbows/rev/heartbeat.rb @@ -10,6 +10,8 @@ module Rainbows class Heartbeat < ::Rev::TimerWatcher def on_timer + ot = Time.now - 5 + KATO.delete_if { |client, time| time < ot and client.timeout? } exit if (! G.tick && G.cur <= 0) end |