class Rack::Signals
Installs signal handlers that are safely processed after a request
NOTE: This middleware should not be used in a threaded environment
use Rack::Signals.new
do
trap 'INT', lambda { puts "Exiting now" exit } trap_when_ready 'USR1', lambda { puts "Exiting when ready" exit }
end
Public Class Methods
new(app, &block)
click to toggle source
# File lib/rack/contrib/signals.rb 35 def initialize(app, &block) 36 @app = app 37 @processing = false 38 @when_ready = nil 39 instance_eval(&block) 40 end
Public Instance Methods
call(env)
click to toggle source
# File lib/rack/contrib/signals.rb 42 def call(env) 43 begin 44 @processing, @when_ready = true, nil 45 status, headers, body = @app.call(env) 46 47 if handler = @when_ready 48 body = BodyWithCallback.new(body, handler) 49 @when_ready = nil 50 end 51 ensure 52 @processing = false 53 end 54 55 [status, headers, body] 56 end
trap_when_ready(signal, handler)
click to toggle source
# File lib/rack/contrib/signals.rb 58 def trap_when_ready(signal, handler) 59 when_ready_handler = lambda { |signal| 60 if @processing 61 @when_ready = lambda { handler.call(signal) } 62 else 63 handler.call(signal) 64 end 65 } 66 trap(signal, when_ready_handler) 67 end