return to first page linux journal archive
keywordscontents

Listing 1: Sample mason.pl, Handler Configuration File

package HTML::Mason;
use HTML::Mason;
use strict;

use Apache::DBI;

my $dbsource = "dbi:mysql:atf";
my $dbuser = 'atf';
my $dbpass = 'atfpass';

# Import some modules for use in components
{  package HTML::Mason::Commands;
   use vars qw(%session);
   use CGI::Cookie;
   use Apache::DBI;
   use Apache::Session::DBI;
}

# Create a new Mason parser
my $parser = new HTML::Mason::Parser;

# Create a new Mason interpreter
my $interp =
    new HTML::Mason::Interp (parser => $parser,
			     comp_root =>
'/usr/local/apache/mason/',
			     data_dir => '/usr/local/apache/masondata/');

# Create a new Mason ApacheHandler
my $ah = new HTML::Mason::ApacheHandler (interp => $interp);

# Make sure that things are done as nobody, and not root!
chown ( [getpwnam('nobody')]->[2], [getgrnam('nobody')]->[2],
	$interp->files_written );

# -----------------------------------------------------------
# Create our content handler.

sub handler
{
    # Get the Apache request object
    my $r = shift;

    # Only handle text
    return -1<\n> 
    if defined($r->content_type)
    && $r->content_type !~ m|^text/|io;

    # Get the incoming cookies
    my %cookies = parse
    CGI::Cookie($r->header_in('Cookie'));

    # Try to re-establish an existing session
    eval {
    tie %HTML::Mason::Commands::session, 'Apache::Session::DBI',
        ($cookies{'AF_SID'} ? $cookies{'AF_SID'}->value() : undef),
	    {
	     DataSource => $dbsource,
	     UserName => $dbuser,
	     Password => $dbpass
	    };
    };

    # If we could not re-establish an existing
    # session, create a new session.
    if ( $@ )
    {
	if ( $@ =~ m#^Object does not exist in the data store# )
	{
	    tie %HTML::Mason::Commands::session,
'Apache::Session::DBI',
		undef,
		{
		 DataSource => $dbsource,
		 UserName => $dbuser,
		 Password => $dbpass
		};
	    undef $cookies{'AF_SID'};
	}
    }

    if ( !$cookies{'AF_SID'} )
    {
	my $cookie =
	    new CGI::Cookie(-name => 'AF_SID',
			    -value =>
			    $HTML::Mason::Commands::session{_session_id},
			    -path => '/',);
	$r->header_out('Set-Cookie', => $cookie);
    }

    my $status = $ah->handle_request($r);

    untie %HTML::Mason::Commands::session;
 
    return $status;
}