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