class PactBroker::Api::Resources::ErrorHandler

Public Class Methods

call(e, request, response) click to toggle source
# File lib/pact_broker/api/resources/error_handler.rb, line 10
def self.call e, request, response
  error_reference = generate_error_reference
  if log_as_warning?(e)
    logger.warn("Error reference #{error_reference}", e)
  elsif reportable?(e)
    log_error(e, "Error reference #{error_reference}")
    report(e, error_reference, request)
  else
    logger.info("Error reference #{error_reference}", e)
  end
  response.body = response_body_hash(e, error_reference).to_json
end
display_message(e, obfuscated_message) click to toggle source
# File lib/pact_broker/api/resources/error_handler.rb, line 35
def self.display_message(e, obfuscated_message)
  if PactBroker.configuration.show_backtrace_in_error_response?
    e.message || obfuscated_message
  else
    reportable?(e) ? obfuscated_message : e.message
  end
end
generate_error_reference() click to toggle source
# File lib/pact_broker/api/resources/error_handler.rb, line 23
def self.generate_error_reference
  SecureRandom.urlsafe_base64.gsub(/[^a-z]/i, "")[0,10]
end
log_as_warning?(e) click to toggle source
# File lib/pact_broker/api/resources/error_handler.rb, line 31
def self.log_as_warning?(e)
  PactBroker.configuration.warning_error_classes.any? { |clazz| e.is_a?(clazz) || e.cause&.is_a?(clazz) }
end
obfuscated_error_message(error_reference) click to toggle source
# File lib/pact_broker/api/resources/error_handler.rb, line 43
def self.obfuscated_error_message error_reference
  "An error has occurred. The details have been logged with the reference #{error_reference}"
end
report(e, error_reference, request) click to toggle source
# File lib/pact_broker/api/resources/error_handler.rb, line 60
def self.report e, error_reference, request
  PactBroker.configuration.api_error_reporters.each do | error_notifier |
    begin
      error_notifier.call(e, env: request.env, error_reference: error_reference)
    rescue StandardError => e
      log_error(e, "Error executing api_error_reporter")
    end
  end
end
reportable?(e) click to toggle source
# File lib/pact_broker/api/resources/error_handler.rb, line 27
def self.reportable?(e)
  !e.is_a?(PactBroker::Error) && !e.is_a?(JSON::JSONError)
end
response_body_hash(e, error_reference) click to toggle source
# File lib/pact_broker/api/resources/error_handler.rb, line 47
def self.response_body_hash e, error_reference
  response_body = {
    error: {
      message: display_message(e, obfuscated_error_message(error_reference)),
      reference: error_reference
    }
  }
  if PactBroker.configuration.show_backtrace_in_error_response?
    response_body[:error][:backtrace] = e.backtrace
  end
  response_body
end