Sha256: 250f5f957428f67355f23b1224125606d114c3ec62aaa97cc1dd7fb865638f1c

Contents?: true

Size: 1.84 KB

Versions: 2

Compression:

Stored size: 1.84 KB

Contents

module Paysio
  class Client
    class << self
      def request(method, path, params = {}, headers = {})
        unless Paysio.api_key
          raise Paysio::Exceptions::NotAuthorized, "Please specify Paysio.api_key"
        end
        headers = {
          :user_agent => "Pays.io RubyClient/#{Paysio::VERSION}",
          :content_type => 'application/x-www-form-urlencoded'
        }.merge(headers)
        opts = {
          :url => Paysio.api_url(path),
          :method => method,
          :timeout => 80,
          :headers => headers
        }

        # build params
        case method.to_s.downcase.to_sym
        when :get, :head, :delete
          opts[:url] += "?#{stringify_params(params)}" if params.count > 0
        else
          opts[:payload] = stringify_params(params)
        end
        response = self.execute(opts)
        body, code = response.body, response.code
        begin
          resp = Paysio::JSON.decode(body)
        rescue Oj::ParseError
          raise Paysio::Exceptions::APIError.new("Invalid response object from API: #{body.inspect} (#{code})", code, body)
        end
        Paysio::Resource.build_from(resp, response.headers[:location])
      end

      def execute(opts)
        RestClient::Request.execute(opts)
      end

      def uri_escape(key)
        URI.escape(key.to_s, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
      end

      def flatten_params(params, parent_key = nil)
        result = []
        params.each do |key, value|
          flatten_key = parent_key ? "#{parent_key}[#{uri_escape(key)}]" : uri_escape(key)
          result += value.is_a?(Hash) ? flatten_params(value, flatten_key) : [[flatten_key, value]]
        end
        result
      end

      def stringify_params(params)
        flatten_params(params).collect{|key, value| "#{key}=#{uri_escape(value)}"}.join('&')
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
paysio-1.0.5 lib/paysio/client.rb
paysio-1.0.4 lib/paysio/client.rb