class RackRequestBlocker
Rack middleware that keeps track of the number of active requests and can block new requests. blog.salsify.com/engineering/tearing-capybara-ajax-tests
Constants
- VERSION
Public Class Methods
allow_requests!()
click to toggle source
Allows the server to accept requests again.
# File lib/rack_request_blocker.rb, line 22 def self.allow_requests! @@allowing_requests.set end
block_requests!()
click to toggle source
Prevents the server from accepting new requests. Any new requests will return an HTTP 503 status.
# File lib/rack_request_blocker.rb, line 17 def self.block_requests! @@allowing_requests.reset end
new(app)
click to toggle source
# File lib/rack_request_blocker.rb, line 26 def initialize(app) @app = app end
num_active_requests()
click to toggle source
Returns the number of requests the server is currently processing.
# File lib/rack_request_blocker.rb, line 11 def self.num_active_requests @@num_active_requests.value end
wait_for_no_active_requests(max_wait_time: 10, for_example: nil, diagnostic_log: true)
click to toggle source
# File lib/rack_request_blocker.rb, line 43 def self.wait_for_no_active_requests(max_wait_time: 10, for_example: nil, diagnostic_log: true) RackRequestBlocker.block_requests! unless num_active_requests == 0 || diagnostic_log == false msg = "Waiting on #{num_active_requests} active requests" msg += " for #{for_example.location}" if for_example log msg end obtained = (num_active_requests == 0) || @@allowing_requests.wait(max_wait_time) unless obtained raise Timeout::Error, "rack_request_blocker gave up waiting #{max_wait_time}s for pending AJAX requests complete" end ensure RackRequestBlocker.allow_requests! end
Private Class Methods
log(msg)
click to toggle source
# File lib/rack_request_blocker.rb, line 62 def self.log(msg) $stderr.puts "\nrack_request_blocker: #{msg}" end
Public Instance Methods
call(env)
click to toggle source
# File lib/rack_request_blocker.rb, line 30 def call(env) increment_active_requests if block_requests? block_request(env) else @app.call(env) end ensure decrement_active_requests end
Private Instance Methods
block_request(env)
click to toggle source
# File lib/rack_request_blocker.rb, line 70 def block_request(env) [503, {}, ['Blocked by rack_request_blocker, requests blocked while waiting for in-progress requests to complete']] end
block_requests?()
click to toggle source
# File lib/rack_request_blocker.rb, line 66 def block_requests? ! @@allowing_requests.set? end
decrement_active_requests()
click to toggle source
# File lib/rack_request_blocker.rb, line 78 def decrement_active_requests new_value = @@num_active_requests.decrement if new_value == 0 RackRequestBlocker.allow_requests! end end
increment_active_requests()
click to toggle source
# File lib/rack_request_blocker.rb, line 74 def increment_active_requests @@num_active_requests.increment end