Multiple Parameters with Net:Http

Is there a way to pass in 2 parameters with the same name to the
Net::Http client in ruby?
It's using a map right now, and it only stores one of the values.
Is this a bug in the Http client implementation?
The http spec allows you to pass in multiple parameters with the same
name.

def get_data(data, in_only='Y')
    one = Time.new
    url = URI.parse('http://127.0.0.1/ec/data.xml')
    req = Net::HTTP::Post.new(url.path)
    req.basic_auth 'user', 'pass'
    req.set_form_data({'test'=>1, 'test'=>2})
    res = Net::HTTP.new(url.host, url.port).start {|http|
http.request(req) }
    case res
    when Net::HTTPSuccess, Net::HTTPRedirection
      xml = res.body
    else
      res.error!
    end
end

Without trying I'd assume that it should work like this:

req.set_form_data({'test'=>[1, 2]})

btw, you can leave out the curlys

req.set_form_data('test'=>[1, 2])

Kind regards

  robert

···

On 19.04.2007 23:53, scott.archer@gmail.com wrote:

Is there a way to pass in 2 parameters with the same name to the
Net::Http client in ruby?
It's using a map right now, and it only stores one of the values.
Is this a bug in the Http client implementation?
The http spec allows you to pass in multiple parameters with the same
name.

def get_data(data, in_only='Y')
    one = Time.new
    url = URI.parse('http://127.0.0.1/ec/data.xml'\)
    req = Net::HTTP::Post.new(url.path)
    req.basic_auth 'user', 'pass'
    req.set_form_data({'test'=>1, 'test'=>2})
    res = Net::HTTP.new(url.host, url.port).start {|http|
http.request(req) }
    case res
    when Net::HTTPSuccess, Net::HTTPRedirection
      xml = res.body
    else
      res.error!
    end
end

Here is the ruby program I'm trying to run, and the Java Program that
explains what I am trying to do a little better.

require 'net/http'
    url = URI.parse("http://localhost/test/scott.jsp"\)
    req = Net::HTTP::Post.new(url.path)
    req.set_form_data({'test'=>['1','2']})
    res = Net::HTTP.new(url.host, url.port).start {|http|
http.request(req) }
    case res
    when Net::HTTPSuccess, Net::HTTPRedirection
      xml = res.body
    else
      res.error!
    end
    puts xml

Here is the java jsp i'm testing it with.

<%
StringBuffer sb = new StringBuffer();
String values = request.getParameterValues("test");
sb.append(values.length + " ");
for(int i=0;i<values.length;i++)
  sb.append(values[i] + " ");
%>
<%=sb.toString()%>

I would expect values to be an array with 2 items in it.

When I run the program I get back a single value with "12" in it.
instead of 2 separate values with "1" and "2" in them.

The query string in the browser would look like "http://localhost/test/
scott.jsp?test=1&test=2"
But i'd like to do that in ruby with a post request.

Thanks for the help.

···

On Apr 20, 4:00 am, Robert Klemme <shortcut...@googlemail.com> wrote:

On 19.04.2007 23:53, scott.arc...@gmail.com wrote:

> Is there a way to pass in 2 parameters with the same name to the
> Net::Http client in ruby?
> It's using a map right now, and it only stores one of the values.
> Is this a bug in the Http client implementation?
> The http spec allows you to pass in multiple parameters with the same
> name.

> def get_data(data, in_only='Y')
> one = Time.new
> url = URI.parse('http://127.0.0.1/ec/data.xml&#39;\)
> req = Net::HTTP::Post.new(url.path)
> req.basic_auth 'user', 'pass'
> req.set_form_data({'test'=>1, 'test'=>2})
> res = Net::HTTP.new(url.host, url.port).start {|http|
> http.request(req) }
> case res
> when Net::HTTPSuccess, Net::HTTPRedirection
> xml = res.body
> else
> res.error!
> end
> end

Without trying I'd assume that it should work like this:

req.set_form_data({'test'=>[1, 2]})

btw, you can leave out the curlys

req.set_form_data('test'=>[1, 2])

Kind regards

        robert

First I'd make sure your JSP actually behaves as expected, i.e. detects multiple values properly. For example, you could do something like this

<%= Arrays.asList( request.getParameterValues("test") ) %>

This should print a comma separated and bracket enclosed list.

Only then I'd continue to work on the Ruby side.

  robert

···

On 25.04.2007 00:05, scott.archer@gmail.com wrote:

On Apr 20, 4:00 am, Robert Klemme <shortcut...@googlemail.com> wrote:

On 19.04.2007 23:53, scott.arc...@gmail.com wrote:

Is there a way to pass in 2 parameters with the same name to the
Net::Http client in ruby?
It's using a map right now, and it only stores one of the values.
Is this a bug in the Http client implementation?
The http spec allows you to pass in multiple parameters with the same
name.
def get_data(data, in_only='Y')
    one = Time.new
    url = URI.parse('http://127.0.0.1/ec/data.xml&#39;\)
    req = Net::HTTP::Post.new(url.path)
    req.basic_auth 'user', 'pass'
    req.set_form_data({'test'=>1, 'test'=>2})
    res = Net::HTTP.new(url.host, url.port).start {|http|
http.request(req) }
    case res
    when Net::HTTPSuccess, Net::HTTPRedirection
      xml = res.body
    else
      res.error!
    end
end

Without trying I'd assume that it should work like this:

req.set_form_data({'test'=>[1, 2]})

btw, you can leave out the curlys

req.set_form_data('test'=>[1, 2])

Kind regards

        robert

Here is the ruby program I'm trying to run, and the Java Program that
explains what I am trying to do a little better.

require 'net/http'
    url = URI.parse("http://localhost/test/scott.jsp&quot;\)
    req = Net::HTTP::Post.new(url.path)
    req.set_form_data({'test'=>['1','2']})
    res = Net::HTTP.new(url.host, url.port).start {|http|
http.request(req) }
    case res
    when Net::HTTPSuccess, Net::HTTPRedirection
      xml = res.body
    else
      res.error!
    end
    puts xml

Here is the java jsp i'm testing it with.

<%
StringBuffer sb = new StringBuffer();
String values = request.getParameterValues("test");
sb.append(values.length + " ");
for(int i=0;i<values.length;i++)
  sb.append(values[i] + " ");
%>
<%=sb.toString()%>

I would expect values to be an array with 2 items in it.

When I run the program I get back a single value with "12" in it.
instead of 2 separate values with "1" and "2" in them.

The query string in the browser would look like "http://localhost/test/
scott.jsp?test=1&test=2"
But i'd like to do that in ruby with a post request.

Thanks for the help.