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
|