Sha256: 295f620c238e2da4d6950a4e0bddcc68450b42503e25625410a5d484a61ef430

Contents?: true

Size: 1.91 KB

Versions: 980

Compression:

Stored size: 1.91 KB

Contents

require 'cgi'

module Aws
  module Xml
    class ErrorHandler < Seahorse::Client::Handler

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

      private

      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 extract_error(body, context)
        [
          error_code(body, context),
          error_message(body),
        ]
      end

      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 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)
        if prefix = context.config.api.metadata['errorPrefix']
          error_code.sub(/^#{prefix}/, '')
        else
          error_code
        end
      end

      def error_message(body)
        if matches = body.match(/<Message>(.+?)<\/Message>/m)
          unescape(matches[1])
        else
          ''
        end
      end

      def unescape(str)
        CGI.unescapeHTML(str)
      end

    end
  end
end

Version data entries

980 entries across 980 versions & 2 rubygems

Version Path
aws-sdk-core-2.11.632 lib/aws-sdk-core/xml/error_handler.rb
aws-sdk-core-2.11.631 lib/aws-sdk-core/xml/error_handler.rb
aws-sdk-core-2.11.630 lib/aws-sdk-core/xml/error_handler.rb
aws-sdk-core-2.11.629 lib/aws-sdk-core/xml/error_handler.rb
aws-sdk-core-2.11.628 lib/aws-sdk-core/xml/error_handler.rb
aws-sdk-core-2.11.627 lib/aws-sdk-core/xml/error_handler.rb
aws-sdk-core-2.11.626 lib/aws-sdk-core/xml/error_handler.rb
aws-sdk-core-2.11.625 lib/aws-sdk-core/xml/error_handler.rb
aws-sdk-core-2.11.624 lib/aws-sdk-core/xml/error_handler.rb
aws-sdk-core-2.11.623 lib/aws-sdk-core/xml/error_handler.rb
aws-sdk-core-2.11.622 lib/aws-sdk-core/xml/error_handler.rb
aws-sdk-core-2.11.621 lib/aws-sdk-core/xml/error_handler.rb
aws-sdk-core-2.11.620 lib/aws-sdk-core/xml/error_handler.rb
aws-sdk-core-2.11.619 lib/aws-sdk-core/xml/error_handler.rb
aws-sdk-core-2.11.618 lib/aws-sdk-core/xml/error_handler.rb
aws-sdk-core-2.11.617 lib/aws-sdk-core/xml/error_handler.rb
aws-sdk-core-2.11.616 lib/aws-sdk-core/xml/error_handler.rb
aws-sdk-core-2.11.615 lib/aws-sdk-core/xml/error_handler.rb
aws-sdk-core-2.11.614 lib/aws-sdk-core/xml/error_handler.rb
aws-sdk-core-2.11.613 lib/aws-sdk-core/xml/error_handler.rb