Sha256: 53c8d6c66f8d956954591d6ba220a0323cc7a5f8c24f3cddeb1153050610190d

Contents?: true

Size: 1.45 KB

Versions: 1

Compression:

Stored size: 1.45 KB

Contents

# frozen_string_literal: true

require 'api_signature'
require 'rack'

module ApiProxy
  class RequestOptionsBuilder
    attr_reader :env, :config

    delegate :api_key,
             :api_secret,
             :api_host,
             :api_port,
             :api_prefix,
             :url_scheme,
             :request_starts_with, to: :config

    def initialize(env, config)
      @env = env
      @config = config
    end

    def options
      { headers: headers, body: body, format: :json }
    end

    def url
      URI::Generic.build(scheme: url_scheme, host: api_host, port: api_port, path: path)
    end

    def request_method
      request.request_method.downcase
    end

    private

    def body
      request.params.reject { |key, _value| config.reject_params.include?(key) }
    end

    def request
      @request ||= Rack::Request.new(env)
    end

    def headers
      custom_headers = config.custom_headers.call(env)

      signature_builder.headers.merge(custom_headers)
    end

    def signature_builder
      @signature_builder ||= ApiSignature::Builder.new(request_params)
    end

    def request_params
      {
        access_key: api_key,
        secret: api_secret,
        request_method: request_method,
        scheme: url_scheme,
        host: api_host,
        port: api_port,
        path: path
      }
    end

    def path
      request_path = request.path.gsub(request_starts_with, '')

      File.join(api_prefix, request_path)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
api_proxy-0.1.3 lib/api_proxy/request_options_builder.rb