stas 2003/01/24 19:08:05 Modified: . Changes src/modules/perl modperl_filter.c modperl_filter.h modperl_types.h xs/Apache/Filter Apache__Filter.h xs/tables/current/ModPerl FunctionTable.pm t/filter/TestFilter both_str_con_add.pm both_str_rec_add.pm in_str_consume.pm in_str_lc.pm in_str_msg.pm in_str_sandwich.pm Log: store the input filter read attributes (mode, block, readbytes) in the filter object, so the read function doesn't have to provide them. - had to s/mode/input_mode/, because we already have an attr 'mode' in the filter object if we ever will have a need to change the discipline of the read from the filter we can provide an accessor method to modify the values supplied by the filter chain Revision Changes Path 1.115 +3 -0 modperl-2.0/Changes Index: Changes =================================================================== RCS file: /home/cvs/modperl-2.0/Changes,v retrieving revision 1.114 retrieving revision 1.115 diff -u -r1.114 -r1.115 --- Changes 24 Jan 2003 07:39:28 -0000 1.114 +++ Changes 25 Jan 2003 03:08:04 -0000 1.115 @@ -10,6 +10,9 @@ =item 1.99_09-dev +make $filter->read() in input streaming filters, use the same number +of arguments as read() in the output filters. [Stas] + Implement $r->add_input_filter and $r->add_output_filter $c->add_input_filter and $c->add_output_filter and add tests [Stas] 1.48 +21 -18 modperl-2.0/src/modules/perl/modperl_filter.c Index: modperl_filter.c =================================================================== RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_filter.c,v retrieving revision 1.47 retrieving revision 1.48 diff -u -r1.47 -r1.48 --- modperl_filter.c 24 Jan 2003 07:48:00 -0000 1.47 +++ modperl_filter.c 25 Jan 2003 03:08:04 -0000 1.48 @@ -94,7 +94,10 @@ modperl_filter_t *modperl_filter_new(ap_filter_t *f, apr_bucket_brigade *bb, - modperl_filter_mode_e mode) + modperl_filter_mode_e mode, + ap_input_mode_t input_mode, + apr_read_type_e block, + apr_off_t readbytes) { apr_pool_t *p = MP_FILTER_POOL(f); modperl_filter_t *filter = apr_pcalloc(p, sizeof(*filter)); @@ -109,6 +112,9 @@ if (mode == MP_INPUT_FILTER_MODE) { filter->bb_in = NULL; filter->bb_out = bb; + filter->input_mode = input_mode; + filter->block = block; + filter->readbytes = readbytes; } else { filter->bb_in = bb; @@ -134,10 +140,7 @@ return mg ? (modperl_filter_t *)mg->mg_ptr : NULL; } -int modperl_run_filter(modperl_filter_t *filter, - ap_input_mode_t mode, - apr_read_type_e block, - apr_off_t readbytes) +int modperl_run_filter(modperl_filter_t *filter) { AV *args = Nullav; int status; @@ -162,9 +165,9 @@ modperl_filter_mg_set(aTHX_ AvARRAY(args)[0], filter); if (filter->mode == MP_INPUT_FILTER_MODE) { - av_push(args, newSViv(mode)); - av_push(args, newSViv(block)); - av_push(args, newSViv(readbytes)); + av_push(args, newSViv(filter->input_mode)); + av_push(args, newSViv(filter->block)); + av_push(args, newSViv(filter->readbytes)); } if ((status = modperl_callback(aTHX_ handler, p, r, s, args)) != OK) { @@ -413,9 +416,6 @@ MP_INLINE apr_size_t modperl_input_filter_read(pTHX_ modperl_filter_t *filter, - ap_input_mode_t mode, - apr_read_type_e block, - apr_off_t readbytes, SV *buffer, apr_size_t wanted) { @@ -425,7 +425,8 @@ /* This should be read only once per handler invocation! */ filter->bb_in = apr_brigade_create(filter->pool, filter->f->c->bucket_alloc); - ap_get_brigade(filter->f->next, filter->bb_in, mode, block, readbytes); + ap_get_brigade(filter->f->next, filter->bb_in, + filter->input_mode, filter->block, filter->readbytes); MP_TRACE_f(MP_FUNC, "retrieving bb: 0x%lx\n", (unsigned long)(filter->bb_in)); } @@ -544,8 +545,9 @@ return ap_pass_brigade(f->next, bb); } else { - filter = modperl_filter_new(f, bb, MP_OUTPUT_FILTER_MODE); - status = modperl_run_filter(filter, 0, 0, 0); + filter = modperl_filter_new(f, bb, MP_OUTPUT_FILTER_MODE, + 0, 0, 0); + status = modperl_run_filter(filter); } switch (status) { @@ -560,7 +562,7 @@ apr_status_t modperl_input_filter_handler(ap_filter_t *f, apr_bucket_brigade *bb, - ap_input_mode_t mode, + ap_input_mode_t input_mode, apr_read_type_e block, apr_off_t readbytes) { @@ -570,11 +572,12 @@ if (((modperl_filter_ctx_t *)f->ctx)->sent_eos) { MP_TRACE_f(MP_FUNC, "EOS was already sent, passing through the brigade\n"); - return ap_get_brigade(f->next, bb, mode, block, readbytes); + return ap_get_brigade(f->next, bb, input_mode, block, readbytes); } else { - filter = modperl_filter_new(f, bb, MP_INPUT_FILTER_MODE); - status = modperl_run_filter(filter, mode, block, readbytes); + filter = modperl_filter_new(f, bb, MP_INPUT_FILTER_MODE, + input_mode, block, readbytes); + status = modperl_run_filter(filter); } switch (status) { 1.20 +6 -9 modperl-2.0/src/modules/perl/modperl_filter.h Index: modperl_filter.h =================================================================== RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_filter.h,v retrieving revision 1.19 retrieving revision 1.20 diff -u -r1.19 -r1.20 --- modperl_filter.h 24 Jan 2003 07:48:00 -0000 1.19 +++ modperl_filter.h 25 Jan 2003 03:08:04 -0000 1.20 @@ -29,14 +29,14 @@ modperl_filter_t *modperl_filter_new(ap_filter_t *f, apr_bucket_brigade *bb, - modperl_filter_mode_e mode); + modperl_filter_mode_e mode, + ap_input_mode_t input_mode, + apr_read_type_e block, + apr_off_t readbytes); modperl_filter_t *modperl_filter_mg_get(pTHX_ SV *obj); -int modperl_run_filter(modperl_filter_t *filter, - ap_input_mode_t mode, - apr_read_type_e block, - apr_off_t readbytes); +int modperl_run_filter(modperl_filter_t *filter); /* output filters */ apr_status_t modperl_output_filter_handler(ap_filter_t *f, @@ -65,7 +65,7 @@ /* input filters */ apr_status_t modperl_input_filter_handler(ap_filter_t *f, apr_bucket_brigade *bb, - ap_input_mode_t mode, + ap_input_mode_t input_mode, apr_read_type_e block, apr_off_t readbytes); @@ -75,9 +75,6 @@ MP_INLINE apr_size_t modperl_input_filter_read(pTHX_ modperl_filter_t *filter, - ap_input_mode_t mode, - apr_read_type_e block, - apr_off_t readbytes, SV *buffer, apr_size_t wanted); 1.65 +3 -0 modperl-2.0/src/modules/perl/modperl_types.h Index: modperl_types.h =================================================================== RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_types.h,v retrieving revision 1.64 retrieving revision 1.65 diff -u -r1.64 -r1.65 --- modperl_types.h 15 Jan 2003 06:07:10 -0000 1.64 +++ modperl_types.h 25 Jan 2003 03:08:04 -0000 1.65 @@ -194,6 +194,9 @@ apr_bucket *bucket; apr_bucket_brigade *bb_in; apr_bucket_brigade *bb_out; + ap_input_mode_t input_mode; + apr_read_type_e block; + apr_off_t readbytes; apr_status_t rc; modperl_filter_mode_e mode; apr_pool_t *pool; 1.25 +8 -17 modperl-2.0/xs/Apache/Filter/Apache__Filter.h Index: Apache__Filter.h =================================================================== RCS file: /home/cvs/modperl-2.0/xs/Apache/Filter/Apache__Filter.h,v retrieving revision 1.24 retrieving revision 1.25 diff -u -r1.24 -r1.25 --- Apache__Filter.h 24 Jan 2003 07:48:01 -0000 1.24 +++ Apache__Filter.h 25 Jan 2003 03:08:05 -0000 1.25 @@ -32,24 +32,12 @@ SV **MARK, SV **SP) { modperl_filter_t *modperl_filter; - ap_input_mode_t mode = 0; - apr_read_type_e block = 0; - apr_off_t readbytes = 0; apr_size_t wanted, len=0; SV *buffer; - - if (items < 4) { - mpxs_usage_va_2(modperl_filter, buffer, "$filter->read(buf, [len])"); - } - else { - modperl_filter = mp_xs_sv2_modperl_filter(*MARK); MARK++; - mode = (ap_input_mode_t)SvIV(*MARK); MARK++; - block = (apr_read_type_e)SvIV(*MARK); MARK++; - readbytes = (apr_off_t)SvIV(*MARK); MARK++; - buffer = *MARK++; - } + + mpxs_usage_va_2(modperl_filter, buffer, "$filter->read(buf, [len])"); - if (items == 3 || items == 6) { + if (items > 2) { wanted = SvIV(*MARK); } else { @@ -57,8 +45,11 @@ } if (modperl_filter->mode == MP_INPUT_FILTER_MODE) { - len = modperl_input_filter_read(aTHX_ modperl_filter, mode, - block, readbytes, buffer, wanted); + /* XXX: if we ever will have a need to change the read + * discipline: (input_mode, block, readbytes) from the filter + * we can provide an accessor method to modify the values + * supplied by the filter chain */ + len = modperl_input_filter_read(aTHX_ modperl_filter, buffer, wanted); } else { len = modperl_output_filter_read(aTHX_ modperl_filter, buffer, wanted); 1.102 +13 -13 modperl-2.0/xs/tables/current/ModPerl/FunctionTable.pm Index: FunctionTable.pm =================================================================== RCS file: /home/cvs/modperl-2.0/xs/tables/current/ModPerl/FunctionTable.pm,v retrieving revision 1.101 retrieving revision 1.102 diff -u -r1.101 -r1.102 --- FunctionTable.pm 24 Jan 2003 07:48:01 -0000 1.101 +++ FunctionTable.pm 25 Jan 2003 03:08:05 -0000 1.102 @@ -1696,6 +1696,18 @@ { 'type' => 'modperl_filter_mode_e', 'name' => 'mode' + }, + { + 'type' => 'ap_input_mode_t', + 'name' => 'input_mode' + }, + { + 'type' => 'apr_read_type_e', + 'name' => 'block' + }, + { + 'type' => 'apr_off_t', + 'name' => 'readbytes' } ] }, @@ -2414,7 +2426,7 @@ }, { 'type' => 'ap_input_mode_t', - 'name' => 'mode' + 'name' => 'input_mode' }, { 'type' => 'apr_read_type_e', @@ -3907,18 +3919,6 @@ 'type' => 'modperl_filter_t *', 'name' => 'filter' }, - { - 'type' => 'ap_input_mode_t', - 'name' => 'mode' - }, - { - 'type' => 'apr_read_type_e', - 'name' => 'block' - }, - { - 'type' => 'apr_off_t', - 'name' => 'readbytes' - } ] }, { 1.2 +2 -2 modperl-2.0/t/filter/TestFilter/both_str_con_add.pm Index: both_str_con_add.pm =================================================================== RCS file: /home/cvs/modperl-2.0/t/filter/TestFilter/both_str_con_add.pm,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- both_str_con_add.pm 24 Jan 2003 07:39:28 -0000 1.1 +++ both_str_con_add.pm 25 Jan 2003 03:08:05 -0000 1.2 @@ -25,9 +25,9 @@ return Apache::OK; } sub in_filter { - my($filter, $bb, $mode, $block, $readbytes) = @_; + my $filter = shift; - while ($filter->read($mode, $block, $readbytes, my $buffer, 1024)) { + while ($filter->read(my $buffer, 1024)) { $filter->print(lc $buffer); } 1.2 +2 -2 modperl-2.0/t/filter/TestFilter/both_str_rec_add.pm Index: both_str_rec_add.pm =================================================================== RCS file: /home/cvs/modperl-2.0/t/filter/TestFilter/both_str_rec_add.pm,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- both_str_rec_add.pm 24 Jan 2003 07:39:28 -0000 1.1 +++ both_str_rec_add.pm 25 Jan 2003 03:08:05 -0000 1.2 @@ -21,9 +21,9 @@ } sub in_filter { - my($filter, $bb, $mode, $block, $readbytes) = @_; + my $filter = shift; - while ($filter->read($mode, $block, $readbytes, my $buffer, 1024)) { + while ($filter->read(my $buffer, 1024)) { $filter->print(lc $buffer); } 1.3 +2 -2 modperl-2.0/t/filter/TestFilter/in_str_consume.pm Index: in_str_consume.pm =================================================================== RCS file: /home/cvs/modperl-2.0/t/filter/TestFilter/in_str_consume.pm,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- in_str_consume.pm 19 Jan 2003 23:15:48 -0000 1.2 +++ in_str_consume.pm 25 Jan 2003 03:08:05 -0000 1.3 @@ -23,7 +23,7 @@ use Apache::Const -compile => qw(OK M_POST); sub handler { - my($filter, $bb, $mode, $block, $readbytes) = @_; + my $filter = shift; my $ctx = $filter->ctx; @@ -33,7 +33,7 @@ # brigades because the core input filter will split data in # 8kb chunks per brigade and we have sent 11k of data (1st bb: # 8kb, 2nd bb: ~3kb) - my $len = $filter->read($mode, $block, $readbytes, my $buffer, 1024); + my $len = $filter->read(my $buffer, 1024); #warn "FILTER READ: $len bytes\n"; $filter->print("read just the first 1024b from the first brigade"); 1.2 +2 -2 modperl-2.0/t/filter/TestFilter/in_str_lc.pm Index: in_str_lc.pm =================================================================== RCS file: /home/cvs/modperl-2.0/t/filter/TestFilter/in_str_lc.pm,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- in_str_lc.pm 15 Jan 2003 06:19:25 -0000 1.1 +++ in_str_lc.pm 25 Jan 2003 03:08:05 -0000 1.2 @@ -8,9 +8,9 @@ use Apache::Const -compile => qw(OK M_POST); sub handler { - my($filter, $bb, $mode, $block, $readbytes) = @_; + my $filter = shift; - while ($filter->read($mode, $block, $readbytes, my $buffer, 1024)) { + while ($filter->read(my $buffer, 1024)) { #warn "FILTER READ: $buffer\n"; $filter->print(lc $buffer); } 1.3 +3 -2 modperl-2.0/t/filter/TestFilter/in_str_msg.pm Index: in_str_msg.pm =================================================================== RCS file: /home/cvs/modperl-2.0/t/filter/TestFilter/in_str_msg.pm,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- in_str_msg.pm 15 Jan 2003 06:47:15 -0000 1.2 +++ in_str_msg.pm 25 Jan 2003 03:08:05 -0000 1.3 @@ -17,11 +17,12 @@ my $to_url = '/TestFilter::in_str_msg::response'; sub handler : FilterConnectionHandler { - my($filter, $bb, $mode, $block, $readbytes) = @_; + my $filter = shift; + #warn "FILTER CALLED\n"; my $ctx = $filter->ctx; - while ($filter->read($mode, $block, $readbytes, my $buffer, 1024)) { + while ($filter->read(my $buffer, 1024)) { #warn "FILTER READ: $buffer\n"; unless ($ctx) { $buffer =~ s|GET $from_url|GET $to_url|; 1.2 +2 -2 modperl-2.0/t/filter/TestFilter/in_str_sandwich.pm Index: in_str_sandwich.pm =================================================================== RCS file: /home/cvs/modperl-2.0/t/filter/TestFilter/in_str_sandwich.pm,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- in_str_sandwich.pm 15 Jan 2003 06:19:25 -0000 1.1 +++ in_str_sandwich.pm 25 Jan 2003 03:08:05 -0000 1.2 @@ -11,7 +11,7 @@ use Apache::Const -compile => qw(OK M_POST); sub handler { - my($filter, $bb, $mode, $block, $readbytes) = @_; + my $filter = shift; my $ctx = $filter->ctx; @@ -20,7 +20,7 @@ $filter->ctx(1); } - while ($filter->read($mode, $block, $readbytes, my $buffer, 1024)) { + while ($filter->read(my $buffer, 1024)) { #warn "FILTER READ: $buffer\n"; $filter->print($buffer); }