This class represents a form and is used to send a payload in the request body via POST/PUT. It handles multipart forms, too.
@api private
Frees form in libcurl if necessary.
@example Free the form
Form.finalizer(form)
@param [ Form ] form The form to free.
# File lib/ethon/easy/form.rb, line 36 def self.finalizer(form) proc { Curl.formfree(form.first) if form.multipart? } end
Return a pointer to the first form element in libcurl.
@example Return the first form element.
form.first
@return [ FFI::Pointer ] The first element.
# File lib/ethon/easy/form.rb, line 46 def first @first ||= FFI::MemoryPointer.new(:pointer) end
Return a pointer to the last form element in libcurl.
@example Return the last form element.
form.last
@return [ FFI::Pointer ] The last element.
# File lib/ethon/easy/form.rb, line 56 def last @last ||= FFI::MemoryPointer.new(:pointer) end
Add form elements to libcurl.
@example Add form to libcurl.
form.materialize
# File lib/ethon/easy/form.rb, line 75 def materialize query_pairs.each { |pair| form_add(pair.first.to_s, pair.last) } end
Return if form is multipart. The form is multipart, when it contains a file.
@example Return if form is multipart.
form.multipart?
@return [ Boolean ] True if form is multipart, else false.
# File lib/ethon/easy/form.rb, line 67 def multipart? query_pairs.any?{|pair| pair.respond_to?(:last) && pair.last.is_a?(Array)} end
# File lib/ethon/easy/form.rb, line 81 def form_add(name, content) case content when Array Curl.formadd(first, last, :form_option, :copyname, :pointer, name, :form_option, :namelength, :long, name.bytesize, :form_option, :file, :string, content[2], :form_option, :filename, :string, content[0], :form_option, :contenttype, :string, content[1], :form_option, :end ) else Curl.formadd(first, last, :form_option, :copyname, :pointer, name, :form_option, :namelength, :long, name.bytesize, :form_option, :copycontents, :pointer, content, :form_option, :contentslength, :long, content ? content.bytesize : 0, :form_option, :end ) end end