Sha256: b4b30f053ae55092d9232c05b3aea7168ddfeed7d66331c0d955714597f2c550

Contents?: true

Size: 1.21 KB

Versions: 1

Compression:

Stored size: 1.21 KB

Contents

class Ragoon::Client
  attr_reader :endpoint, :response

  def initialize(endpoint, options)
    @endpoint = endpoint
    @options = options
  end

  def request(action_name, body_node)
    retry_count = @options[:retry].to_i

    retry_count.times do
      begin
        request_once(action_name, body_node)
        return
      rescue Ragoon::Error => e
        unless e.message.include?('指定された画面はアクセスできません。')
          raise e
        end
        sleep(0.5)
      end
    end
    raise Ragoon::Error.new("試行回数が#{retry_count}回を超えたので終了しました。")
  end

  def result_set
    @result_set ||= Nokogiri::XML.parse(response.body)
  end

  def reset
    @result_set = nil
  end

  private

  def request_once(action_name, body_node)
    reset
    @action_name = action_name
    @body_node = body_node
    @response = RestClient.post(endpoint, Ragoon::XML.render(action_name, body_node, @options))
  ensure
    raise_error unless result_set.xpath('//soap:Fault').empty?
  end

  def raise_error
    raise Ragoon::Error.new(
      result_set.xpath('//soap:Reason').text.strip,
      result_set.xpath('//soap:Detail/*').map { |c| [c.name, c.text.strip] }.to_h
    )
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
ragoon-1.1.0 lib/ragoon/client.rb