module Stripe::APIOperations::Request::ClassMethods

def error_on_invalid_params(params)

def error_on_invalid_params(params)
 if params.nil? || params.is_a?(Hash)
ArgumentError,
"request params should be either a Hash or nil " \
  "(was a #{params.class})"

def error_on_non_string_user_opts(opts)

def error_on_non_string_user_opts(opts)
OPTS_USER_SPECIFIED.each do |opt|
 unless opts.key?(opt)
= opts[opt]
 if val.nil?
 if val.is_a?(String)
e ArgumentError,
  "request option '#{opt}' should be a string value " \
    "(was a #{val.class})"

def execute_resource_request(method, url,

def execute_resource_request(method, url,
                             params = {}, opts = {})
  execute_resource_request_internal(
    :execute_request, method, url, params, opts
  )
end

def execute_resource_request_internal(client_request_method_sym,

def execute_resource_request_internal(client_request_method_sym,
                                      method, url,
                                      params, opts,
                                      &read_body_chunk_block)
 ||= {}
on_invalid_params(params)
n_opts_in_params(params)
 Util.normalize_opts(opts)
on_non_string_user_opts(opts)
client] ||= StripeClient.active_client
s = opts.clone
y = headers.delete(:api_key)
se = headers.delete(:api_base)
 = headers.delete(:client)
de = headers.delete(:api_mode)
me all remaining opts must be headers
opts[:api_key] = client.send(
nt_request_method_sym,
od, url,
base: api_base, api_key: api_key,
ers: headers, params: params,
mode: api_mode,
d_body_chunk_block
#select returns an array before 1.9
o_persist = {}
ach do |k, v|
_to_persist[k] = v if Util::OPTS_PERSISTABLE.include?(k)
 opts_to_persist]

def execute_resource_request_stream(method, url,

def execute_resource_request_stream(method, url,
                                    params = {}, opts = {},
                                    &read_body_chunk_block)
  execute_resource_request_internal(
    :execute_request_stream,
    method,
    url,
    params,
    opts,
    &read_body_chunk_block
  )
end

def request_stripe_object(method:, path:, params:, opts: {})

def request_stripe_object(method:, path:, params:, opts: {})
opts = execute_resource_request(method, path, params, opts)
onvert_to_stripe_object_with_params(resp.data, params, opts)

def warn_on_opts_in_params(params)

def warn_on_opts_in_params(params)
OPTS_USER_SPECIFIED.each do |opt|
arams.key?(opt)
rn("WARNING: '#{opt}' should be in opts instead of params.")