Sha256: 58fac2e3204d265ffd37b394ad86dd474cca0d8f7571c3f9c5b595ba49afb297

Contents?: true

Size: 1.8 KB

Versions: 100

Compression:

Stored size: 1.8 KB

Contents

# 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

Version data entries

100 entries across 100 versions & 1 rubygems

Version Path
aws-sdk-core-3.160.0 lib/aws-sdk-core/json/error_handler.rb
aws-sdk-core-3.159.0 lib/aws-sdk-core/json/error_handler.rb
aws-sdk-core-3.158.1 lib/aws-sdk-core/json/error_handler.rb
aws-sdk-core-3.158.0 lib/aws-sdk-core/json/error_handler.rb
aws-sdk-core-3.157.0 lib/aws-sdk-core/json/error_handler.rb
aws-sdk-core-3.156.0 lib/aws-sdk-core/json/error_handler.rb
aws-sdk-core-3.155.0 lib/aws-sdk-core/json/error_handler.rb
aws-sdk-core-3.154.0 lib/aws-sdk-core/json/error_handler.rb
aws-sdk-core-3.153.0 lib/aws-sdk-core/json/error_handler.rb
aws-sdk-core-3.152.0 lib/aws-sdk-core/json/error_handler.rb
aws-sdk-core-3.151.0 lib/aws-sdk-core/json/error_handler.rb
aws-sdk-core-3.150.0 lib/aws-sdk-core/json/error_handler.rb
aws-sdk-core-3.149.0 lib/aws-sdk-core/json/error_handler.rb
aws-sdk-core-3.148.0 lib/aws-sdk-core/json/error_handler.rb
aws-sdk-core-3.147.0 lib/aws-sdk-core/json/error_handler.rb
aws-sdk-core-3.146.0 lib/aws-sdk-core/json/error_handler.rb
aws-sdk-core-3.145.0 lib/aws-sdk-core/json/error_handler.rb
aws-sdk-core-3.144.0 lib/aws-sdk-core/json/error_handler.rb
aws-sdk-core-3.143.0 lib/aws-sdk-core/json/error_handler.rb
aws-sdk-core-3.142.0 lib/aws-sdk-core/json/error_handler.rb