modperl_apache_class_tree

This is part of The Pile, a partial archive of some open source mailing lists and newsgroups.



Subject: Why is Apache::PerlRun a subclass of Apache?
From: Ken Williams <ken@forum.swarthmore.edu>
Date: Tue, 22 Aug 2000 21:41:26 -0500

Hi,

I've got to ask this because I'm going through immense pain and
suffering* dealing with this problem.  Why is Apache::PerlRun a subclass
of Apache?  Shouldn't it just be a regular content handler that 'has-a'
$r instead of 'is-a' Apache request?

The problem I'm having is that I'm trying to write Apache::Filter as a
subclass of Apache (because it 'is-a' Apache request class, in that it
extends the Apache class), but PerlRun and its derived class RegistryNG
step in and clobber $r.

So I'm trying to open the discussion about whether the current implementation
of Apache::PerlRun might be changeable.  I'm about to take a stab at
implementing it the way I think (for the moment) it should be.

===

Subject: Re: Why is Apache::PerlRun a subclass of Apache?
From: Ken Williams <ken@forum.swarthmore.edu>
Date: Thu, 24 Aug 2000 01:42:29 -0500

crickets* ...

Here's a patch for the implementation I'm looking for.  It passes the
'make test' stuff in CVS.  I'd love to see this change done, or a
discussion of why it's not a good idea.

Patch pasted below.

((deleted))

===

Subject: Re: Why is Apache::PerlRun a subclass of Apache?
From: Ken Williams <ken@forum.swarthmore.edu>
Date: Fri, 25 Aug 2000 16:22:26 -0500

This message bounced last time I sent it, so I'm trying again.]

ken@mathforum.com (Ken Williams) wrote:
> ... *crickets* ...
>
>Here's a patch for the implementation I'm looking for.  


And here's a better one.  I discovered that Apache->request($r) doesn't
work as expected (see my previous message with subject
"Apache->request($r) broken?"), so this patch makes $r a data member and
uses that instead of the value returned by Apache->request.

There were also a couple of buglets in my last patch - now I've got this
working and cooperating with Apache::Filter and Apache::RegistryFilter. 
RegistryFilter is getting slicker as a result of these changes - it's
starting to handle $r->send_http_header() in a nice transparent way.

____________________________________________________________________
Index: PerlRun.pm
===================================================================
RCS file: /home/cvspublic/modperl/lib/Apache/PerlRun.pm,v
retrieving revision 1.29
diff -u -r1.29 PerlRun.pm
--- PerlRun.pm	2000/06/01 21:07:56	1.29
+++ PerlRun.pm	2000/08/25 19:05:11
@@ -19,32 +19,22 @@
 $Debug ||= 0;
 my $Is_Win32 = $^O eq "MSWin32";
 
