'net/http' issues

I noticed a while back a few limitations in the Ruby net/http library.

First, the implementation bluntly ignores a crucial part of the HTTP
protocol, that is, the fact that a parameter may appear multiple times in a
request string. Using a hash behind the scenes, keyed by parameter name,
Ruby in effect forces a single occurrence of any individual parameter. To
bypass, I had to do:

module Net
  class HTTP
    def HTTP.querystring(params, sep = '&')
      if params.keys.length > 0
        p = params.keys.sort.collect do |k|
          q = params[k].collect { |v| CGI.escape(k) + '=' + CGI.escape(v) }
          q = [ CGI.escape(k) + '=' ] if params[k] == ""

  module HTTPHeader
    def set_form_data(params, sep = '&')
      self.body = Net::HTTP.querystring(params, sep)
      self.content_type = 'application/x-www-form-urlencoded'
    alias form_data= set_form_data

    # Client code.
    uri = URI.parse(server) + path
    http = Net::HTTP.new(uri.host, uri.port)
    uri = uri.to_s
    http.start do |http|
      http.read_timeout = @read_timeout
      if method == 'GET'
        if params.length > 0
          params = Net::HTTP.querystring(params)
          uri = "#{uri}?#{params}"
        q = Net::HTTP::Get.new(uri)
        q = Net::HTTP::Post.new(uri)
        q.form_data = params

Second, I had to overwrite HTTP.post_form_with_timeout for it to work
correctly. (I forget what the actual bug was, but while I'm at it)

module Net
  class HTTP
    def HTTP.post_form_with_timeout(url, params, read_timeout)
      req = Post.new(url.path)
      req.form_data = params
      req.basic_auth url.user, url.password if url.user
      new(url.host, url.port).start {|http|
        http.read_timeout = read_timeout

What is the status of these issues?

I used ruby184-16p3.exe on WinXP.