LJ Archive

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;
}
LJ Archive