Hi,
I'm having a weird problem with mason and mod_perl.
I have the following configuration:
Apache 1.3.9
Mod_perl 1.21
Mason 0.8 (with both available patches)
I have a page that place login information into a session (handled by Mason)
but in other pages I can't always get the information I put in the session.
If I reload the page enough, I finally get it.
I put some debug lines in the Mason handler and discovered that the session
id is always empty. I tried giving it a value myself put the same problem
creeps up. If I run Apache with only one process, it works whether or not
there's a session id. It seems to be a problem related to the use of global
variables but I can't seem to track it down.
Any help would be appreciated.
David
PS:
Here are the relevant parts of my config files:
------------- httpd.conf -------------
PerlRequire /usr/local/apache/conf/session_handler.pl
<Location /prototype>
SetHandler perl-script
PerlHandler HTML::Mason
allow from all
</Location>
--------- session_handler.pl ---------
#!/usr/bin/perl
package HTML::Mason;
use HTML::Mason;
use strict;
{ package HTML::Mason::Commands;
use vars qw(%session);
use CGI::Cookie;
use Apache::Session::File;
use DBI;
}
my $parser = new HTML::Mason::Parser;
my $interp = new HTML::Mason::Interp (parser=>$parser,
comp_root=>'/export/home/web/prototype/',
data_dir=>'/export/home/web/prototype/mason_data/',
out_mode=>'batch');
my $ah = new HTML::Mason::ApacheHandler (interp=>$interp);
chown ( [getpwnam('nobody')]->[2], [getgrnam('nobody')]->[2],
$interp->files_written );
sub handler
{
my ($r) = @_;
return -1 if $r->content_type &&
$r->content_type !~ m#^text/|application/x-javascript#io;
my %cookies = parse CGI::Cookie($r->header_in('Cookie'));
my %session;
eval
tie %session, 'Apache::Session::File',
( $cookies{'AF_SID'} ? $cookies{'AF_SID'}->value() : undef );
};
if ( $@ ) {
# If the session is invalid, create a new session.
if ( $@ =~ m#^Object does not exist in the data store# ) {
tie %session, 'Apache::Session::File', undef;
undef $cookies{'AF_SID'};
}
}
# $session{_session_id}="fdsfsdfsdfsdfdsf";
if ( !$cookies{'AF_SID'} ) {
my $cookie = new CGI::Cookie(-name=>'AF_SID',
-value=>$session{_session_id}, -path => '/prototype/',);
$r->header_out('Set-Cookie', => $cookie);
} else {
print STDERR "******* COOKIE ******\n", $cookies{'AF_SID'}, "\n";
print STDERR "******* _SESSION_ID ******\n", $session{_session_id},
"\n";
}
my $status = $ah->handle_request($r);
untie %session;
return $status;
}
1;