The current output filters implementation sends an EOS before the Perl
handler exists, cutting off trailing output from a filter like:
sub handler {
$f = shift ;
$c = 0 ;
while ( $f->read( my $buffer ) ) {
$c += length $buffer ;
$r->print( $buffer ) ;
}
$r->print( "$c bytes sent\n" ) ;
}
This patch delays sending an EOS until the filter sub returns.
- Barrie
--- ./src/modules/perl/modperl_filter.c.orig Wed May 16 16:28:19 2001
+++ ./src/modules/perl/modperl_filter.c Tue May 22 10:52:49 2001
@@ -298,11 +298,6 @@
}
#endif
- if (filter->eos && (len == 0)) {
- /* if len > 0 then $filter->write will flush */
- modperl_output_filter_flush(filter);
- }
-
return len;
}
@@ -313,13 +308,26 @@
return filter->rc;
}
- if (filter->eos) {
- MP_TRACE_f(MP_FUNC, "sending EOS bucket\n");
- filter->rc = send_eos(filter->f);
- apr_brigade_destroy(filter->bb);
- filter->bb = NULL;
- filter->eos = 0;
+ return filter->rc;
+}
+
+MP_INLINE apr_status_t modperl_output_filter_send_EOS(modperl_filter_t *filter)
+{
+
+ filter->rc = modperl_output_filter_flush(filter);
+ if (filter->rc != APR_SUCCESS) {
+ return filter->rc;
+ }
+
+ if (!filter->eos) {
+ MP_TRACE_f(MP_FUNC, "WARNING: filter not at EOS bucket\n");
+ /* XXX Should we disgard remaining input? */
}
+ MP_TRACE_f(MP_FUNC, "sending EOS bucket\n");
+ filter->rc = send_eos(filter->f);
+ apr_brigade_destroy(filter->bb);
+ filter->bb = NULL;
+ filter->eos = 0;
return filter->rc;
}
@@ -348,6 +356,7 @@
else {
filter = modperl_filter_new(f, bb, MP_OUTPUT_FILTER_MODE);
status = modperl_run_filter(filter, 0, 0);
+ modperl_output_filter_send_EOS(filter);
}
switch (status) {
--- ./src/modules/perl/modperl_filter.h.orig Tue May 22 11:07:06 2001
+++ ./src/modules/perl/modperl_filter.h Tue May 22 11:07:28 2001
@@ -35,6 +35,7 @@
void modperl_output_filter_register(request_rec *r);
MP_INLINE apr_status_t modperl_output_filter_flush(modperl_filter_t *filter);
+MP_INLINE apr_status_t modperl_output_filter_send_EOS(modperl_filter_t *filter);
MP_INLINE apr_ssize_t modperl_output_filter_read(pTHX_
modperl_filter_t *filter,
--- ./xs/Apache/Filter/Apache__Filter.h.orig Tue May 22 10:54:12 2001
+++ ./xs/Apache/Filter/Apache__Filter.h Tue May 22 11:05:24 2001
@@ -21,7 +21,7 @@
if (modperl_filter->mode == MP_OUTPUT_FILTER_MODE) {
mpxs_write_loop(modperl_output_filter_write, modperl_filter);
- modperl_output_filter_flush(modperl_filter);
+ modperl_output_filter_send_EOS(modperl_filter);
}
else {
croak("input filters not yet supported");
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]