Sha256: 80b71d9502575b85be6f3ec61af54d15d9a14ed93e12158e1c0778699626e186

Contents?: true

Size: 1.4 KB

Versions: 2

Compression:

Stored size: 1.4 KB

Contents

module Amsi
  module Validator
    # Ensure there is no 'Fault' node in the response body
    class RequestFault
      FaultDetails = Struct.new(:custom_message, :exception_message, :log_id)
      private_constant :FaultDetails

      # @param response [Hash<String, Object>] the XML response parsed into a
      #   Hash
      def initialize(response)
        @response = response
      end

      # @raise [Amsi::Error::RequestFault] if the response has a fault
      def validate!
        return unless error?
        raise Error::RequestFault.new(error_message, fault_code, details)
      end

      private

      attr_reader :response

      def fault
        response['soap:Envelope']['soap:Body']['soap:Fault']
      end

      def details
        return unless fault['detail']
        app_fault = fault['detail'].values.first
        FaultDetails.new(
          app_fault['CustomMessage'],
          app_fault['ExceptionMessage'],
          app_fault['LogId']
        )
      end

      def error?
        !fault.nil?
      end

      def fault_code
        return unless fault
        code = fault['faultcode']
        code = code['__content__'] if code.is_a?(Hash)
        code.strip
      end

      def error_message
        return unless fault
        fault_string = fault['faultstring']
        fault_string = fault_string['__content__'] if fault_string.is_a?(Hash)
        fault_string.strip
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
amsi-1.0.1 lib/amsi/validator/request_fault.rb
amsi-1.0.0 lib/amsi/validator/request_fault.rb