44 lines
		
	
	
		
			977 B
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			44 lines
		
	
	
		
			977 B
		
	
	
	
		
			Ruby
		
	
	
	
# frozen_string_literal: true
 | 
						|
 | 
						|
require_relative 'utils/override'
 | 
						|
 | 
						|
module Gitlab
 | 
						|
  class ExceptionsApp < ActionDispatch::PublicExceptions
 | 
						|
    extend ::Gitlab::Utils::Override
 | 
						|
 | 
						|
    REQUEST_ID_PLACEHOLDER = '<!-- REQUEST_ID -->'
 | 
						|
    REQUEST_ID_PARAGRAPH = '<p>Request ID: <code>%s</code></p>'
 | 
						|
 | 
						|
    override :call
 | 
						|
    def call(env)
 | 
						|
      status, headers, body = super
 | 
						|
 | 
						|
      if html_rendered? && body.first&.include?(REQUEST_ID_PLACEHOLDER)
 | 
						|
        body = [insert_request_id(env, body.first)]
 | 
						|
        headers['X-GitLab-Custom-Error'] = '1'
 | 
						|
      end
 | 
						|
 | 
						|
      [status, headers, body]
 | 
						|
    end
 | 
						|
 | 
						|
    private
 | 
						|
 | 
						|
    override :render_html
 | 
						|
    def render_html(status)
 | 
						|
      @html_rendered = true
 | 
						|
 | 
						|
      super
 | 
						|
    end
 | 
						|
 | 
						|
    def html_rendered?
 | 
						|
      !!@html_rendered
 | 
						|
    end
 | 
						|
 | 
						|
    def insert_request_id(env, body)
 | 
						|
      request_id = ERB::Util.html_escape(ActionDispatch::Request.new(env).request_id)
 | 
						|
 | 
						|
      body.gsub(REQUEST_ID_PLACEHOLDER, REQUEST_ID_PARAGRAPH % [request_id])
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |