You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl-cvs@perl.apache.org by st...@apache.org on 2004/10/28 00:03:11 UTC

cvs commit: modperl-2.0/t/filter/TestFilter both_str_native_remove.pm

stas        2004/10/27 15:03:11

  Modified:    .        Changes
               xs/Apache/Filter Apache__Filter.h
  Added:       t/filter both_str_native_remove.t
               t/filter/TestFilter both_str_native_remove.pm
  Log:
  $filter->remove now works with native (non-modperl) filters + test
  Submitted by:	Torsten F�rtsch <to...@gmx.net>
  
  Revision  Changes    Path
  1.519     +5 -0      modperl-2.0/Changes
  
  Index: Changes
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/Changes,v
  retrieving revision 1.518
  retrieving revision 1.519
  diff -u -u -r1.518 -r1.519
  --- Changes	25 Oct 2004 23:38:56 -0000	1.518
  +++ Changes	27 Oct 2004 22:03:11 -0000	1.519
  @@ -16,6 +16,11 @@
     - Mistakenly skipping small entries of size 2 and less
     - Leave entries from other packages alone
   
  +$filter->remove now works with native (non-modperl) filters + test
  +[Torsten F�rtsch <torsten.foertsch gmx.net>]
  +
  +
  +
   =item 1.99_17 - October 22, 2004
   
   Implement Apache->unescape_url_info in Apache::compat and drop it
  
  
  
  1.43      +24 -2     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.42
  retrieving revision 1.43
  diff -u -u -r1.42 -r1.43
  --- Apache__Filter.h	1 Oct 2004 03:30:12 -0000	1.42
  +++ Apache__Filter.h	27 Oct 2004 22:03:11 -0000	1.43
  @@ -284,11 +284,33 @@
       modperl_filter_t *modperl_filter;
       ap_filter_t *f;
   
  -    mpxs_usage_va_1(modperl_filter, "$filter->remove()");
  +    if (items < 1) {
  +        Perl_croak(aTHX_ "usage: $filter->remove()");
  +    }
  +
  +    modperl_filter = mp_xs_sv2_modperl_filter(*MARK);
  +
  +    /* native filter */
  +    if (!modperl_filter) {
  +        f = (ap_filter_t*)SvIV(SvRV(*MARK));
  +        MP_TRACE_f(MP_FUNC,
  +                   "   %s\n\n\t non-modperl filter removes itself\n",
  +                   f->frec->name);
  +
  +        /* the filter can reside in only one chain. hence we try to
  +         * remove it from both, the input and output chains, since
  +         * unfortunately we can't tell what kind of filter is that and
  +         * whether the first call was successful
  +         */
  +        ap_remove_input_filter(f);
  +        ap_remove_output_filter(f);
  +        return;
  +    }
  +    
       f = modperl_filter->f;
   
       MP_TRACE_f(MP_FUNC, "   %s\n\n\tfilter removes itself\n",
  -               ((modperl_filter_ctx_t *)f->ctx)->handler->name);
  +        ((modperl_filter_ctx_t *)f->ctx)->handler->name);
       
       if (modperl_filter->mode == MP_INPUT_FILTER_MODE) {
           ap_remove_input_filter(f);
  
  
  
  1.1                  modperl-2.0/t/filter/both_str_native_remove.t
  
  Index: both_str_native_remove.t
  ===================================================================
  use strict;
  use warnings FATAL => 'all';
  
  use Apache::Test;
  use Apache::TestRequest;
  use Apache::TestUtil;
  
  plan tests => 8, need 'deflate', 'include',
      need_min_module_version("Compress::Zlib", "1.09");
  
  require Compress::Zlib;
  
  my $base = '/TestFilter__both_str_native_remove';
  
  # 1. check if DEFLATE input and INCLUDES output filter work
  {
      my $location = $base;
      my $received = POST_BODY $location,
          content => Compress::Zlib::memGzip('gzipped text'),
          'Content-Encoding' => "gzip";
  
      ok t_cmp $received, qr/xSSI OK/, "INCLUDES filter";
  
      ok t_cmp $received, qr/content: gzipped text/, "DEFLATE filter";
  }
  
  
  # 2. check if DEFLATE input and INCLUDES output filter can be removed
  {
      my $location = "$base?remove";
      my $received = POST_BODY $location, content => 'plain text';
  
      ok t_cmp $received,
          qr/input1: [\w,]+deflate/,
          "DEFLATE filter is present";
  
      ok !t_cmp $received,
          qr/input2: [\w,]+deflate/,
          "DEFLATE filter is removed";
  
      ok t_cmp $received,
          qr/content: plain text/,
          "DEFLATE filter wasn't invoked";
  
      ok t_cmp $received,
          qr/output1: modperl_request_output,includes,modperl_request_output,/,
          "INCLUDES filter is present";
  
      ok t_cmp $received,
          qr/output2: modperl_request_output,(?!includes)/,
          "INCLUDES filter is removed";
  
      ok t_cmp $received,
          qr/x<!--#echo var="SSI_TEST" -->x/,
          "INCLUDES filter wasn't invoked";
  
  }
  
  
  
  
  
  1.1                  modperl-2.0/t/filter/TestFilter/both_str_native_remove.pm
  
  Index: both_str_native_remove.pm
  ===================================================================
  package TestFilter::both_str_native_remove;
  
  # this tests verifies that we can remove input and output native
  # (non-mod_perl filters)
  
  use strict;
  use warnings FATAL => 'all';
  
  use Apache::RequestRec ();
  use Apache::RequestIO ();
  
  use Apache::Filter ();
  use Apache::FilterRec ();
  
  use Apache::Const -compile => qw(OK DECLINED);
  
  # this filter removes the next filter in chain and itself
  sub remove_includes {
        my $f = shift;
  
        my $args = $f->r->args || '';
        if ($args eq 'remove') {
            my $ff = $f->next;
            $ff->remove if $ff && $ff->frec->name eq 'includes';
        }
  
        $f->remove;
  
        return Apache::DECLINED;
  }
  
  # this filter removes the next filter in chain and itself
  sub remove_deflate {
        my $f = shift;
  
        my $args = $f->r->args || '';
        if ($args eq 'remove') {
            for (my $ff = $f->r->input_filters; $ff; $ff = $ff->next) {
                if ($ff->frec->name eq 'deflate') {
                    $ff->remove;
                    last;
                }
            }
        }
        $f->remove;
  
        return Apache::DECLINED;
  }
  
  # this filter appends the output filter list at eos
  sub print_out_flist {
        my $f = shift;
  
        unless ($f->ctx) {
            $f->ctx(1);
            $f->r->headers_out->unset('Content-Length');
        }
  
        while ($f->read(my $buffer, 1024)) {
            $f->print($buffer);
        }
  
        if ($f->seen_eos) {
            my $flist = join ',', get_flist($f->r->output_filters);
            $f->print("output2: $flist\n");
        }
  
        return Apache::OK;
  }
  
  sub store_in_flist {
        my $f = shift;
        my $r = $f->r;
  
        unless ($f->ctx) {
            my $x = $r->pnotes('INPUT_FILTERS') || [];
            push @$x, join ',', get_flist($f->r->input_filters);
            $r->pnotes('INPUT_FILTERS' => $x);
        }
  
        return Apache::DECLINED;
  }
  
  
  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');
      if ($r->method_number == Apache::M_POST) {
          $r->print("content: " . ModPerl::Test::read_post($r) ."\n");
      }
  
      my $i=1;
      for (@{ $r->pnotes('INPUT_FILTERS')||[] }) {
          $r->print("input$i: $_\n");
          $i++;
      }
  
      $r->subprocess_env(SSI_TEST => 'SSI OK');
      $r->printf("output1: %s\n", join ',', get_flist($r->output_filters));
  
      $r->rflush;     # this sends the data in the buffer + flush bucket
      $r->print('x<!--#echo var=');
      $r->rflush;     # this sends the data in the buffer + flush bucket
      $r->print('"SSI_TEST" -->x'."\n");
  
      Apache::OK;
  }
  
  sub get_flist {
      my $f = shift;
  
      my @flist = ();
      for (; $f; $f = $f->next) {
          push @flist, $f->frec->name;
      }
  
      return @flist;
  }
  
  1;
  __DATA__
  Options +Includes
  SetHandler modperl
  PerlModule              TestFilter::both_str_native_remove
  PerlResponseHandler     TestFilter::both_str_native_remove::response
  PerlOutputFilterHandler TestFilter::both_str_native_remove::remove_includes
  PerlSetOutputFilter     INCLUDES
  PerlOutputFilterHandler TestFilter::both_str_native_remove::print_out_flist
  PerlInputFilterHandler  TestFilter::both_str_native_remove::store_in_flist
  PerlInputFilterHandler  TestFilter::both_str_native_remove::remove_deflate
  PerlSetInputFilter      DEFLATE
  PerlInputFilterHandler  TestFilter::both_str_native_remove::store_in_flist