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 2003/12/17 19:55:25 UTC

cvs commit: modperl-2.0/t/response/TestCompat request.pm

stas        2003/12/17 10:55:25

  Modified:    lib/Apache compat.pm
               t/response/TestCompat request.pm
  Log:
  - for compat APIs that collide with mp2 API, instrument Apache::compat with
  methods to enable and disable those APIs when needed
  - $r->finfo and $r->notes which collide with mp2 API can now override the
  mp2 API on demand
  - adjust the notes test
  
  Revision  Changes    Path
  1.91      +80 -15    modperl-2.0/lib/Apache/compat.pm
  
  Index: compat.pm
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/lib/Apache/compat.pm,v
  retrieving revision 1.90
  retrieving revision 1.91
  diff -u -u -r1.90 -r1.91
  --- compat.pm	19 Nov 2003 19:30:11 -0000	1.90
  +++ compat.pm	17 Dec 2003 18:55:25 -0000	1.91
  @@ -50,6 +50,86 @@
       $INC{'Apache/Table.pm'} = __FILE__;
   }
   
  +# api => "overriding code"
  +# the overriding code, needs to "return" the original CODE reference
  +# when eval'ed , so that it can be restored later
  +my %overridable_mp2_api = (
  +    'Apache::RequestRec::notes' => <<'EOI',
  +{
  +    require Apache::RequestRec;
  +    my $notes_sub = *Apache::RequestRec::notes{CODE};
  +    *Apache::RequestRec::notes = sub {
  +        my $r = shift;
  +        return wantarray()
  +            ?       ($r->table_get_set(scalar($r->$notes_sub), @_))
  +            : scalar($r->table_get_set(scalar($r->$notes_sub), @_));
  +    };
  +    $notes_sub;
  +}
  +EOI
  +
  +    'Apache::RequestRec::finfo' => <<'EOI',
  +{
  +    require APR::Finfo;
  +    my $finfo_sub = *APR::Finfo::finfo{CODE};
  +    sub Apache::RequestRec::finfo {
  +        my $r = shift;
  +        stat $r->filename;
  +        \*_;
  +    }
  +    $finfo_sub;
  +}
  +EOI
  +);
  +
  +my %overridden_mp2_api = ();
  +
  +# this function enables back-compatible APIs which can't coexist with
  +# mod_perl 2.0 APIs with the same name and therefore it should be
  +# avoided if possible.
  +#
  +# it expects a list of fully qualified functions, like
  +# "Apache::RequestRec::finfo"
  +sub override_mp2_api {
  +    my (@subs) = @_;
  +
  +    for my $sub (@subs) {
  +        unless (exists $overridable_mp2_api{$sub}) {
  +            die __PACKAGE__ . ": $sub is not overridable";
  +        }
  +        if (exists $overridden_mp2_api{$sub}) {
  +            warn __PACKAGE__ . ": $sub has been already overridden";
  +            next;
  +        }
  +        $overridden_mp2_api{$sub} = eval $overridable_mp2_api{$sub};
  +        unless (exists $overridden_mp2_api{$sub} &&
  +                ref($overridden_mp2_api{$sub}) eq 'CODE') {
  +            die "overriding $sub didn't return a CODE ref";
  +        }
  +    }
  +}
  +
  +# restore_mp2_api does the opposite of override_mp2_api(), it removes
  +# the overriden API and restores the original mod_perl 2.0 API
  +sub restore_mp2_api {
  +    my (@subs) = @_;
  +
  +    for my $sub (@subs) {
  +        unless (exists $overridable_mp2_api{$sub}) {
  +            die __PACKAGE__ . ": $sub is not overridable";
  +        }
  +        unless (exists $overridden_mp2_api{$sub}) {
  +            warn __PACKAGE__ . ": can't restore $sub, " .
  +                "as it has not been overridden";
  +            next;
  +        }
  +        my $original_sub = delete $overridden_mp2_api{$sub};
  +        no warnings 'redefine';
  +        no strict 'refs';
  +        *$sub = $original_sub;
  +    }
  +}
  +
   sub request {
       my $what = shift;
   
  @@ -249,15 +329,6 @@
           : scalar($r->table_get_set(scalar($r->err_headers_out), @_));
   }
   
  -{
  -    my $notes_sub = *Apache::RequestRec::notes{CODE};
  -    *Apache::RequestRec::notes = sub {
  -        my $r = shift;
  -        return wantarray()
  -            ?       ($r->table_get_set(scalar($r->$notes_sub), @_))
  -            : scalar($r->table_get_set(scalar($r->$notes_sub), @_));
  -    }
  -}
   
   sub register_cleanup {
       shift->pool->cleanup_register(@_);
  @@ -345,12 +416,6 @@
   
   sub chdir_file {
       #XXX resolve '.' in @INC to basename $r->filename
  -}
  -
  -sub finfo {
  -    my $r = shift;
  -    stat $r->filename;
  -    \*_;
   }
   
   *log_reason = \&log_error;
  
  
  
  1.4       +6 -0      modperl-2.0/t/response/TestCompat/request.pm
  
  Index: request.pm
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/t/response/TestCompat/request.pm,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -u -r1.3 -r1.4
  --- request.pm	11 Apr 2003 07:34:03 -0000	1.3
  +++ request.pm	17 Dec 2003 18:55:25 -0000	1.4
  @@ -75,6 +75,8 @@
   
       # $r->notes
       {
  +        Apache::compat::override_mp2_api('Apache::RequestRec::notes');
  +
           my $key = 'notes-test';
           # get/set scalar context
           {
  @@ -98,6 +100,10 @@
               $r->notes->add($key => $_) for @exp;
               ok t_cmp(\@exp, [ $r->notes($key) ], "\$r->notes in list context");
           }
  +
  +        # restore the real 2.0 notes() method, now that we are done
  +        # with the compat one
  +        Apache::compat::restore_mp2_api('Apache::RequestRec::notes');
       }
   
       # get_remote_host()