POST instead of GET gives 404 (newbie)

Hi,

Using JRuby 1.1 and Rails 2.0, I created a small project in NetBeans that allows me to generate a dynamic dialplan in XML. In case it matters, I'm using builder-2.1.2 and activerecord-2.0.2.

Going in the browser to: http://localhost:3000/routing/dialplan?Caller-Destination-Number=0

Does exactly what I want: <document type="freeswitch/xml">     <section name="dialplan" description="FreeSwitch dialplan for DoneRight">         <context name="default">              <extension name="test123">                  <condition field="destination_number" expression="^.* $">                      <action application="bridge" data="sofia/gateway/ doneright/404"/>                 </condition>              </extension>         </context>     </section> </document>

However, the arguments (Caller-Destination-Number=0) should be posted and that fails. I get a 404.

% curl -F "Caller-Destination-Number=0" http://localhost:3000/routing/dialplan <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> <HTML>   <HEAD><TITLE>Not Found</TITLE></HEAD>   <BODY>     <H1>Not Found</H1>     `/routing/dialplan' not found.     <HR>     <ADDRESS>      WEBrick/1.3.1 (Ruby/1.8.6/2008-05-30) at      localhost:3000     </ADDRESS>   </BODY> </HTML>

My controller:   def dialplan     @routing = Routing.find(:first, :conditions => ['tfn like ?', params[:'Caller-Destination-Number']])     respond_to do |format|       format.xml     end   end

How do I avoid the 404 and will "params[:'Caller-Destination-Number']" still work when I use a post instead of a get?

I've searched the forums, but am none the wiser and I've got no clue how to approach this. Any help is appreciated.

Thanks, Birgit

How do I avoid the 404 and will "params[:'Caller-Destination-Number']" still work when I use a post instead of a get?

Sounds like your routes are setup to only accept a get. params are accessed in the same way for gets & posts.

Fred

Hi Fred,

Thanks for your reply.

Reading: http://api.rubyonrails.org/classes/ActionController/Routing.html

I've tried several things in config/routes.rb, such as map.connect 'routing/dialplan', :controller => 'routing',   :action => 'dialplan',   :conditions => { :method => :post }

but no progress.

Googling for 'post' is like searching for a needle in a haystack. Would you mind helping out a bit more?

Thanks, Birgit

Hi Fred,

Thanks for your reply.

Reading: http://api.rubyonrails.org/classes/ActionController/Routing.html

I've tried several things in config/routes.rb, such as map.connect 'routing/dialplan', :controller => 'routing',   :action => 'dialplan',   :conditions => { :method => :post }

but no progress.

Googling for 'post' is like searching for a needle in a haystack. Would you mind helping out a bit more?

What's in your routes right now ? If you haven't gone out of your way
with conditions on your routes, resources etc... then the default
controller/action/id route should still catch it whether it's a post
or a get.

Fred

Hi Fred,

Thanks for your reply (again). I got it working, albeit in GlassFish (not in Webrick).

My routes.rb files is very basic (I removed the 'map.connect' again):

ActionController::Routing::Routes.draw do |map|    map.connect ':controller/:action/:id'    map.connect ':controller/:action/:id.:format' end

When I deployed the app in question in GlassFish and I got a different error than the one in Webrick when I do a HTTP post (http get was stillOK):

% curl -F "Caller-Destination-Number=0" http://apso.westhawk.co.uk:8080/Dialplan/routing/dialplan

[ ... cut ... ]    <title>The change you wanted was rejected (422)</title> [ ... cut ... ]

   <!-- This file lives in public/422.html -->    <div class="dialog">      <h1>The change you wanted was rejected.</h1>      <p>Maybe you tried to change something you didn't have access to.</p>    </div>

I noticed in the glassfish/..../production.log: ActionController::InvalidAuthenticityToken (No :secret given to the #protect_from_forgery call. Set that or use a session store capable of generating its own keys (Cookie Session Store).):

After googling, I commented out the in app/controllers/application.rb protect_from_forgery # :secret => 'xxxx' line.

It's a bit of a pain that it doesn't work in Webrick. It makes development harder.

Thanks, Birgit

I noticed in the glassfish/..../production.log: ActionController::InvalidAuthenticityToken (No :secret given to the #protect_from_forgery call. Set that or use a session store capable
of generating its own keys (Cookie Session Store).):

After googling, I commented out the in app/controllers/application.rb protect_from_forgery # :secret => 'xxxx'

Ah yes. That only applies to post requests (but you'll only hit that
error after the correct action has been routed too)

line.

It's a bit of a pain that it doesn't work in Webrick. It makes development harder.

Were you restarting webrick after changing routes.rb ?

Fred

Hi Fred,

When I first encountered the Webrick problem, my routes.rb was the plain default one. Just to be sure, I just added the 'map.connect' back and restarted webrick. Same problem.

In my Netbeans webrick output window, I get: #<WEBrick::HTTPStatus::BadRequest: invalid body size.> ["/home/birgit/.netbeans/6.1/jruby-1.1/lib/ruby/1.8/webrick/httprequest.rb:288:in `read_body'",

This might well be a Netbeans/Webrick error, see http://jira.codehaus.org/browse/JRUBY-2446?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel

I'm not running on a windows platform, but otherwise, the conditions are the same: NetBeans 6.1, JRuby 1.1, gems 1.8

Thanks, Birgit

Hi Fred,

When I first encountered the Webrick problem, my routes.rb was the
plain default one. Just to be sure, I just added the 'map.connect' back and restarted webrick. Same problem.

In my Netbeans webrick output window, I get: #<WEBrick::HTTPStatus::BadRequest: invalid body size.> ["/home/birgit/.netbeans/6.1/jruby-1.1/lib/ruby/1.8/webrick/ httprequest.rb:288:in `read_body'",

This might well be a Netbeans/Webrick error, see http://jira.codehaus.org/browse/JRUBY-2446?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel

Ah yes that does rather look like the same thing. You shouldn't need
anything other than the default in routes.rb but if webrick is not
playing ball then I suppose that's its fault (or possibly jruby's fault)

Fred

Thanks, Fred, for all your help. It's a bummer, but at least I can do some development using HTTP get and test it properly using a HTTP post by deploying it.

Thanks, Birgit