Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ruby Net::HTTP - Stop automatically escaping quotes?

I have the following code:

    http = Net::HTTP.new("www.something.com", 80)
    http.set_debug_output($stdout)
    http.post("/blah", "something", {'random-parameter' => 'value1="something",value2="somethingelse"'})

Then when I read the output from stdout, it looks like this:

<- "POST /blah HTTP/1.1\r\nAccept: */*\r\nContent-Type: application/x-www-form-urlencoded\r\nConnection: close\r\nrandom-parameter: value1=\"something\",value2=\"somethingelse\"\r\nContent-Length: 9\r\nHost: www.something.com\r\n\r\n"
<- "something"

with the quotes being escaped. The problem is that the slashes seem to be sent to the server, which doesn't like that. I'm getting an error that says

Unknown value for random-parameter in header: {value1=\\\"something\\\"value2=\\\"somethingelse\\\"}

So my question is, is there a way to tell Net::HTTP to not insert those slashes, or strip them out before sending the header?

Clarifications:

I'm using Ruby 1.8.7 with Rails 2.0.2.

I think it may be Rails that is escaping the characters, but I'm not sure how to make it stop.

like image 870
n s Avatar asked Nov 05 '22 19:11

n s


1 Answers

Are you sure you're building up the header correctly? Net::HTTP does not quote quotes when sending the request. You can easily verify it by using for example netcat (nc):

Terminal 1:

> nc -v -l -p 2323

Terminal 2 (in irb):

> http = Net::HTTP.new("localhost", 2323)
> http.post("/blah", "something", {'random-parameter' => ... )

Result (in terminal 1):

listening on [any] 2323 ...
connect to [127.0.0.1] from localhost [127.0.0.1] 37598
POST /blah HTTP/1.1
Connection: close
Accept: */*
Random-Parameter: value1="something",value2="somethingelse"
Content-Type: application/x-www-form-urlencoded
Content-Length: 9
Host: localhost:2323

something

I think what you actually may want to do (not sure, but I'm guessing) is something more along the lines of the HTTP spec:

> http.post("/blah", "something", {
    'random-parameter' => 'value1="something"; value2="somethingelse"' })

Rails is probably interpreting your first value1=... as the whole value..when you probably need to separate the values with ';', not ','.

Also note that you don't usually pass parameters through request headers. But maybe that's what you want to do in this case(?) Otherwise you should either pass the parameters in the URL itself like param1=foo&param2=bar, or use x-www-form-urlencoded to pass the parameters.

See here for a cheat sheet:
http://www.rubyinside.com/nethttp-cheat-sheet-2940.html

like image 163
Casper Avatar answered Nov 15 '22 06:11

Casper