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 error(context)
def error(context) body = context.http_response.body_contents if body.empty? code = http_status_error_code(context) message = '' else code, message = extract_error(body, context) end svc = context.client.class.name.split('::')[1] errors_module = Aws.const_get(svc).const_get(:Errors) errors_module.error_class(code).new(context, message) end
def error_code(body, context)
def error_code(body, context) if matches = body.match(/<Code>(.+?)<\/Code>/) remove_prefix(unescape(matches[1]), context) else http_status_error_code(context) end end
def error_message(body)
def error_message(body) if matches = body.match(/<Message>(.+?)<\/Message>/m) unescape(matches[1]) else '' end end
def extract_error(body, context)
def extract_error(body, context) [ error_code(body, context), error_message(body), ] end
def http_status_error_code(context)
def http_status_error_code(context) status_code = context.http_response.status_code { 302 => 'MovedTemporarily', 304 => 'NotModified', 400 => 'BadRequest', 403 => 'Forbidden', 404 => 'NotFound', 412 => 'PreconditionFailed', 413 => 'RequestEntityTooLarge', }[status_code] || "Http#{status_code}Error" end
def remove_prefix(error_code, context)
def remove_prefix(error_code, context) if prefix = context.config.api.metadata['errorPrefix'] error_code.sub(/^#{prefix}/, '') else error_code end end
def unescape(str)
def unescape(str) CGI.unescapeHTML(str) end