class Dacom::Client

Attributes

http[R]
reported[R]
response[R]
rolled_back[R]

Public Class Methods

new(config: Config.new, net_klass: Net::HTTP, res_klass: Response, logger: Logger.new(nil), time: Time.now, uuid: SecureRandom.uuid) click to toggle source
# File lib/dacom/client.rb, line 23
def initialize(config: Config.new, net_klass: Net::HTTP, res_klass: Response, logger: Logger.new(nil), time: Time.now, uuid: SecureRandom.uuid)
  @config = config
  @net_klass = net_klass
  @res_klass = res_klass
  @logger = logger
  @time = time
  @uuid = uuid
  @auto_rollback = @config.auto_rollback
  @report_error = @config.report_error
  @endpoint = @config.url
end

Public Instance Methods

form_data() click to toggle source
# File lib/dacom/client.rb, line 52
def form_data
  @form_data ||= { "LGD_TXID" => tx_id, "LGD_AUTHCODE" => auth_code, "LGD_MID" => merchant_id }
end
set(k, v) click to toggle source
# File lib/dacom/client.rb, line 48
def set(k, v)
  form_data[k] = v
end
tx(&b) click to toggle source
# File lib/dacom/client.rb, line 35
def tx(&b)
  json = Thread.new { do_request(&b) }.value
  data = parse_response(json)
  @response = @res_klass.new(data).tap do |res|
    @logger.info("RESPONSE: #{res}")
  end
rescue ResponseError => e
  @logger.error("rescue from ResponseError - #{e.message} \n #{e.backtrace.join("\n")}")
  rollback
  report
  @response
end

Private Instance Methods

auth_code() click to toggle source
# File lib/dacom/client.rb, line 64
        def auth_code
  sha = OpenSSL::Digest::SHA1.new
  sha.update("#{tx_id}#{merchant_key}").to_s
end
do_request() { |req, res| ... } click to toggle source
# File lib/dacom/client.rb, line 111
        def do_request
  req, @http = prepare_http_client
  @logger.info("REQUEST: endpoint=#{@endpoint}; form_data=#{form_data.inspect}")
  res = http.request(req)
  yield(req, res) if block_given?
  set_http_code(res.code) 
  res.body
rescue Timeout::Error => e
  set_response_and_raise(LGD_ERR_TIMEDOUT, e)
rescue SocketError => e
  set_response_and_raise(LGD_ERR_RESOLVE_HOST, e)
rescue OpenSSL::SSL::SSLError => e
  set_response_and_raise(LGD_ERR_SSL, e)
rescue HTTPCodeError => e
  set_response_and_raise("#{30000+@http_code}", e)
rescue StandardError => e
  set_response_and_raise(LGD_ERR_CONNECT, e)
end
http_code_error?() click to toggle source
# File lib/dacom/client.rb, line 154
        def http_code_error?
  (500...599) === @http_code.to_i
end
http_code_valid?() click to toggle source
# File lib/dacom/client.rb, line 150
        def http_code_valid?
  (200...300) === @http_code.to_i
end
parse_response(json) click to toggle source
# File lib/dacom/client.rb, line 99
        def parse_response(json)
  JSON.parse(json)
rescue JSON::ParserError => e
  set_response_and_raise(LGD_ERR_JSON_DECODE, e)
end
prepare_http_client() click to toggle source
# File lib/dacom/client.rb, line 130
        def prepare_http_client
  url = URI.parse(@endpoint)
  req = @net_klass.const_get("Post").new(url.path)
  req["User-Agent"] = LGD_USER_AGENT
  req.set_form_data(form_data)
  http = @net_klass.new(url.host, url.port)
  http.open_timeout = @config.timeout
  http.read_timeout = @config.timeout
  if url.scheme == "https"
    http.use_ssl = true
    http.verify_mode = OpenSSL::SSL::VERIFY_PEER if verify_peer?
  end
  [req, http]
end
report() click to toggle source
# File lib/dacom/client.rb, line 88
        def report
  return unless @report_error
  ReportClient.new(config: @config,
                   logger: @logger,
                   net_klass: @net_klass,
                   res_klass: @res_klass,
                   status: @response.code,
                   message: @response.message).tx
  @reported = true
end
rollback() click to toggle source
# File lib/dacom/client.rb, line 77
        def rollback
  return unless @auto_rollback
  RollbackClient.new(config: @config, 
                     logger: @logger,
                     net_klass: @net_klass,
                     res_klass: @res_klass,
                     parent_id: tx_id, 
                     reason: rollback_reason).tx
  @rolled_back = true
end
rollback_reason() click to toggle source
# File lib/dacom/client.rb, line 105
        def rollback_reason
  return "Timeout" if @response.code == LGD_ERR_TIMEDOUT
  return "HTTP #{@http_code}" if http_code_error?
  @response.message
end
set_http_code(code) click to toggle source
# File lib/dacom/client.rb, line 145
        def set_http_code(code)
  @http_code = code.to_i
  fail HTTPCodeError, "invalid HTTP code #{code}" unless http_code_valid?
end
set_response_and_raise(code, e) click to toggle source
# File lib/dacom/client.rb, line 158
        def set_response_and_raise(code, e)
  @response = @res_klass.new(code: code, message: e.message)
  @logger.info("RESPONSE: #{@response}")
  @logger.error("rescue from #{e.class} - #{e.message} \n #{e.backtrace.join("\n")}")
  raise ResponseError, e.message
end
timestamp() click to toggle source
# File lib/dacom/client.rb, line 73
        def timestamp
  @time.utc.strftime("%Y%m%d%H%M%S")
end
tx_header() click to toggle source
# File lib/dacom/client.rb, line 69
        def tx_header
  "#{merchant_id}-#{server_id}#{timestamp}"
end
tx_id() click to toggle source
# File lib/dacom/client.rb, line 56
        def tx_id
  @tx_id ||= begin
               sha = OpenSSL::Digest::SHA1.new
               sha.update(@uuid)
               "#{tx_header}#{sha}"
             end
end