package HTML::Mason;
use HTML::Mason;
use strict;
use Apache::DBI;
my $dbsource = "dbi:mysql:myapp";
my $dbuser = 'myapp';
my $dbpass = 'mypass';
# Import some modules for use in components
{ package HTML::Mason::Commands;
use vars qw(%session);
use CGI::Cookie;
use CGI::Carp;
use Apache::DBI;
use Apache::Session::MySQL;
use Mail::Sendmail;
}
# 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 => '/www/htdocs/carboncontacts/',
data_dir => '/www/HTML-Mason/');
# 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('www')]->[2], [getgrnam('www')]->[2],
$interp->files_written );
# -----------------------------------------------------------
# Create our content handler.
sub handler
{
# Get the Apache request object
my $r = shift;
# Only handle text
return -1
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::MySQL',
($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::MySQL',
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 => '/myapp/');
$r->header_out('Set-Cookie', => $cookie);
}
my $status = $ah->handle_request($r);
untie %HTML::Mason::Commands::session;
return $status;
}
1;