class HTTParty::Request::Body

Attributes

params[R]
query_string_normalizer[R]

Public Class Methods

new(params, query_string_normalizer: nil) click to toggle source
# File lib/httparty/request/body.rb, line 6
def initialize(params, query_string_normalizer: nil)
  @params = params
  @query_string_normalizer = query_string_normalizer
end

Public Instance Methods

boundary() click to toggle source
# File lib/httparty/request/body.rb, line 19
def boundary
  @boundary ||= MultipartBoundary.generate
end
call() click to toggle source
# File lib/httparty/request/body.rb, line 11
def call
  if params.respond_to?(:to_hash)
    multipart? ? generate_multipart : normalize_query(params)
  else
    params
  end
end
multipart?() click to toggle source
# File lib/httparty/request/body.rb, line 23
def multipart?
  params.respond_to?(:to_hash) && has_file?(params.to_hash)
end

Private Instance Methods

file?(object) click to toggle source
# File lib/httparty/request/body.rb, line 58
def file?(object)
  object.respond_to?(:path) && object.respond_to?(:read) # add memoization
end
generate_multipart() click to toggle source
# File lib/httparty/request/body.rb, line 29
def generate_multipart
  normalized_params = params.flat_map { |key, value| HashConversions.normalize_keys(key, value) }

  multipart = normalized_params.inject('') do |memo, (key, value)|
    memo += "--#{boundary}\r\n"
    memo += %(Content-Disposition: form-data; name="#{key}")
    memo += %(; filename="#{File.basename(value)}") if file?(value)
    memo += "\r\n"
    memo += "Content-Type: application/octet-stream\r\n" if file?(value)
    memo += "\r\n"
    memo += file?(value) ? value.read : value.to_s
    memo += "\r\n"
  end

  multipart += "--#{boundary}--\r\n"
end
has_file?(hash) click to toggle source
# File lib/httparty/request/body.rb, line 46
def has_file?(hash)
  hash.detect do |key, value|
    if value.respond_to?(:to_hash) || includes_hash?(value)
      has_file?(value)
    elsif value.respond_to?(:to_ary)
      value.any? { |e| file?(e) }
    else
      file?(value)
    end
  end
end
includes_hash?(object) click to toggle source
# File lib/httparty/request/body.rb, line 62
def includes_hash?(object)
  object.respond_to?(:to_ary) && object.any? { |e| e.respond_to?(:hash) }
end
normalize_query(query) click to toggle source
# File lib/httparty/request/body.rb, line 66
def normalize_query(query)
  if query_string_normalizer
    query_string_normalizer.call(query)
  else
    HashConversions.to_params(query)
  end
end