Class: PactBroker::Api::Resources::ErrorHandler
- Inherits:
-
Object
- Object
- PactBroker::Api::Resources::ErrorHandler
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, #log_with_tag
Class Method Details
.call(e, request, response) ⇒ Object
10
11
12
13
14
15
16
17
18
19
20
21
|
# 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) ⇒ Object
35
36
37
38
39
40
41
|
# 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 ⇒ Object
23
24
25
|
# 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) ⇒ Boolean
31
32
33
|
# 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) ⇒ Object
43
44
45
|
# 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) ⇒ Object
60
61
62
63
64
65
66
67
68
|
# 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) ⇒ Boolean
27
28
29
|
# 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) ⇒ Object
47
48
49
50
51
52
53
54
55
56
57
58
|
# 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
|