Class: HTTP::FormData::Urlencoded

Inherits:
Object
  • Object
show all
Includes:
Readable
Defined in:
lib/http/form_data/urlencoded.rb

Overview

application/x-www-form-urlencoded form data.

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Readable

#read, #rewind, #size, #to_s

Constructor Details

#initialize(data, encoder: nil) ⇒ Urlencoded

Returns a new instance of Urlencoded.

Parameters:

  • data (#to_h, Hash)

    form data key-value Hash



66
67
68
69
# File 'lib/http/form_data/urlencoded.rb', line 66

def initialize(data, encoder: nil)
  encoder ||= self.class.encoder
  @io = StringIO.new(encoder.call(FormData.ensure_hash(data)))
end

Class Method Details

.encoder#call

Returns form data encoder implementation. Default: URI.encode_www_form.

Returns:

  • (#call)

See Also:



60
61
62
# File 'lib/http/form_data/urlencoded.rb', line 60

def encoder
  @encoder ||= ::URI.method(:encode_www_form)
end

.encoder=(implementation) ⇒ void

This method returns an undefined value.

Set custom form data encoder implementation.

Examples:


module CustomFormDataEncoder
  UNESCAPED_CHARS = /[^a-z0-9\-\.\_\~]/i

  def self.escape(s)
    ::URI::DEFAULT_PARSER.escape(s.to_s, UNESCAPED_CHARS)
  end

  def self.call(data)
    parts = []

    data.each do |k, v|
      k = escape(k)

      if v.nil?
        parts << k
      elsif v.respond_to?(:to_ary)
        v.to_ary.each { |vv| parts << "#{k}=#{escape vv}" }
      else
        parts << "#{k}=#{escape v}"
      end
    end

    parts.join("&")
  end
end

HTTP::FormData::Urlencoded.encoder = CustomFormDataEncoder

Parameters:

  • implementation (#call)

Raises:

  • (ArgumentError)

    if implementation deos not responds to #call.



50
51
52
53
# File 'lib/http/form_data/urlencoded.rb', line 50

def encoder=(implementation)
  raise ArgumentError unless implementation.respond_to? :call
  @encoder = implementation
end

Instance Method Details

#content_typeString

Returns MIME type to be used for HTTP request Content-Type header.

Returns:

  • (String)


74
75
76
# File 'lib/http/form_data/urlencoded.rb', line 74

def content_type
  "application/x-www-form-urlencoded"
end