Hi Andrew,

I have written a mod_perl handler (using Apache::Filter) to inject a
header/footer includes onto the content of any .asp file. So my .asp
files don't even contain the <html><head></head><body> </body> tags. The
mod_perl handler literally injects <!--#include file=xxx--> lines into
the filter stack and expects Apache::ASP to expand it. (In my config
below, it would inject three include lines at the top for "all.inc",
"head.inc", and "nav.inc", then at the end inject an include for
"foot.inc".)

So to write a new page, I just write an .asp file for the guts of the
page and the header/footer/navigation areas automatically show up (and
can even have their own state). There is nothing in the .asp file that
refers to the header/footer; it is conpletely in the config file.

I still use this in production at http://www.community-art.com/, using
Apache::ASP version 2.47 and apache 1.3.x. I don't know if it is
compatible with the more recent versions of Apache::ASP & apache 2.x
mod_perl. 

Here's my httpd.conf setup, and mod_perl handler code following:


## ASP setup
<FilesMatch "\.asp$">
  SetHandler  perl-script
  PerlModule  Apache::Filter
  PerlModule  Apache::ASP

  PerlSetVar  Filter On
  PerlSetVar  AutoHeaders   On
  PerlSetVar  AutoHeadersHeadFile   all.inc,head.inc,nav.inc
  PerlSetVar  AutoHeadersFootFile   foot.inc

  ## stack handlers for auto header/nav/footer
  ## note Apache::ASP sandwiched in the middle
  PerlHandler Apache::FilterHeader Apache::ASP Apache::FilterSendHeader

####
## more Apache::ASP setup...
####

</FilesMatch>

## popup windows have different headers and footers
## put those .asp files in a /popup subdir
<LocationMatch .*/popup/.*>
  PerlSetVar  AutoHeaders   On
  PerlSetVar  AutoHeadersHeadFile   all.inc,pophead.inc
  PerlSetVar  AutoHeadersFootFile   popfoot.inc
</LocationMatch>

## we want some places to not have any header footer stuff happen.
## put those .asp files in a /no subdirectory and deal with the
## <html>, <head>, <body> tags yourself.
<LocationMatch .*/no/.*>
  PerlSetVar  AutoHeaders   On
  PerlSetVar  AutoHeadersHeadFile   none
  PerlSetVar  AutoHeadersFootFile   none
</LocationMatch>





---------- Apache::FilterHandler -----------
package Apache::FilterHeader;

use strict;
use Apache::Constants qw(:common);
use Apache::Log;

sub handler {
    my $r = shift;
    $r = $r->filter_register(); ## returns Apache::Filter subclass of
Apache
##  $r->deterministic(1);

    my $file = $r->filename();
    return DECLINED  unless ( $file =~ /(\.asp|\..*html)$/ );

    ## be sure we want auto headers here.
    my $AutoHeaders = $r->dir_config('AutoHeaders') || 'Off';
    my $auto = 0;
    if ( $AutoHeaders =~ m/^on$/io ) {
        $auto = 1;
    }
    return DECLINED  unless ( $auto );

    ## get our header and footer file
    ## check the notes() for printer-friendly settings
    my $pf_headinc = $r->pnotes('pf_HEADER');
    my $pf_footinc = $r->pnotes('pf_FOOTER');
#my $n = $r->pnotes();
#for ( keys %$n ) {
#  $r->log->notice("pnotes($_)=$n->{$_}");
#}
#$r->log->notice("pf_footer=$pf_footinc");

    my $headinc = $pf_headinc || $r->dir_config('AutoHeadersHeadFile')
|| '';
    my $footinc = $pf_footinc || $r->dir_config('AutoHeadersFootFile')
|| '';


    ## ok, here we go...
    $r->content_type("text/html");
#   $r->send_http_header;
    my ($fh, $status) = $r->filter_input();

    if ( $status != OK ) {
        ## some kind of error
        #return $status;
        print <$fh>, "\n";
        return OK;  ## let Apache::ASP pick it up from here...
    } else {
        my @X = (); ## dummy just to get header includes to be dynamic

        ## normal
        if ( $headinc  and  $headinc !~ /^none$/io ) {
            my @h = split(',',$headinc);
            for ( @h ) {
                print "<!--#include file=$_ [EMAIL PROTECTED]>\n";
            }
        }
        print <$fh>, "\n";
        if ( $footinc  and  $footinc !~ /^none$/io ) {
            my @h = split(',',$footinc);
            for ( @h ) {
                print "<!--#include file=$_ [EMAIL PROTECTED]>\n";
            }
        }
        return OK;
    }

}
1;


