Sha256: 177d411f75c31ce6539f70a8749353fa726260afa30f4ea38bd22efc7790114e

Contents?: true

Size: 1.96 KB

Versions: 2

Compression:

Stored size: 1.96 KB

Contents

module CurrencyCloud
  class RequestHandler
    attr_reader :session

    def initialize(session = CurrencyCloud.session)
      @session = session
    end

    def get(route, params = {}, opts = {})
      retry_authenticate('get', route, params, opts) do |url, new_params, options|
        options[:query] = new_params
        HTTParty.get(url, options)
      end
    end

    def post(route, params = {}, opts = {})
      retry_authenticate('post', route, params, opts) do |url, new_params, options|
        options[:body] = new_params
        HTTParty.post(url, options)
      end
    end

    private

    def retry_authenticate(verb, route, params, opts)
      should_retry = opts[:should_retry].nil? ? true : opts.delete(:should_retry)

      params = process_params(params)
      full_url = build_url(route)

      response = nil
      retry_count = should_retry ? 0 : 2
      while retry_count < 3
        options = process_options(opts)
        response = yield(full_url, params, options)
        break unless response.code == 401 && should_retry
        session.reauthenticate
        retry_count += 1
      end

      response_handler = CurrencyCloud::ResponseHandler.new(verb, full_url, params, response)
      response_handler.process
    rescue ApiError, UnexpectedError
      raise
    rescue => e
      raise UnexpectedError.new(verb, full_url, params, e)
    end

    def process_options(opts)
      options = { headers: headers }
      # options[:debug_output] = $stdout
      options.merge(opts)
      # options
    end

    def process_params(params)
      if session && session.on_behalf_of && CurrencyCloud::UUID_REGEX.match(session.on_behalf_of)
        params[:on_behalf_of] = session.on_behalf_of
      end

      params
    end

    def headers
      headers = {}
      headers['X-Auth-Token'] = session.token if session && session.token
      headers
    end

    def build_url(route)
      "#{session.environment_url}/#{CurrencyCloud::API_VERSION}/" + route
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
currency_cloud-0.8.2 lib/currency_cloud/request_handler.rb
currency_cloud-0.8.0 lib/currency_cloud/request_handler.rb