stas        2003/03/31 21:20:51

  Modified:    xs/Apache/Filter Apache__Filter.h
               xs/maps  modperl_functions.map
               xs/tables/current/ModPerl FunctionTable.pm
               todo     filters.txt
               .        Changes
  Added:       t/filter/TestFilter out_str_remove.pm
               t/filter out_str_remove.t
  Log:
  implement $filter->remove (filter self-removal) + tests
  
  Revision  Changes    Path
  1.26      +24 -0     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.25
  retrieving revision 1.26
  diff -u -r1.25 -r1.26
  --- Apache__Filter.h  25 Jan 2003 03:08:05 -0000      1.25
  +++ Apache__Filter.h  1 Apr 2003 05:20:50 -0000       1.26
  @@ -183,3 +183,27 @@
                                  callback,
                                  "OutputFilter");
   }
  +
  +static MP_INLINE
  +void mpxs_Apache__Filter_remove(pTHX_ I32 items, SV **MARK, SV **SP)
  +{
  +    modperl_filter_t *modperl_filter;
  +    ap_filter_t *f;
  +
  +    mpxs_usage_va_1(modperl_filter, "$filter->remove()");
  +    f = modperl_filter->f;
  +
  +#ifdef MP_TRACE
  +    {
  +        modperl_filter_ctx_t *ctx = (modperl_filter_ctx_t *)(f->ctx);
  +        MP_TRACE_f(MP_FUNC, "removing filter %s\n", ctx->handler->name);
  +    }
  +#endif
  +    
  +    if (modperl_filter->mode == MP_INPUT_FILTER_MODE) {
  +        ap_remove_input_filter(f);
  +    }
  +    else {
  +        ap_remove_output_filter(f);
  +    }
  +}
  
  
  
  1.56      +4 -3      modperl-2.0/xs/maps/modperl_functions.map
  
  Index: modperl_functions.map
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/xs/maps/modperl_functions.map,v
  retrieving revision 1.55
  retrieving revision 1.56
  diff -u -r1.55 -r1.56
  --- modperl_functions.map     2 Mar 2003 13:28:13 -0000       1.55
  +++ modperl_functions.map     1 Apr 2003 05:20:50 -0000       1.56
  @@ -78,10 +78,11 @@
   MODULE=Apache::Filter
    modperl_filter_attributes | MPXS_ | ... | MODIFY_CODE_ATTRIBUTES
   
  - mpxs_Apache__Filter_print | | ...
  - mpxs_Apache__Filter_read  | | ...
  + mpxs_Apache__Filter_print    | | ...
  + mpxs_Apache__Filter_read     | | ...
    mpxs_Apache__Filter_seen_eos | | ...
  - mpxs_Apache__Filter_ctx   | | filter, data=Nullsv
  + mpxs_Apache__Filter_ctx      | | filter, data=Nullsv
  + mpxs_Apache__Filter_remove   | | ...
   
    SV *:DEFINE_TIEHANDLE | | SV *:stashsv, SV *:sv=Nullsv
    int:DEFINE_PRINT      | | ...
  
  
  
  1.110     +26 -0     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.109
  retrieving revision 1.110
  diff -u -r1.109 -r1.110
  --- FunctionTable.pm  22 Mar 2003 03:19:11 -0000      1.109
  +++ FunctionTable.pm  1 Apr 2003 05:20:50 -0000       1.110
  @@ -5175,6 +5175,32 @@
     },
     {
       'return_type' => 'void',
  +    'name' => 'mpxs_Apache__Filter_remove',
  +    'attr' => [
  +      'static',
  +      '__inline__'
  +    ],
  +    'args' => [
  +      {
  +        'type' => 'PerlInterpreter *',
  +        'name' => 'my_perl'
  +      },
  +      {
  +        'type' => 'I32',
  +        'name' => 'items'
  +      },
  +      {
  +        'type' => 'SV **',
  +        'name' => 'mark'
  +      },
  +      {
  +        'type' => 'SV **',
  +        'name' => 'sp'
  +      }
  +    ]
  +  },
  +  {
  +    'return_type' => 'void',
       'name' => 'mpxs_Apache__Log_BOOT',
       'attr' => [
         'static'
  
  
  
  1.1                  modperl-2.0/t/filter/TestFilter/out_str_remove.pm
  
  Index: out_str_remove.pm
  ===================================================================
  package TestFilter::out_str_remove;
  
  use strict;
  use warnings FATAL => 'all';
  
  use Apache::Test;
  use Apache::TestUtil;
  
  use Apache::RequestRec ();
  use Apache::RequestIO ();
  
  use Apache::Filter ();
  
  use Apache::Const -compile => qw(OK);
  
  use constant READ_SIZE  => 1024;
  
  # this filter reads the first bb, upcases the data in it and removes itself
  sub upcase_n_remove {
        my $filter = shift;
  
        #warn "filter upcase_n_remove called\n";
        while ($filter->read(my $buffer, 1024)) {
            $filter->print(uc $buffer);
        }
  
        $filter->remove;
  
        return Apache::OK;
  }
  
  # this filter inserts underscores after each character it receives
  sub insert_underscores {
        my $filter = shift;
  
        #warn "filter insert_underscores called\n";
        while ($filter->read(my $buffer, 1024)) {
            $buffer =~ s/(.)/$1_/g;
            $filter->print($buffer);
        }
  
        return Apache::OK;
  }
  
  
  sub response {
      my $r = shift;
  
      # just to make sure that print() won't flush, or we would get the
      # count wrong
      local $| = 0;
  
      $r->content_type('text/plain');
      $r->print("Foo");
      $r->rflush;     # this sends the data in the buffer + flush bucket
      $r->print("bar");
  
      Apache::OK;
  }
  1;
  __DATA__
  SetHandler modperl
  PerlModule              TestFilter::out_str_remove
  PerlResponseHandler     TestFilter::out_str_remove::response
  PerlOutputFilterHandler TestFilter::out_str_remove::insert_underscores
  PerlOutputFilterHandler TestFilter::out_str_remove::upcase_n_remove
  
  
  
  1.1                  modperl-2.0/t/filter/out_str_remove.t
  
  Index: out_str_remove.t
  ===================================================================
  use strict;
  use warnings FATAL => 'all';
  
  use Apache::Test;
  use Apache::TestRequest;
  use Apache::TestUtil;
  
  plan tests => 1;
  
  my $expected = "F_O_O_b_a_r_";
  my $location = '/TestFilter::out_str_remove';
  my $response = GET_BODY $location;
  ok t_cmp($expected, $response, "a filter that removes itself");
  
  
  
  
  1.3       +0 -2      modperl-2.0/todo/filters.txt
  
  Index: filters.txt
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/todo/filters.txt,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- filters.txt       11 Mar 2003 07:47:54 -0000      1.2
  +++ filters.txt       1 Apr 2003 05:20:50 -0000       1.3
  @@ -104,8 +104,6 @@
   - Currently there is no way to MIX & MATCH mod-perl FILTERS declared
     via "PerlOutputFilterHandler" with APACHE standard ones.
   
  -- currently we have no way to remove the filter 
  -
   - we also may need filter_init hook
   
   tie handle interface
  
  
  
  1.161     +2 -0      modperl-2.0/Changes
  
  Index: Changes
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/Changes,v
  retrieving revision 1.160
  retrieving revision 1.161
  diff -u -r1.160 -r1.161
  --- Changes   31 Mar 2003 01:50:51 -0000      1.160
  +++ Changes   1 Apr 2003 05:20:51 -0000       1.161
  @@ -10,6 +10,8 @@
   
   =item 1.99_09-dev
   
  +implement $filter->remove (filter self-removal) + tests [Stas]
  +
   remove the second-guessing code that was trying to guess the package
   name to load from the handler configuration (by stripping ::string and
   trying to load the package). fall back to using explicit PerlModule to
  
  
  

Reply via email to