Re: rfc: new filtering APIs
Stas Bekman wrote:
Geoffrey Young wrote:
Finally, other than add/remove filters APIs which we have talked
about, what other APIs do you want for filters?
is there an interface to filter_init?
see the discussion on
http://nagoya.apache.org/bugzilla/show_bug.cgi?id=9673
or CHANGES file for a description of why it was added.
this API may be crucial to mod_perl developers who want to handle
conditional GET requests properly with their filters.
First of all you can always do:
unless ($filter->ctx) {
# filter is called for the first time
# and this code won't be run only once
$filter->ctx(1);
}
so if you want to do something once, or e.g. remove yourself you can do
it in this block. So it seems to be similar to filter_init. Or am I
wrong here?
no, you need the real filter_init hook.
the issue here is that default_handler has meets_condiditions() logic in it,
so it makes decisions about whether or not to send content down the chain.
this is generally bad for filters, since they may have their own criteria
for determining what gets involved in making that decision - if
default-handler doesn't have all the information, it can return NOT_MODIFIED
when the filter would have chosen to re-modify the content (based on, say,
the fact that the version of the code has changed so it does things
differently now).
filter_init is a hook that runs code before any handlers run, I suspect for
adding calls to update_mtime() and other similar things.
I agree that having a dedicated filter_init seems to be
cleaner and probably more efficient.
If filter_init is wanted, how should it be set by the Perl code? Using
an optional second argument to the filter configuration?
PerlOutputFilterHandler MyFilter MyFilter::init
I would want at least a real-time interface for this, something similar to
$filter->init(sub {shift->update_mtime($package_mtime)} );
sub handler {
...
}
it's important that the filter be able to insert this logic itself without
relying on httpd.conf stuff. that makes the filter self-contained and a bit
more DWIMmy. of course, the subroutine/coderef would have to run on each
request, similar to $r->register_cleanup, just at the other end.
Also can you please give me some useful test I can play with? Probably
one of the examples from your book will do ;)
I'm working on something now, but without a tie into filter_init there's not
much to show :)
if you come up with the interface, I'll write the tests to make sure it does
what we need.
--Geoff
-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
Re: ModPerl::RegistryCooker messing with status.
Dmitri Tikhonov wrote: On Fri, 17 Jan 2003, Stas Bekman wrote: Dmitri Tikhonov wrote: I upgraded to 1.99.08 a couple of days ago and noticed strange behavior in my CGI scripts that run under ModPerl::Registry -- in 1.99.07 they worked fine. In 1.99.08, however, every single one of my scripts has this appended to its standard output: As you've figured out my original bug fix was wrong, since it broke other cases. We need more tests to avoid this kind of bugs in the future. it seems that Apache::Registry and Apache::PerlRun handle the return codes differently. So without covering all possible cases I'm not sure what's the best approach. Can you please try the following patch and let me know if it works for you? Thanks. This patch seems to work just fine, thanks, Stas. Thanks, Dmitri, for testing it. Will commit it shortly. __ Stas BekmanJAm_pH --> Just Another mod_perl Hacker http://stason.org/ mod_perl Guide ---> http://perl.apache.org mailto:[EMAIL PROTECTED] http://use.perl.org http://apacheweek.com http://modperlbook.org http://apache.org http://ticketmaster.com - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
Re: rfc: new filtering APIs
Geoffrey Young wrote:
[...]
no, you need the real filter_init hook.
the issue here is that default_handler has meets_condiditions() logic in
it, so it makes decisions about whether or not to send content down the
chain. this is generally bad for filters, since they may have their own
criteria for determining what gets involved in making that decision - if
default-handler doesn't have all the information, it can return
NOT_MODIFIED when the filter would have chosen to re-modify the content
(based on, say, the fact that the version of the code has changed so it
does things differently now).
filter_init is a hook that runs code before any handlers run, I suspect
for adding calls to update_mtime() and other similar things.
ok
I agree that having a dedicated filter_init seems to be cleaner and
probably more efficient.
If filter_init is wanted, how should it be set by the Perl code? Using
an optional second argument to the filter configuration?
PerlOutputFilterHandler MyFilter MyFilter::init
I would want at least a real-time interface for this, something similar to
$filter->init(sub {shift->update_mtime($package_mtime)} );
where would you run this code?
sub handler {
...
}
it's important that the filter be able to insert this logic itself
without relying on httpd.conf stuff. that makes the filter
self-contained and a bit more DWIMmy. of course, the subroutine/coderef
would have to run on each request, similar to $r->register_cleanup, just
at the other end.
Obviously for each conf option there should be a perl interface
(add/remove filters pending)
Also can you please give me some useful test I can play with? Probably
one of the examples from your book will do ;)
I'm working on something now, but without a tie into filter_init there's
not much to show :)
if you come up with the interface, I'll write the tests to make sure it
does what we need.
Cool.
Is there some C module that uses that hook so I can look at it? I guess
somewhere in PHP, because I don't seem to see any in the core modules.
__
Stas BekmanJAm_pH --> Just Another mod_perl Hacker
http://stason.org/ mod_perl Guide ---> http://perl.apache.org
mailto:[EMAIL PROTECTED] http://use.perl.org http://apacheweek.com
http://modperlbook.org http://apache.org http://ticketmaster.com
-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
Re: rfc: new filtering APIs
I would want at least a real-time interface for this, something
similar to
$filter->init(sub {shift->update_mtime($package_mtime)} );
where would you run this code?
outsite of a handler() subroutine, pretty much like I showed it - on
module load. I suspect you'd have to register the init handler that
way for a few reasons, namely that you'd miss the first request if you
waited until after default_handler runs to register your init filter.
it's also good to do it outside of handler() to handle stuff like
reloads, where the init routine might use a closure to avoid
recalculating the package mtime on each request.
I'm not sure what that means for actually getting at the filter object
outside of a request :)
[snip]
if you come up with the interface, I'll write the tests to make sure
it does what we need.
Cool.
Is there some C module that uses that hook so I can look at it? I guess
somewhere in PHP, because I don't seem to see any in the core modules.
yeah, the bug report points to PHP. it also mentions mod_include, but
I haven't looked at it yet.
I'll try to look into this a bit more next week.
--Geoff
-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
Re: rfc: new filtering APIs
Geoffrey Young wrote:
I would want at least a real-time interface for this, something
similar to
$filter->init(sub {shift->update_mtime($package_mtime)} );
where would you run this code?
outsite of a handler() subroutine, pretty much like I showed it - on
module load. I suspect you'd have to register the init handler that way
for a few reasons, namely that you'd miss the first request if you
waited until after default_handler runs to register your init filter.
it's also good to do it outside of handler() to handle stuff like
reloads, where the init routine might use a closure to avoid
recalculating the package mtime on each request.
The problem is that currently the resolving (read: module compiling and
handler resolving) is postponed till the first invocation of the handler
unless the module was manually preloaded or PerlOptions +Autoload was set.
I suppose that this could be a documented thing. e.g.:
if you use filter_init, you must preload the module at the server startup.
I'm not sure what that means for actually getting at the filter object
outside of a request :)
I don't think that's how it'll work. I was thinking of having a subroutine
with a special attribute. So after the module has been compiled we can
walk through all the CODE entries and check whether any of them is having
the FilterInitHandler attribute and take it from there. Does this sound good?
if you come up with the interface, I'll write the tests to make sure
it does what we need.
Cool.
Is there some C module that uses that hook so I can look at it? I
guess somewhere in PHP, because I don't seem to see any in the core
modules.
yeah, the bug report points to PHP. it also mentions mod_include, but I
haven't looked at it yet.
I read the thread at the URL you've provided. The latest comment from Dec
says that the bug is still there. So I suppose that the feature was added
but not really used so far. I could be wrong.
I'll try to look into this a bit more next week.
Cool. Thanks Geoff!
__
Stas BekmanJAm_pH --> Just Another mod_perl Hacker
http://stason.org/ mod_perl Guide ---> http://perl.apache.org
mailto:[EMAIL PROTECTED] http://use.perl.org http://apacheweek.com
http://modperlbook.org http://apache.org http://ticketmaster.com
-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
Re: rfc: new filtering APIs
Stas Bekman wrote:
Geoffrey Young wrote:
I would want at least a real-time interface for this, something
similar to
$filter->init(sub {shift->update_mtime($package_mtime)} );
where would you run this code?
outsite of a handler() subroutine, pretty much like I showed it - on
module load. I suspect you'd have to register the init handler that
way for a few reasons, namely that you'd miss the first request if you
waited until after default_handler runs to register your init filter.
it's also good to do it outside of handler() to handle stuff like
reloads, where the init routine might use a closure to avoid
recalculating the package mtime on each request.
The problem is that currently the resolving (read: module compiling and
handler resolving) is postponed till the first invocation of the handler
unless the module was manually preloaded or PerlOptions +Autoload was set.
I suppose that this could be a documented thing. e.g.:
if you use filter_init, you must preload the module at the server startup.
that sounds reasonable. preloading is always a good idea anyway.
I'm not sure what that means for actually getting at the filter object
outside of a request :)
I don't think that's how it'll work. I was thinking of having a
subroutine with a special attribute. So after the module has been
compiled we can walk through all the CODE entries and check whether any
of them is having the FilterInitHandler attribute and take it from
there. Does this sound good?
you mean something like
sub my_update_mtime : filter_init {};
?
I guess that's ok. it really depends on how the other interfaces
work. I like the streaming filter API, and wouldn't want to deviate
too far from that model to get this to work. and $filter->init (or
whatever) is a bit more like the other calls.
but you're in a better position to judge how this should/needs to
work. besides, once the hooks are there, we can probably make it look
however we want.
I read the thread at the URL you've provided. The latest comment from
Dec says that the bug is still there. So I suppose that the feature was
added but not really used so far. I could be wrong.
I'll try to look into this a bit more next week.
Cool. Thanks Geoff!
:)
--Geoff
-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
