class Aws::Xml::ErrorHandler

def call(context)

def call(context)
  @handler.call(context).on(300..599) do |response|
    response.error = error(context)
    response.data = nil
  end
end

def empty_body?(context)

def empty_body?(context)
  context.http_response.body_contents.empty?
end

def empty_body_error_code(context)

def empty_body_error_code(context)
  status_code = context.http_response.status_code
  {
    302 => 'MovedTemporarily',
    304 => 'NotModified',
    400 => 'BadRequest',
    403 => 'Forbidden',
    404 => 'NotFound',
    412 => 'PreconditionFailed',
  }[status_code] || "Http#{status_code}Error"
end

def error(context)

def error(context)
  if empty_body?(context)
    error_code = empty_body_error_code(context)
    error_message = ''
  else
    error_code, error_message = extract_error(context)
  end
  svc = context.client.class.name.split('::')[1]
  errors_module = Aws.const_get(svc).const_get(:Errors)
  errors_module.error_class(error_code).new(context, error_message)
end

def extract_error(context)

def extract_error(context)
  error = MultiXml.parse(context.http_response.body_contents)
  %w(Response ErrorResponse Errors Error).each do |wrapper|
    error = error[wrapper] if error[wrapper]
  end
  [remove_prefix(context, error['Code']), error['Message']]
end

def remove_prefix(context, error_code)

def remove_prefix(context, error_code)
  if prefix = context.config.api.metadata('errorPrefix')
    error_code.sub(/^#{prefix}/, '')
  else
    error_code
  end
end