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