-@Apache::PerlRun::ISA = qw(Apache);
-
 sub new {
     my($class, $r) = @_;
-    return $r unless ref($r) eq "Apache";
-    if(ref $r) {
-	$r->request($r);
-    }
-    else {
-	$r = Apache->request;
-    }
     my $filename = $r->filename;
     $r->warn("Apache::PerlRun->new for $filename in process $$")
 	if $Debug && $Debug & 4;
 
-    bless {
-	'_r' => $r,
-    }, $class;
+    return bless {r=>$r}, $class;
 }
 
 sub can_compile {
     my($pr) = @_;
-    my $filename = $pr->filename;
-    if (-r $filename && -s _) {
-	if (!($pr->allow_options & OPT_EXECCGI)) {
-	    $pr->log_reason("Options ExecCGI is off in this directory",
+    my $r = $pr->{r};
+    my $filename = $r->filename;
+    if (-r $r->finfo && -s _) {
+	if (!($r->allow_options & OPT_EXECCGI)) {
+	    $r->log_reason("Options ExecCGI is off in this directory",
 			   $filename);
 	    return FORBIDDEN;
  	}
@@ -52,7 +42,7 @@
 	    return DECLINED;
 	}
 	unless (-x _ or $Is_Win32) {
-	    $pr->log_reason("file permissions deny server execution",
+	    $r->log_reason("file permissions deny server execution",
 			   $filename);
 	    return FORBIDDEN;
 	}
@@ -64,8 +54,7 @@
 }
 
 sub mark_line {
-    my($pr) = @_;
-    my $filename = $pr->filename;
+    my $filename = shift->{r}->filename;
     return $Apache::Registry::MarkLine ?
 	"\n#line 1 $filename\n" : "";
 }
@@ -114,26 +103,28 @@
 sub compile {
     my($pr, $eval) = @_;
     $eval ||= $pr->{'sub'};
-    $pr->clear_rgy_endav;
-    $pr->log_error("Apache::PerlRun->compile") if $Debug && $Debug & 4;
+    my $r = $pr->{r};
+    $r->clear_rgy_endav;
+    $r->log_error("Apache::PerlRun->compile") if $Debug && $Debug & 4;
     Apache->untaint($$eval);
     {
 	no strict; #so eval'd code doesn't inherit our bits
 	eval $$eval;
     }
-    $pr->stash_rgy_endav;
+    $r->stash_rgy_endav;
     return $pr->error_check;
 }
 
 sub run {
     my $pr = shift;
     my $package = $pr->{'namespace'};
+    my $r = $pr->{r};
 
     my $rc = OK;
     my $cv = \&{"$package\::handler"};
 
     my $oldwarn = $^W;
-    eval { $rc = &{$cv}($pr, @_) } if $pr->seqno;
+    eval { $rc = &{$cv}($r, @_) } if $r->seqno;
     $pr->{status} = $rc;
     $^W = $oldwarn;
 
@@ -141,11 +132,11 @@
     if($@) {
 	$errsv = $@;
 	$@ = ''; #XXX fix me, if we don't do this Apache::exit() breaks
-	$@{$pr->uri} = $errsv;
+	$@{$r->uri} = $errsv;
     }
 
     if($errsv) {
-	$pr->log_error($errsv);
+	$r->log_error($errsv);
 	return SERVER_ERROR;
     }
 
@@ -153,24 +144,25 @@
 }
 
 sub status {
-    shift->{'_r'}->status;
+    shift->{r}->status;
 }
 
 sub namespace_from {
     my($pr) = @_;
+    my $r = $pr->{r};
 
-    my $uri = $pr->uri; 
+    my $uri = $r->uri;
 
-    $pr->log_error(sprintf "Apache::PerlRun->namespace escaping %s",
+    $r->log_error(sprintf "Apache::PerlRun->namespace escaping %s",
 		  $uri) if $Debug && $Debug & 4;
 
-    my $path_info = $pr->path_info;
+    my $path_info = $r->path_info;
     my $script_name = $path_info && $uri =~ /$path_info$/ ?
 	substr($uri, 0, length($uri)-length($path_info)) :
 	$uri;
 
-    if ($Apache::Registry::NameWithVirtualHost && $pr->server->is_virtual) {
-	my $name = $pr->get_server_name;
+    if ($Apache::Registry::NameWithVirtualHost && $r->server->is_virtual) {
+	my $name = $r->get_server_name;
 	$script_name = join "", $name, $script_name if $name;
     }
 
@@ -200,7 +192,7 @@
  
     $root ||= "Apache::ROOT";
 
-    $pr->log_error("Apache::PerlRun->namespace: package $root$script_name")
+    $pr->{r}->log_error("Apache::PerlRun->namespace: package $root$script_name")
 	if $Debug && $Debug & 4;
 
     $pr->{'namespace'} = $root.$script_name;
@@ -209,13 +201,13 @@
 
 sub readscript {
     my $pr = shift;
-    $pr->{'code'} = $pr->slurp_filename;
+    $pr->{'code'} = $pr->{r}->slurp_filename;
 }
 
 sub error_check {
     my $pr = shift;
     if ($@ and substr($@,0,4) ne " at ") {
-	$pr->log_error("PerlRun: `$@'");
+	$pr->{r}->log_error("PerlRun: `$@'");
 	$@{$pr->uri} = $@;
 	$@ = ''; #XXX fix me, if we don't do this Apache::exit() breaks	
 	return SERVER_ERROR;
@@ -257,12 +249,12 @@
 
 sub chdir_file {
     my($pr, $dir) = @_;
-    $pr->{'_r'}->chdir_file($dir ? $dir : $pr->filename);
+    my $r = $pr->{r};
+    $r->chdir_file($dir ? $dir : $r->filename);
 }
 
 sub set_script_name {
-    my($pr) = @_;
-    *0 = \$pr->filename;
+    *0 = \(shift->{r}->filename);
 }
 
 sub handler ($$) {
@@ -418,3 +410,4 @@
 
 Doug MacEachern
 
+=cut
Index: RegistryBB.pm
===================================================================
RCS file: /home/cvspublic/modperl/lib/Apache/RegistryBB.pm,v
retrieving revision 1.4
diff -u -r1.4 RegistryBB.pm
--- RegistryBB.pm	2000/05/29 08:11:14	1.4
+++ RegistryBB.pm	2000/08/25 19:05:11
@@ -16,7 +16,7 @@
 
 #skip -x, OPT_EXEC, etc. checks
 sub can_compile {
-    my $r = shift;
+    my $r = shift->{r};
     unless (-r $r->finfo) {
 	$r->log_reason("file does not exist");
 	return NOT_FOUND;
Index: RegistryNG.pm
===================================================================
RCS file: /home/cvspublic/modperl/lib/Apache/RegistryNG.pm,v
retrieving revision 1.6
diff -u -r1.6 RegistryNG.pm
--- RegistryNG.pm	2000/06/01 21:07:57	1.6
+++ RegistryNG.pm	2000/08/25 19:05:11
@@ -17,7 +17,7 @@
 # see also: Apache::RegistryBB
  
 sub namespace_from {
-    shift->filename;
+    shift->{r}->filename;
 }
 
 sub handler ($$) {

===


the rest of The Pile (a partial mailing list archive)

doom@kzsu.stanford.edu