47 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			47 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Ruby
		
	
	
	
| # frozen_string_literal: true
 | |
| 
 | |
| module Gitlab
 | |
|   class FeatureCategories
 | |
|     FEATURE_CATEGORY_DEFAULT = 'unknown'
 | |
| 
 | |
|     attr_reader :categories
 | |
| 
 | |
|     def self.default
 | |
|       @default ||= self.load_from_yaml
 | |
|     end
 | |
| 
 | |
|     def self.load_from_yaml
 | |
|       categories = YAML.load_file(Rails.root.join('config', 'feature_categories.yml'))
 | |
| 
 | |
|       new(categories)
 | |
|     end
 | |
| 
 | |
|     def initialize(categories)
 | |
|       @categories = categories.to_set
 | |
|     end
 | |
| 
 | |
|     # If valid, returns a feature category from the given request.
 | |
|     def from_request(request)
 | |
|       category = request.headers["HTTP_X_GITLAB_FEATURE_CATEGORY"].presence
 | |
| 
 | |
|       return unless category && valid?(category)
 | |
| 
 | |
|       return unless ::Gitlab::RequestForgeryProtection.verified?(request.env)
 | |
| 
 | |
|       category
 | |
|     end
 | |
| 
 | |
|     def get!(feature_category)
 | |
|       return feature_category if valid?(feature_category)
 | |
| 
 | |
|       raise "Unknown feature category: #{feature_category}" if Gitlab.dev_or_test_env?
 | |
| 
 | |
|       FEATURE_CATEGORY_DEFAULT
 | |
|     end
 | |
| 
 | |
|     def valid?(category)
 | |
|       categories.include?(category.to_s)
 | |
|     end
 | |
|   end
 | |
| end
 |