Hi.

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 "http://www.site-1.com/";
  PerlAddVar CHKU "http://www.site-2.org/path?query";
  PerlAddVar CHKU "http://www.site-3.biz/";
  PerlAddVar CHKU "http://www.site-4.edu/";
  etc.. 50 times
</Location>

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"
</Location>

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 ?






Reply via email to