Method: Addressable::URI.form_encode

Defined in:
lib/addressable/uri.rb

.form_encode(form_values, sort = false) ⇒ String

Encodes a set of key/value pairs according to the rules for the application/x-www-form-urlencoded MIME type.

Parameters:

  • form_values (#to_hash, #to_ary)

    The form values to encode.

  • sort (TrueClass, FalseClass) (defaults to: false)

    Sort the key/value pairs prior to encoding. Defaults to false.

Returns:

  • (String)

    The encoded value.



576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
# File 'lib/addressable/uri.rb', line 576

def self.form_encode(form_values, sort=false)
  if form_values.respond_to?(:to_hash)
    form_values = form_values.to_hash.to_a
  elsif form_values.respond_to?(:to_ary)
    form_values = form_values.to_ary
  else
    raise TypeError, "Can't convert #{form_values.class} into Array."
  end
  form_values = form_values.map do |(key, value)|
    [key.to_s, value.to_s]
  end
  if sort
    # Useful for OAuth and optimizing caching systems
    form_values = form_values.sort
  end
  escaped_form_values = form_values.map do |(key, value)|
    # Line breaks are CRLF pairs
    [
      self.encode_component(
        key.gsub(/(\r\n|\n|\r)/, "\r\n"),
        CharacterClasses::UNRESERVED
      ).gsub("%20", "+"),
      self.encode_component(
        value.gsub(/(\r\n|\n|\r)/, "\r\n"),
        CharacterClasses::UNRESERVED
      ).gsub("%20", "+")
    ]
  end
  return (escaped_form_values.map do |(key, value)|
    "#{key}=#{value}"
  end).join("&")
end