class Fog::VcloudDirector::Errors::ServiceError

Attributes

major_error_code[R]
minor_error_code[R]
stack_trace[R]
status_code[R]
vendor_specific_error_code[R]

Public Class Methods

slurp(error, service=nil) click to toggle source
Calls superclass method
# File lib/fog/vcloud_director/core.rb, line 16
def self.slurp(error, service=nil)
  major_error_code = nil
  message = nil
  minor_error_code = nil
  stack_trace = nil
  status_code = nil
  vendor_specific_error_code = nil

  if error.response
    status_code = error.response.status
    unless error.response.body.empty?
      _, media_type = error.response.headers.find {|k,v| k.downcase == 'content-type'}
      if media_type =~ /vnd\.vmware\.vcloud\.error\+xml/i
        begin
          document = Fog::ToHashDocument.new
          Nokogiri::XML::SAX::Parser.new(document).parse_memory(error.response.body)
          major_error_code = document.body[:majorErrorCode]
          message = document.body[:message]
          minor_error_code = document.body[:minorErrorCode]
          stack_trace = document.body[:stackTrace]
          vendor_specific_error_code = document.body[:vendorSpecificErrorCode]
        rescue => e
          Fog::Logger.warning("Received exception '#{e}' while decoding>> #{error.response.body}")
          message = error.response.body
        end
      else
        message = CGI::unescapeHTML(error.response.body)
      end
    end
  end

  new_error = super(error, message)
  new_error.instance_variable_set(:@major_error_code, major_error_code)
  new_error.instance_variable_set(:@minor_error_code, minor_error_code)
  new_error.instance_variable_set(:@stack_trace, stack_trace)
  new_error.instance_variable_set(:@status_code, status_code)
  new_error.instance_variable_set(:@vendor_specific_error_code, vendor_specific_error_code)
  new_error
end