perl-modperl mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From André Warnier>
Subject use "global" data in handler (was : custom proxy setup with mod_perl)
Date Sat, 24 Nov 2012 13:09:53 GMT

This refers indirectly to the thread "custom proxy setup with mod_perl", but is more 
general, I believe.

For the PerlFixupHandler which was discussed before, I need to compare the current request

URL to a predefined static list of URLs, to decide how exactly to proxy this call.
At the moment, there are about 15 URLs in that list; and I believe that there might, maybe

in some cases, be up to 100.

I suppose that I could make this list of URLs available to the handler by doing something

like this :

<Location />
   PerlFixupHandler My::Proxy->handler
   PerlAddVar CHKU ""
   PerlAddVar CHKU ""
   PerlAddVar CHKU ""
   PerlAddVar CHKU ""
   etc.. 50 times

and then do
	my @list = $r->dir_config('CHKU');
in the handler.

On the other hand, I could also put these URLs in a separate configuration text file, and

have the handler read it at each invocation :

<Location />
   PerlFixupHandler My::Proxy->handler
   PerlSetVar URL_LIST "/etc/apache2/conf/urllist.txt"

and in the handler :

	my $urllist = $r->dir_config('URL_LIST') || "default.list";
	my @list = ();
	my $fh;
	open($fh,'<',$urllist) or safe_die;
	@list = <$fh>;
	close $fh;

But neither of these is very satisfying.
The first one above is OK up to 10-20 URLs, but becomes a bit unsightly and clumsy for more.
The second one has the handler read and parse a file at each invocation (even if the 
request URL turns out not to be in the list, and the call should just be proxy-ed as is).
Sounds inefficient.

So, I would like to do this :

Package My::Proxy;

our $URLS;

sub handler {
my $r = shift;
unless (defined($URLS)) {
	my $urllist = $r->dir_config('URL_LIST') || "/etc/apache2/default_urls.list";
	my $fh;
	my @list;
	open($fh,'<',$urllist) or safe_die;
	@list = <$fh>;
	close $fh;
	$URLS = \@list;  # or = [ @list ] ??
.. use @$URLS, read-only ..


As I understand the above, in a pre-fork MPM, each time Apache forks a new child, at the 
first handler invocation $URLS will be undef, and thus the code in the handler will define

it, as a reference to an array of URLs read from the file.
And from then on, the list accessible through $URLS should remain available and unvariable

at each subsequent invocation of this handler (in this child), as long as this Apache 
child process lives.

First, I may be wrong in my understanding. (that's a question).

Second, if I am right in the above, then does this same understanding extend to all 
possible Apache MPMs ?  Or am I creating a horrible risk of some race condition, or memory

leak here ?

View raw message