Class: MastercardCoreSdk::Exceptions::ErrorHandler

Inherits:
Object
  • Object
show all
Includes:
Converters
Defined in:
lib/mastercard_core_sdk/exceptions/error_handler.rb

Overview

Raises custom errors as per error response details.

Constant Summary collapse

ERR_DESC_NULL_RES =
"Received null response: "
ERR_DESC_EMPTY_RES =
"Received empty body: "
ERR_REASON_NULL_RES =
"NULL_RESPONSE"
ERR_REASON_EMPTY_BODY_RES =
"EMPTY_BODY"
ERR_REASON_INVALID_RES =
"INVALID_RESPONSE"
ERR_REASON_NT_TIMEOUT =
"NETWORK_TIMEOUT"
ERR_MSG_INVALID_RES =
"Received invalid response: ["
ERR_MSG_UNKN_RES =
"Unknown reason for failure, please check logs."
ERR_SRC_UNKN =
"Unknown"
ERR_NETWORK =
"NETWORK_ERROR"
ERR_UNKN_REASON =
"GENERAL_ERROR"
ERR_INTERNAL =
"INTERNAL_PROCESSING_ERROR"
SEP_COLON =
"]: "
ERR_MSG_RES_PARSE =
"Exception occurred during response parsing."
@@logger =
Logging.logger[self]

Instance Method Summary collapse

Instance Method Details

#handle_error(error_response) ⇒ Object

Raise custom error as per response error object.

Parameters:

  • error_response

    The Typheous::Response object containing error details.

Raises:



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/mastercard_core_sdk/exceptions/error_handler.rb', line 33

def handle_error(error_response)
  errors = nil
  response_body = error_response.response.response_body
  response_status_code = error_response.response_code

  if response_body.empty?
    errors = get_errors_object(ERR_DESC_EMPTY_RES, ERR_REASON_EMPTY_BODY_RES, ERR_SRC_UNKN)
    @@logger.error "400 #{ERR_SRC_UNKN}"
    raise SDKResponseError.new(:errors_object => errors, :status_code => 400)
    
  elsif response_status_code == 200
    # In some cases, response code is 200 and response body is empty.

    # Received response, but could not be matched to the appropriate response object.

    description = ERR_MSG_INVALID_RES + response_body + SEP_COLON
    errors = get_errors_object(description, ERR_REASON_INVALID_RES, ERR_SRC_UNKN)
    @@logger.error "400 #{ERR_MSG_INVALID_RES}"
    raise SDKResponseError.new(:errors_object => errors, :status_code => 400)
  end

  content_type = error_response.response.headers['Content-Type'] rescue nil
  
  begin
    converter = SDKConverterFactory.get_converter(content_type)
    errors = converter.response_body_converter(response_body, Errors)
    raise SDKResponseError.new(:errors_object => errors, :status_code => response_status_code)

  rescue SDKConversionError => err
    # For request and access token call if any require parameter missing in header server send response as encodedURL.

    # Below code set the received response as description and raise Errors object.

    if SDKConverterFactory.get_mime_sub_type(content_type).include?(CONTENT_TYPE_URL_ENCODED)
      description = response_body
    else
      description = err.message
    end

    case response_status_code
    when 400
      errors = get_errors_object(description, nil, "")
    when 502
      # Request timeout

      errors = get_errors_object(description, ERR_REASON_NT_TIMEOUT, ERR_NETWORK)
    else
      # Unknown error

      errors = get_errors_object(ERR_MSG_UNKN_RES, ERR_UNKN_REASON, ERR_SRC_UNKN)
    end
    @@logger.error "#{response_status_code}\n#{errors.error}"
    raise SDKResponseError.new(:errors_object => errors, :status_code => response_status_code)
  end
end