56 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
# frozen_string_literal: true
 | 
						|
 | 
						|
module Gitlab
 | 
						|
  module QueryLimiting
 | 
						|
    # Middleware for reporting (or raising) when a request performs more than a
 | 
						|
    # certain amount of database queries.
 | 
						|
    class Middleware
 | 
						|
      CONTROLLER_KEY = 'action_controller.instance'.freeze
 | 
						|
      ENDPOINT_KEY = 'api.endpoint'.freeze
 | 
						|
 | 
						|
      def initialize(app)
 | 
						|
        @app = app
 | 
						|
      end
 | 
						|
 | 
						|
      def call(env)
 | 
						|
        transaction, retval = Transaction.run do
 | 
						|
          @app.call(env)
 | 
						|
        end
 | 
						|
 | 
						|
        transaction.action = action_name(env)
 | 
						|
        transaction.act_upon_results
 | 
						|
 | 
						|
        retval
 | 
						|
      end
 | 
						|
 | 
						|
      def action_name(env)
 | 
						|
        if env[CONTROLLER_KEY]
 | 
						|
          action_for_rails(env)
 | 
						|
        elsif env[ENDPOINT_KEY]
 | 
						|
          action_for_grape(env)
 | 
						|
        end
 | 
						|
      end
 | 
						|
 | 
						|
      private
 | 
						|
 | 
						|
      def action_for_rails(env)
 | 
						|
        controller = env[CONTROLLER_KEY]
 | 
						|
        action = "#{controller.class.name}##{controller.action_name}"
 | 
						|
 | 
						|
        if controller.content_type == 'text/html'
 | 
						|
          action
 | 
						|
        else
 | 
						|
          "#{action} (#{controller.content_type})"
 | 
						|
        end
 | 
						|
      end
 | 
						|
 | 
						|
      def action_for_grape(env)
 | 
						|
        endpoint = env[ENDPOINT_KEY]
 | 
						|
        route = endpoint.route rescue nil
 | 
						|
 | 
						|
        "#{route.request_method} #{route.path}" if route
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |