Raul Dias wrote: [...]
AFAIU the way that the apache 2 filter work, there is a core filter that is the last one to receive the buckets and is responsible to deploy it to the network socket.
I am assuming that apache2 filter model can work like regular shell
pipes like:
reader | filter1 | filter_n | core_out
In this traditional model, filter_n will write to STDOUT and block until core_out reads the data from STDIN. core_out will start by reading from the STDIN (and BLOCKING until there is data to read), and the send them to the network socket. In a normal operation, writing to a TCP socket will also block until an ACK has being received. Until the ACK is gotten, core_out will not read from the STDIN and so filter_n will be BLOCKED when it tries to write to STDOUT. (of course, core_out could be doing select to avoid blocking and buffering the STDIN).
In a model like this, it becomes easier to measure the bandwith.
But Apache filters don't work like shell pipes. There is no pipeline, since there is only one process that moves its control from one filter to another. This section explains how the blocking works:
http://perl.apache.org/docs/2.0/user/handlers/filters.html#Blocking_Calls
Now, using $f->read() / $f->print($buffer) it seems that the generated buckets are buffered regardless of how many are generated.
This way even a large file passes thru the filter in a few miliseconds while it might take some seconds to be fully downloaded in the destination.
So a mechanism for signaling when the output bucket brigade has being consumed by the next filter (core out) would be enought (or a start for doing what is needed).
By reading the filters chapter in the user's manual, it looks like that $r->rflush() sould be the answer. However It did not seem to resolve and by this message http://marc.theaimsgroup.com/?l=apache-modperl&m=103847990813285&w=2 it is not working yet.
I think that is working now, have you tried that? (this message is 1 year old). If it doesn't you have to step through with debugger and find the filter that doesn't handle FLUSH buckets correctly.
I think that's the only way you could try to achive what you are planning to. But it depends on how well behaved filters are. If any of the filters in the stack doesn't respect the FLUSH bucket there is not much your filter can do.
Your filter can also add FLUSH buckets, though you will need to work with bucket brigades and not the simplified streaming API.
__________________________________________________________________ Stas Bekman JAm_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
-- Reporting bugs: http://perl.apache.org/bugs/ Mail list info: http://perl.apache.org/maillist/modperl.html