Handler Chain (based on request method)

Handler Chain (based on request method)

am 24.10.2009 14:13:45 von Aaron Dalton

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 and , but they do not appear to be working.
The handlers get processed regardless. Here is the current config:



Allow from All
SetHandler perl-script
PerlHandler BackCAD::Dispatch


Allow from All
SetHandler default-handler



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

------------------------------------------------------------ ---------
The official User-To-User support forum of the Apache HTTP Server Project.
See for more info.
To unsubscribe, e-mail: users-unsubscribe@httpd.apache.org
" from the digest: users-digest-unsubscribe@httpd.apache.org
For additional commands, e-mail: users-help@httpd.apache.org

Re: Handler Chain (based on request method)

am 24.10.2009 14:45:57 von aw

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 and , but they do not appear to be working.
> The handlers get processed regardless. Here is the current config:
>
>
>
> Allow from All
> SetHandler perl-script
> PerlHandler BackCAD::Dispatch
>

>

>
> 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?
>
Interesting issue.
Several things come to mind, roughly :
1) you may want to (also) post this question on the mod_perl list
(modperl@perl.apache.org)
2) what happens if you just remove the section
>
> Allow from All
> SetHandler default-handler
>

?
3) If nothing else works, you should be able to do this using mod_rewrite :
a) define a new with your perl module in it
b) use RewriteCond and RewriteRule to check for a "non-GET" call, and if
so, re-direct (internally) to the /fsdispatch location
4) for your last question : I think that if your first handler returns
DECLINED, Apache will automatically pass the request to the next defined
handler in the chain. The first handler returning "not-DECLINED" wins.
You could also create your "pre-dispatcher" as a PerlAccessHandler,
which will always be executed in a previous phase (before content
handlers). That pre-dispatcher could just "push" the BackCAD::Dispatch
handler as a content-handler only if needed, leaving the default Apache
handler if it is a GET.
TIMTOWTDI, I think the saying goes.




------------------------------------------------------------ ---------
The official User-To-User support forum of the Apache HTTP Server Project.
See for more info.
To unsubscribe, e-mail: users-unsubscribe@httpd.apache.org
" from the digest: users-digest-unsubscribe@httpd.apache.org
For additional commands, e-mail: users-help@httpd.apache.org

Re: Handler Chain (based on request method)

am 28.10.2009 18:07:36 von Aaron Dalton

> Interesting issue.
> Several things come to mind, roughly :
> 1) you may want to (also) post this question on the mod_perl list
> (modperl@perl.apache.org)

Thank you for your response. I will cross-post that right now.

> 2) what happens if you just remove the section
> >
> > Allow from All
> > SetHandler default-handler
> >


Same problem.

> 3) If nothing else works, you should be able to do this using
mod_rewrite :
> a) define a new with your perl module in it
> b) use RewriteCond and RewriteRule to check for a "non-GET" call, and if
> so, re-direct (internally) to the /fsdispatch location

I'm always nervous when it comes to rewrite voodoo, but I'll review the
docs and see what I can come up with.

> 4) for your last question : I think that if your first handler returns
> DECLINED, Apache will automatically pass the request to the next defined
> handler in the chain. The first handler returning "not-DECLINED" wins.
> You could also create your "pre-dispatcher" as a PerlAccessHandler,
> which will always be executed in a previous phase (before content
> handlers). That pre-dispatcher could just "push" the BackCAD::Dispatch
> handler as a content-handler only if needed, leaving the default Apache
> handler if it is a GET.


Thanks again for your response. So you can just have multiple
"SetHandler" directives? And it will try from the top to the bottom?
That seems like the most elegant solution. I'll give it a shot.

Aaron

------------------------------------------------------------ ---------
The official User-To-User support forum of the Apache HTTP Server Project.
See for more info.
To unsubscribe, e-mail: users-unsubscribe@httpd.apache.org
" from the digest: users-digest-unsubscribe@httpd.apache.org
For additional commands, e-mail: users-help@httpd.apache.org