class HTTParty::Request::Body

Constants

MULTIPART_FORM_DATA_REPLACEMENT_TABLE

html.spec.whatwg.org/#multipart-form-data

NEWLINE

Attributes

force_multipart[R]
params[R]
query_string_normalizer[R]

Public Class Methods

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

Public Instance Methods

boundary() click to toggle source
# File lib/httparty/request/body.rb, line 25
def boundary
  @boundary ||= MultipartBoundary.generate
end
call() click to toggle source
# File lib/httparty/request/body.rb, line 17
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 29
def multipart?
  params.respond_to?(:to_hash) && (force_multipart || has_file?(params))
end

Private Instance Methods

content_body(object) click to toggle source
# File lib/httparty/request/body.rb, line 83
def content_body(object)
  if file?(object)
    object = (file = object).read
    file.rewind if file.respond_to?(:rewind)
  end

  object.to_s
end
content_type(object) click to toggle source
# File lib/httparty/request/body.rb, line 92
def content_type(object)
  return object.content_type if object.respond_to?(:content_type)
  require 'mini_mime'
  mime = MiniMime.lookup_by_filename(object.path)
  mime ? mime.content_type : 'application/octet-stream'
end
file?(object) click to toggle source
# File lib/httparty/request/body.rb, line 71
def file?(object)
  object.respond_to?(:path) && object.respond_to?(:read)
end
file_name(object) click to toggle source
# File lib/httparty/request/body.rb, line 99
def file_name(object)
  object.respond_to?(:original_filename) ? object.original_filename : File.basename(object.path)
end
generate_multipart() click to toggle source
# File lib/httparty/request/body.rb, line 42
def generate_multipart
  normalized_params = params.flat_map { |key, value| HashConversions.normalize_keys(key, value) }

  multipart = normalized_params.inject(''.dup) do |memo, (key, value)|
    memo << "--#{boundary}#{NEWLINE}"
    memo << %(Content-Disposition: form-data; name="#{key}")
    # value.path is used to support ActionDispatch::Http::UploadedFile
    # https://github.com/jnunemaker/httparty/pull/585
    memo << %(; filename="#{file_name(value).gsub(/["\r\n]/, MULTIPART_FORM_DATA_REPLACEMENT_TABLE)}") if file?(value)
    memo << NEWLINE
    memo << "Content-Type: #{content_type(value)}#{NEWLINE}" if file?(value)
    memo << NEWLINE
    memo << content_body(value)
    memo << NEWLINE
  end

  multipart << "--#{boundary}--#{NEWLINE}"
end
has_file?(value) click to toggle source
# File lib/httparty/request/body.rb, line 61
def has_file?(value)
  if value.respond_to?(:to_hash)
    value.to_hash.any? { |_, v| has_file?(v) }
  elsif value.respond_to?(:to_ary)
    value.to_ary.any? { |v| has_file?(v) }
  else
    file?(value)
  end
end
normalize_query(query) click to toggle source
# File lib/httparty/request/body.rb, line 75
def normalize_query(query)
  if query_string_normalizer
    query_string_normalizer.call(query)
  else
    HashConversions.to_params(query)
  end
end