On Sat, Nov 24, 2012 at 5:09 AM, André Warnier <a...@ice-sa.com> wrote:
> 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.

Maybe read the variables in startup.pl, and setup a package to provide
them to other modules at runtime?
http://perl.apache.org/docs/2.0/user/handlers/server.html#Startup_File

# pass $urllist var from httpd.conf?

startup.pl:
>         my $fh;
>         open($fh,'<',$urllist) or safe_die;
>         my @list = <$fh>;
>         close $fh;
My::Proxy->set_urllist(\@list);


There are a few different ways to specify $urllist in httpd.conf I
think so that startup.pl can get at it at startup time. Remember that
startup.pl is actually read twice I think (when apache starts, it
starts twice to make sure it can survive a restart).

http://perl.apache.org/docs/2.0/api/Apache2/ServerUtil.html#C_restart_count_

Hope that helps - there are some details I'm probably glossing over here.

>
> 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