# 'net/http' issues

**URL:** <https://rubytalk.org/t/net-http-issues/36660>\
**Category:** ruby-talk\
**Created:** [3 April 2007 18:51 UTC](https://rubytalk.org/t/net-http-issues/36660 "2007-04-03T18:51:00Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![Mihai\_Danila](https://avatars.discourse-cdn.com/v4/letter/m/bbce88/32.png) [@Mihai\_Danila](https://rubytalk.org/u/Mihai_Danila)\
**Post date:** [3 April 2007 18:51 UTC](https://rubytalk.org/t/net-http-issues/36660/1 "2007-04-03T18:51:00Z")

</div>

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  
&nbsp;&nbsp;class HTTP  
&nbsp;&nbsp;&nbsp;&nbsp;def HTTP.querystring(params, sep = '&')  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if params.keys.length \> 0  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = params.keys.sort.collect do |k|  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q = params[k].collect { |v| CGI.escape(k) + '=' + CGI.escape(v) }  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q = [CGI.escape(k) + '='] if params[k] == ""  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q.join(sep)  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.join(sep)  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nil  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;end

&nbsp;&nbsp;module HTTPHeader  
&nbsp;&nbsp;&nbsp;&nbsp;def set\_form\_data(params, sep = '&')  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.body = Net::HTTP.querystring(params, sep)  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.content\_type = 'application/x-www-form-urlencoded'  
&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;&nbsp;alias form\_data= set\_form\_data  
&nbsp;&nbsp;end  
end

&nbsp;&nbsp;&nbsp;&nbsp;# Client code.  
&nbsp;&nbsp;&nbsp;&nbsp;uri = URI.parse(server) + path  
&nbsp;&nbsp;&nbsp;&nbsp;http = Net::HTTP.new(uri.host, uri.port)  
&nbsp;&nbsp;&nbsp;&nbsp;uri = uri.to\_s  
&nbsp;&nbsp;&nbsp;&nbsp;http.start do |http|  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http.read\_timeout = @read\_timeout  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if method == 'GET'  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if params.length \> 0  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;params = Net::HTTP.querystring(params)  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uri = "#{uri}?#{params}"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q = Net::HTTP::Get.new(uri)  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q = Net::HTTP::Post.new(uri)  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q.form\_data = params  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end

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  
&nbsp;&nbsp;class HTTP  
&nbsp;&nbsp;&nbsp;&nbsp;def HTTP.post\_form\_with\_timeout(url, params, read\_timeout)  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req = Post.new(url.path)  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req.form\_data = params  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req.basic\_auth url.user, url.password if url.user  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new(url.host, url.port).start {|http|  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http.read\_timeout = read\_timeout  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http.request(req)  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}  
&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;end  
end

What is the status of these issues?

I used ruby184-16p3.exe on WinXP.

Mihai
