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