module Datadog::AppSec::Contrib::Sinatra::DispatchPatch

def dispatch!

def dispatch!
  env = @request.env
  context = env[Datadog::AppSec::Ext::SCOPE_KEY]
  return super unless context
  # TODO: handle exceptions, except for super
  gateway_request = Gateway::Request.new(env)
  request_return, request_response = Instrumentation.gateway.push('sinatra.request.dispatch', gateway_request) do
    # handle process_route interruption
    catch(Datadog::AppSec::Contrib::Sinatra::Ext::ROUTE_INTERRUPT) { super }
  end
  if request_response
    blocked_event = request_response.find { |action, _options| action == :block }
    if blocked_event
      self.response = AppSec::Response.negotiate(env, blocked_event.last[:actions]).to_sinatra_response
      request_return = nil
    end
  end
  request_return
end