---------- Apache::FilterSendHeader -----------
package Apache::FilterSendHeader;

use strict;
use Apache::Constants qw(:common);
use Apache::Log;

sub handler {
    my $r = shift;
    $r = $r->filter_register(); ## returns Apache::Filter subclass of
Apache
##  $r->deterministic(1);

    my $file = $r->filename();
    return DECLINED  unless ( $file =~ /(\.asp|\..*html)$/ );

    ## be sure we want auto headers here.
    my $AutoHeaders = $r->dir_config('AutoHeaders') || 'Off';
    my $auto = 0;
    if ( $AutoHeaders =~ m/^on$/io ) {
        $auto = 1;
    }
#print $r->log->notice("autoheaders=$auto");
    return DECLINED  unless ( $auto );

    ## ok, here we go...
#   $r->content_type("text/html");
    $r->send_http_header;
    my ($fh, $status) = $r->filter_input();

    if ( $status != OK ) {
        ## some kind of error
        return $status;
    } else {
        ## normal
#print $r->log->notice($r->filename);
        print <$fh>, "\n";
        return OK;
    }

}
1;





I have since created a better "stacking" strategy since in java, but I
have not ported it to perl. (This is the "Stack" tag library in
WebGUI.jar from http://www.vyking.com/projects/WebGUI/CURRENT/. These
have *no* docs yet besides the code.) The way I'd like see it
implemented is an Apache 2.x mod_perl handler that walks the tree
looking for filenames to accumlate based on the numbered filename
convention demonstrated in the Stack taglib.

-broc



> -----Original Message-----
> From: Andrew Koebrick [mailto:[EMAIL PROTECTED] 
> Sent: Tuesday, December 14, 2004 5:31 PM
> To: '[EMAIL PROTECTED]'
> Subject: regular expressions on $Response ? 
> 
> 
> Hoping somebody can offer a suggestion on how best to do my 
> headers and footers.  I bumped into problems getting 
> Apache::ASP, Apache 2.0 and filters working.  I was using 
> mod_ext_filter to replace my <body> and </body> tags (using a 
> simple sed command) with a SSI directive, which in turn 
> pulled in complex headers and footers.  
> 
>  
> 
> When I moved to Fedora 3 this scheme started failing.  My 
> options are to move off of Apache::ASP for my embedded perl 
> (perhaps to Mason), or to try to do the replaces above in a 
> manner more internal to Apache::ASP.
> 
>  
> 
> I have not been using the $Response->AddHeader($name, $value) 
>  because I need to keep the existing headers from the HTML 
> files (they contain lots of metadata.
> 
>  
> 
> So, is there a way to do regular expressions agains the 
> $Resoponse object?  Something akin to (escaping ignored): 
> 
> $Response =~ s/<body>/<!--#include virtual='/inc/header.inc'-><body>/g
> 
>  
> 
> I am not currently using a global.asa file, but I guess I 
> could start if I need to.
> 
>  
> 
> Thanks for any suggestions.
> 
>  
> 
> Andrew Koebrick
> 
> Andrew Koebrick
> Web Coordinator / Librarian
> 
> Dept. of Administration
> State of Minnesota
> 658 Cedar St.
> St. Paul, MN 55155
> 
> 651-296-4156
> http://server.admin.state.mn.us
> 
>  
> 
>  
> 
>  
> 
> Andrew Koebrick
> Web Coordinator / Librarian
> 
> Dept. of Administration
> State of Minnesota
> 658 Cedar St.
> St. Paul, MN 55155
> 
> 651-296-4156
> http://server.admin.state.mn.us
> 
>  
> 
> 

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to