You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl@perl.apache.org by Aaron Dalton <aa...@daltons.ca> on 2009/10/28 17:58:21 UTC
Handler Chain (based on request method)
I'm using mod_perl and CGI::Application::Dispatch to create a RESTful
web application. In the one resource, GETs should be sent to the
default handler, and all other requests to the dispatcher. I have tried
using <Limit> and <LimitExcept>, but they do not appear to be working.
The handlers get processed regardless. Here is the current config:
<Location /fs>
<LimitExcept GET>
Allow from All
SetHandler perl-script
PerlHandler BackCAD::Dispatch
</LimitExcept>
<Limit GET>
Allow from All
SetHandler default-handler
</Limit>
</Location>
Is there some way to make this work? Do I need to write some sort of
pre-dispatcher that checks the request method and returns DECLINED if
it's GET? But if it's *not* GET, how do I then pass control on to the
other dispatcher?
Thank you so much for your time and assistance.
Aaron
Re: Handler Chain (based on request method)
Posted by André Warnier <aw...@ice-sa.com>.
André Warnier wrote:
>>
> Just by curiosity, what happened to the suggestions I gave you on the
> Apache httpd list (apart from the first one, which was to cross-post
> here) ?
>
Ok, sorry, I see that response to the httpd list just got there.
Maybe better to move the whole discussion here, there is probably more
focused help available.
Re: Handler Chain (based on request method)
Posted by André Warnier <aw...@ice-sa.com>.
Aaron Dalton wrote:
> I'm using mod_perl and CGI::Application::Dispatch to create a RESTful
> web application. In the one resource, GETs should be sent to the
> default handler, and all other requests to the dispatcher. I have tried
> using <Limit> and <LimitExcept>, but they do not appear to be working.
> The handlers get processed regardless. Here is the current config:
>
> <Location /fs>
> <LimitExcept GET>
> Allow from All
> SetHandler perl-script
> PerlHandler BackCAD::Dispatch
> </LimitExcept>
> <Limit GET>
> Allow from All
> SetHandler default-handler
> </Limit>
> </Location>
>
> Is there some way to make this work? Do I need to write some sort of
> pre-dispatcher that checks the request method and returns DECLINED if
> it's GET? But if it's *not* GET, how do I then pass control on to the
> other dispatcher?
>
Just by curiosity, what happened to the suggestions I gave you on the
Apache httpd list (apart from the first one, which was to cross-post here) ?
Also, the reason why the above does not work is probably that the
<Limit...> sections are not really full containers. So your SetHandlers
above probably overwrite one another regardless, and only the last one
counts.
Another quick/cheap hack maybe :
> <Location /fs>
> Allow from All
> SetHandler perl-script
> PerlHandler BackCAD::Dispatch
> </Location>
then modify the code of BackCAD::Dispatch to return DECLINED if it's a GET.
Honestly, I've never tried that, and I don't know if then Apache would
process it with its default handler. But it's worth a try maybe.
Re: Handler Chain (based on request method)
Posted by Perrin Harkins <ph...@gmail.com>.
On Wed, Oct 28, 2009 at 12:58 PM, Aaron Dalton <aa...@daltons.ca> wrote:
> I'm using mod_perl and CGI::Application::Dispatch to create a RESTful
> web application. In the one resource, GETs should be sent to the
> default handler, and all other requests to the dispatcher. I have tried
> using <Limit> and <LimitExcept>, but they do not appear to be working.
Those are for rejecting requests, not mapping them to handlers. I
would either use mod_rewrite to map the GET requests to a different
location, or make a PerlTransHandler to deal with it.
> Do I need to write some sort of
> pre-dispatcher that checks the request method and returns DECLINED if
> it's GET?
Right, that would be the TransHandler approach.
> But if it's *not* GET, how do I then pass control on to the
> other dispatcher?
You can set the handler for the current request from within the
script. Take a look at the docs for examples. I know you'll find
some if you search for "default-handler" in the mail archives too.
- Perrin