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

Creates a new Urlencoded form data instance

Examples:

Urlencoded.new({ "foo" => "bar" })

Parameters:

  • data (Enumerable, Hash, #to_h)

    form data key-value pairs

  • encoder (#call) (defaults to: nil)

    custom encoder implementation



148
149
150
151
# File 'lib/http/form_data/urlencoded.rb', line 148

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

Class Method Details

.encoder#call

Returns form data encoder implementation

Examples:

Urlencoded.encoder # => #<Method: DefaultEncoder.encode>

Returns:

  • (#call)

See Also:



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

def encoder
  @encoder || DefaultEncoder
end

.encoder=(implementation) ⇒ void

This method returns an undefined value.

Sets 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 does not respond to #call



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

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

  @encoder = implementation
end

Instance Method Details

#content_typeString

Returns MIME type for the Content-Type header

Examples:

urlencoded.content_type
# => "application/x-www-form-urlencoded"

Returns:

  • (String)


161
162
163
# File 'lib/http/form_data/urlencoded.rb', line 161

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