Class: PactBroker::Api::Resources::ErrorHandler

Inherits:
Object
  • Object
show all
Includes:
Logging
Defined in:
lib/pact_broker/api/resources/error_handler.rb

Class Method Summary collapse

Methods included from Logging

included, #log_error

Class Method Details

.call(e, request, response) ⇒ Object



11
12
13
14
15
16
17
18
19
20
# File 'lib/pact_broker/api/resources/error_handler.rb', line 11

def self.call e, request, response
  error_reference = generate_error_reference
  if reportable?(e)
    log_error(e, "Error reference #{error_reference}")
    report(e, error_reference, request)
  else
    logger.info "Error reference #{error_reference} - #{e.class} #{e.message}\n#{e.backtrace.join("\n")}"
  end
  response.body = response_body_hash(e, error_reference).to_json
end

.display_message(e, error_reference) ⇒ Object



30
31
32
33
34
35
36
# File 'lib/pact_broker/api/resources/error_handler.rb', line 30

def self.display_message(e, error_reference)
  if PactBroker.configuration.show_backtrace_in_error_response?
    e.message || obfuscated_error_message(error_reference)
  else
   reportable?(e) ? obfuscated_error_message(error_reference) : e.message
  end
end

.generate_error_referenceObject



22
23
24
# File 'lib/pact_broker/api/resources/error_handler.rb', line 22

def self.generate_error_reference
  SecureRandom.urlsafe_base64.gsub(/[^a-z]/i, '')[0,10]
end

.obfuscated_error_message(error_reference) ⇒ Object



38
39
40
# File 'lib/pact_broker/api/resources/error_handler.rb', line 38

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) ⇒ Object



55
56
57
58
59
60
61
62
63
# File 'lib/pact_broker/api/resources/error_handler.rb', line 55

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) ⇒ Boolean

Returns:

  • (Boolean)


26
27
28
# File 'lib/pact_broker/api/resources/error_handler.rb', line 26

def self.reportable?(e)
  !e.is_a?(PactBroker::Error) && !e.is_a?(JSON::GeneratorError)
end

.response_body_hash(e, error_reference) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/pact_broker/api/resources/error_handler.rb', line 42

def self.response_body_hash e, error_reference
  response_body = {
    error: {
      message: display_message(e, error_reference),
      reference: error_reference
    }
  }
  if PactBroker.configuration.show_backtrace_in_error_response?
    response_body[:error][:backtrace] = e.backtrace
  end
  response_body
end