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