1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
# frozen_string_literal: true
module Aws
module Json
class ErrorHandler < Xml::ErrorHandler
# @param [Seahorse::Client::RequestContext] context
# @return [Seahorse::Client::Response]
def call(context)
@handler.call(context).on(300..599) do |response|
response.error = error(context)
response.data = nil
end
end
private
def extract_error(body, context)
json = Json.load(body)
code = error_code(json, context)
message = error_message(code, json)
data = parse_error_data(context, code)
[code, message, data]
rescue Json::ParseError
[http_status_error_code(context), '', EmptyStructure.new]
end
def error_code(json, context)
code = json['__type']
code ||= json['code']
code ||= context.http_response.headers['x-amzn-errortype']
if code
code.split('#').last
else
http_status_error_code(context)
end
end
def error_message(code, json)
if code == 'RequestEntityTooLarge'
'Request body must be less than 1 MB'
else
json['message'] || json['Message'] || ''
end
end
def parse_error_data(context, code)
data = EmptyStructure.new
if error_rules = context.operation.errors
error_rules.each do |rule|
# match modeled shape name with the type(code) only
# some type(code) might contains invalid characters
# such as ':' (efs) etc
match = rule.shape.name == code.gsub(/[^^a-zA-Z0-9]/, '')
if match && rule.shape.members.any?
data = Parser.new(rule).parse(context.http_response.body_contents)
end
end
end
data
end
end
end
end
|