At 12:22 PM 8/23/00, Alex Menendez wrote:
>Hmmmm, the do does seem a little inefficient. I solved
>this problem in the
>past by intiating a subrequest and changing the stack
>handler to
>cgi-script right before running the cgi. something like
>this:
>
>$subr = $r->lookup_uri($uri);
>if($r->filename =~ /\.(cgi|pl)$)/o) {
> $subr->handler('cgi-script');
>}
>$subr->run();
Thanks, Alex.
This will work, but I'm trying to eliminate the 'what kind
of file is this' logic from the handler. Perhaps I'm
being naive, but if I can just give Apache a generic
request and let Apache worry about whether it's a static
file or a script, the problem gets a lot simpler.
Perhaps I'm seeing a performance problem where there isn't
one. Do you think that the type determination code is
going to slow anything down measurably?
>you might get into some trouble with headers if your cgi's
>return
>http headers other than just Content-type like Location.
>If they don't go
>ahead and add $r->send_http_header right before the run
>command. If they
>do send other headers, you will need a patch for Apache.xs
>in the mod_perl
>src. I have it and can give it to you if you are
>interested.
Sure, I'd like to take a look at it.
thanks again,
Todd
On Wed, 23 Aug 2000, Todd Finney wrote:
> > Hi,
> >
> > I'm building a simple templating system. The major
> > requirement of the system is that allow custom dynamic
> > headers, footers, and toolbars based upon the identity
> of
> > the user.
> >
> > The system so far works like this:
> > - a user enters the site and logs in. The
> names
> > of the user's default
> > template, header, footer, and toolbar are
> placed
> > into a cookie
> > (via Apache::Session).
> > - when the user requests a page, my handler
> > intercepts that request, and
> > looks at the user's cookie. Based upon the
> > information in it, it grabs the
> > appropriate template and components from the
> > filesystem along with the
> > requested page, rolls them together, and
> serves
> > the result.
> >
> > A sample template file looks like this:
> >
> > <html>
> > <head><title>Standard Template</title></head>
> > <body bgcolor="#ffffff">
> > <table width="650" cellspacing="0" cellpadding="0"
> > border="0">
> > <tr><td colspan="2" width="650" align="left"><!--
> > Wrapper:header --><br></td></tr>
> > <tr>
> > <td width="150" align="left" valign="top"><!--
> > Wrapper:toolbar --><br></td>
> > <td width="500" align="left" valign="top"><!--
> Content
> > --><br></td></tr>
> > <tr><td colspan="2" width="650" align="left"><!--
> > Wrapper:footer --><br></td></tr>
> > </table>
> > </body></html>
> >
> > Component files, such as the header, footer and
> toolbar,
> > are by convention self-contained html tables, ala
> >
> > # file components/tool/standard
> >
> > <table width="100%">
> > <tr><td align="center"><a href="/wrapped/one.html">Link
>
> > One</a><br></td></tr>
> > <tr><td align="center"><a href="/wrapped/two.html">Link
>
> > Two</a><br></td></tr>
> > <tr><td align="center"><a
> href="/wrapped/three.html">Link
> > Three</a><br></td></tr>
> > <tr><td align="center"><a
> href="/wrapped/four.html">Link
> > Four</a><br></td></tr>
> > <tr><td align="center"><a
> href="/wrapped/five.html">Link
> > Five</a><br></td></tr>
> > <tr><td align="center"><a
> >
> href="/wrapped/cgi-bin/test.pl">CGI</a><br></td></tr></table>
> >
> > I have a working version of this handler, but I think
> that
> > there's a better way to do it, specifically the part
> that
> > manages the content return part of the
> request. Static
> > files are simple enough; I open the file and print it
> to
> > STDOUT. Scripts, however, need to be handled
> > differently. The way I'm doing it now works, but it
> > strikes me as inefficient.
> >
> > package My::Wrapper;
> >
> > use strict;
> > use Apache::Constants qw(:common DONE);
> > use Apache::Log ();
> >
> > sub handler {
> > my ( $r ) = shift;
> > my ( $log ) = $r->log;
> > $log->info("Wrapper: Inside Wrapper.");
> > my ( $template_directory ) =
> "/www/html/templates/";
> > my ( $components_directory ) =
> > '/www/html/components/';
> > #
> > # these next four variables will come from the
> cookie,
> > they are
> > # set manually for now.
> > #
> > my ( $template ) = $template_directory.'standard';
> > my ( $header ) =
> > $components_directory.'head/'.'standard';
> > my ( $toolbar ) =
> > $components_directory.'tool/'.'standard';
> > my ( $footer ) =
> > $components_directory.'feet/'.'standard';
> > $r->send_http_header;
> > if ( -e $template ) {
> > open( TEMPLATE, "$template" ) or die "Failed
> to
> > open template $template: $!";
> > while (<TEMPLATE>) {
> > if ( $_ =~
> > /(.*)<\!--\sWrapper:(\w+)\s-->(.*)/o ) {
> > my ( $before ) = $1;
> > my ( $component ) = $2;
> > my ( $after ) = $3;
> > my ( $name );
> > $name = $header if $component eq
> 'header';
> > $name = $toolbar if $component eq
> > 'toolbar';
> > $name = $footer if $component eq
> 'footer';
> > print $before;
> &print_component($name);
> > print $after;
> > } elsif ( $_ =~
> /(.*)<\!--\sContent\s-->(.*)/o
> > ) {
> > my ( $before ) = $1;
> > my ( $after ) = $2;
> > my ( $file ) = $r->filename;
> > print $before;
> > if ( -e $file ) {
> > if ( $file =~ /(?:cgi|pl)$/ ) {
> > $log->info("Wrapper: cgi
> script
> > requested.");
> > do $file;
> > } else {
> > $log->info("Wrapper: static
> file
> > requested.");
> > open(CONTENT, "$file" ) or die
>
> > "Failed to open content file $file: $!";
> > while (<CONTENT>) {
> > print $_;
> > }
> > close(CONTENT);
> > }
> > }
> > print $after;
> > } else {
> > print $_;
> > }
> > }
> > close( TEMPLATE );
> > }
> > $log->info("Wrapper: Exiting Wrapper.");
> > return DONE;
> > }
> >
> > sub print_component {
> > my ( $component ) = shift;
> > if ( -e $component ) {
> > open(IN, "$component" ) or die "Failed to open
>
> > component $component: $!";
> > while (<IN>) {
> > print $_;
> > }
> > close(IN);
> > return 1;
> > } else {
> > print "Failed to open component $component.";
> > return 0;
> > }
> > }
> > 1;
> > __END__
> >
> > I have experimented with various ways of handling this,
>
> > such as printing a redirect, but this is the only way I
>
> > could get it to work. I suspect that there is a better
> way
> > to do it. I'd rather not `` the script, because of
> > efficiency worries and the desire to maintain some
> process
> > environment variables used in our authentication
> systems.
> >
> > Thanks a bunch,
> > Todd
> >
> >
> >