module Bundler::URI

def self.encode_www_form_component(str, enc=nil)

See Bundler::URI.decode_www_form_component, Bundler::URI.encode_www_form.

http://www.w3.org/TR/2013/CR-html5-20130806/forms.html#url-encoded-form-data.
This is an implementation of

If +enc+ is given, convert +str+ to the encoding before percent encoding.

(ASCII space) to + and converts others to %XX.
This method doesn't convert *, -, ., 0-9, A-Z, _, a-z, but does convert SP

Encodes given +str+ to URL-encoded form data.
def self.encode_www_form_component(str, enc=nil)
  str = str.to_s.dup
  if str.encoding != Encoding::ASCII_8BIT
    if enc && enc != Encoding::ASCII_8BIT
      str.encode!(Encoding::UTF_8, invalid: :replace, undef: :replace)
      str.encode!(enc, fallback: ->(x){"&##{x.ord};"})
    end
    str.force_encoding(Encoding::ASCII_8BIT)
  end
  str.gsub!(/[^*\-.0-9A-Z_a-z]/, TBLENCWWWCOMP_)
  str.force_encoding(Encoding::US_ASCII)
end