From: Dintelmann, P. <Peter.Dintelmann@Dresdner-Bank.com> - 2001-01-08 16:40:42
|
Hi, I am using Perl5.6.0/Mason 0.895 on W2K with Apache 1.3.14/mod_perl-1.24 and the "standard" session_handler (see the code below - all changes by me are documented) with Apache::Session::File. Every time I try to access %session (reading, writing) the server hangs; I do not get any response and have to restart Apache. There is nothing in my server side session files. Can anyone _please_ help? TIA, Peter -- Dr. Peter Dintelmann Dresdner Bank AG Global Transaction Banking MIS - Market Data Warehouse Windmuehlstr. 14/2E D-60301 Frankfurt Germany Tel.: +49-(0)69-263-19722 Email: Pet...@dr... --- session_handler.pl --- #!C:/Perl/bin/Perl.exe # # This is a handler that supports a %session global, using cookies, that # persists across HTTP requests. # # *NOTE* There is a bug in perl5.005 that can rear it's head when you # die() within an eval {}. Unfortunately, Apache::Session # expects you to catch failures by using eval, so you may get # bitten. You can either hack Apache::Session to change how it # returns its error conditions, or upgrade to Perl 5.6.0 or # greater, which has its own bugs. package HTML::Mason; # manually added P. Dintelmann, 29 Dec 2000 # Bring in main Mason package. use HTML::Mason; # Bring in ApacheHandler, necessary for mod_perl integration. # Uncomment the second line (and comment the first) to use # Apache::Request instead of CGI.pm to parse arguments. # use HTML::Mason::ApacheHandler; use HTML::Mason::ApacheHandler qw(args_method=>'mod_perl'); use strict; # List of modules that you want to use from components (see Admin # manual for details) { package HTML::Mason::Commands; use vars qw(%session); # You might want to replace this with Apache::Cookie if you have # libapreq installed. use CGI::Cookie; # Replace this if you want to use a different storage method. Also # see Apache::Session::Flex in Apache::Session 1.50+ for a way to # specify this at run time. use Apache::Session::File; } # Create Mason objects # my $parser = new HTML::Mason::Parser; my $interp = new HTML::Mason::Interp (parser=>$parser, comp_root=>'C:/ApacheDocs/mason', data_dir=>'C:/TEMP'); my $ah = new HTML::Mason::ApacheHandler (interp=>$interp); # Activate the following if running httpd as root (the normal case). # Resets ownership of all files created by Mason at startup. Change # these to match your server's 'User' and 'Group'. # #chown ( (getpwnam('nobody'))[2], (getgrnam('nobody'))[2], # $interp->files_written ); # directory for session files $Apache::Session::Lock::File::LockDirectory = 'C:/temp'; # manually added P. Dintelmann, 29 Dec 2000 $Apache::Session::Store::File::Directory = 'C:/temp'; # manually added P. Dintelmann, 29 Dec 2000 sub handler { my ($r) = @_; # If you plan to intermix images in the same directory as # components, activate the following to prevent Mason from # evaluating image files as components. # return -1 if $r->content_type && $r->content_type !~ m|^text/|io; my %cookies = parse CGI::Cookie($r->header_in('Cookie')); # Don't even bother trying to use badly formed session ids. my $sid; if ( defined $cookies{'AF_SID'} && $cookies{'AF_SID'}->value() =~ /^[a-z\d]+$/ ) { $sid = $cookies{'AF_SID'}->value(); } # If $sid is not defined this will generate a new session. eval { tie %HTML::Mason::Commands::session, 'Apache::Session::File', $sid; }; if ( $@ ) { if ( $@ =~ /Object does not exist in the data store/ && defined $sid ) { # Attempt to create a new session if the previous one was # not valid. This attempt will die (leading to a 500 # error) if it fails. Use eval {} to trap this if you so # desire. tie %HTML::Mason::Commands::session, 'Apache::Session::File', undef; } else { # This means that we got a different error or we were # attempting to create a new session from scratch. die $@; } } # Always send the cookie out as there is no reason not to. 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; } 1; |