class Aws::Json::ErrorHandler

Public Instance Methods

call(context) click to toggle source

@param [Seahorse::Client::RequestContext] context @return [Seahorse::Client::Response]

# File lib/aws-sdk-core/json/error_handler.rb, line 9
def call(context)
  @handler.call(context).on(300..599) do |response|
    response.error = error(context)
    response.data = nil
  end
end

Private Instance Methods

error_code(json, context) click to toggle source
# File lib/aws-sdk-core/json/error_handler.rb, line 28
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
error_message(code, json) click to toggle source
# File lib/aws-sdk-core/json/error_handler.rb, line 39
def error_message(code, json)
  if code == 'RequestEntityTooLarge'
    'Request body must be less than 1 MB'
  else
    json['message'] || json['Message'] || ''
  end
end
extract_error(body, context) click to toggle source
# File lib/aws-sdk-core/json/error_handler.rb, line 18
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
parse_error_data(context, code) click to toggle source
# File lib/aws-sdk-core/json/error_handler.rb, line 47
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