On Fri, 25 May 2001, barries wrote:
On Thu, May 24, 2001 at 05:52:39PM -0700, Doug MacEachern wrote:
let's consider everything before adding new code.
Ok :-). I have a reply in queue that works through your ideation w/
questions suggestions. But first, let's look at really bifurcating
the API into a Perl*Filter API and a more Apache-esque API.
I'm starting to think that packaging low level Apache filters as though
they were Perl*Handlers is a misleading API: they're different from
plain handlers and treating them so is likely to mislead developers and
provides different semantics than the underlying Apache API provides,
leading to impedance mismatch in mod_perl's implementation and in
devloper's mental models.
Other handlers get called once per request or subrequest. Filters will
often get called 2 or many, many times (see any handler that skips
sending an EOS bucket, as well as mod_isapi and mod_proxy). Writing a
filter sub requires a much more event-driven mindest than writing a
handler sub: even the example reverse filter has a surprise in it waiting
for somebody that slaps it in front of mod_proxy or mod_isapi or any
other handler that sends multiple bbs of content.
Handler subs are simple use-once event handlers no intra-request state
needs to be kept. Filter subs will often need to be aware of BOS/EOS
state provided by mod_perl, and will also need to keep some
intra-request state.
to me, a Perl*Handler is just a configuration directive which specifies
the name of a Perl subroutine. and that subroutine is called during a
given apache plugin callback. all Perl*Handlers, including filters use
the same mechanism for resolving the name, loading the module if
needed, calling the subroutine, etc.
So, how about two APIs?
isn't this what i've been saying all along? :)
API 1: Perl{In,Out}putFilterHandlers
Perl{In,Out}putFilter directives act much like todays, but use the
filter name when registering filters and AP_FTYPE_...CODE attrs to
modify when ap_add_xxx_filter()s get called. The only reason for using
the filter names is to enable debug dumps of the filter stack to be
read, and to obey the principle of least surpise, meaning that there's
no need for the special-ness of MODPERL_{IN,OUT}PUT_FILTER_NAME to be
grokked by hapless mod_perl-internals-geek-wannabes like me.
sure, i'm all for using the Perl name to register the filter.
However, to make these Perl{In,Out}putFilterHandlers consistent with
other Perl*Handlers, mod_perl would need
- to buffer all filter input in an ever-growing bucket brigade until
EOS is seen,
- then call the Perl*FilterHandler sub (once!),
i would consider this as an option. it could actually be a standalone
filter module that collects all brigades into one before sending it
further down the chain. if its proven to be efficient, we can make it the
default.
- passing it $r blessed in to an Apache::RequestFilter (or some such)
class which would have alternative I/O subs that called the brigade
APIs. Would also provide a filter() accessor to get at the
real Apache::Filter object for the rare case when that might be
needed in sucha high level handler.
$filter-r gives you the request_rec. Perl*Handlers in 2.0 are passed
the same arguments as C handlers are passed.
- and pass on the EOS when the sub exited.
The coding style would be very consistent with the existing mechanisms
and all the hairball stuff you can trip over with filters is balled up
into a tangle of wiring hidden behind nice, padded walls. No BOS/EOS
worries, not statefullness worries, just memory and (possibly) latency
worries.
i hope we can get to that. the C bucket brigade api is klunky. the
$filter-{read,write} methods written as part of the padding, still need
to be implemented for input filters.
The worries in that scheme, as well as the lack of flexibility in
calling ap_add_xxx_filter() need a low-level API to handle.
API 2: Bucket Brigade filters
i think we're on the same page, this is pretty much the same as what
i outlined under 'direct C api mapping.
mod_perl could call ap_register_xxx_filter() on all subs compiled with
either an AP_FTYPE_FOO or a new MP_INPUT_FILTER or MP_OUTPUT_FILTER sub
attr.
except for this part. for the direct mapping, mod_perl should not do
anything special. it will be up to the Perl filter module to call
Apache::register_xxx_filter with AP_FTYPE_FOO. i'm ok with defaulting
arguments, e.g. ftype could default to AP_FTYPE_CONTENT.
-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]