class HTTParty::Request::Body
Constants
- 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 76 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 85 def content_type(object) return object.content_type if object.respond_to?(:content_type) mime = MIME::Types.type_for(object.path) mime.empty? ? 'application/octet-stream' : mime[0].content_type end
file?(object)
click to toggle source
# File lib/httparty/request/body.rb, line 64 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 91 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 35 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)}") 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 54 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 68 def normalize_query(query) if query_string_normalizer query_string_normalizer.call(query) else HashConversions.to_params(query) end end