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]