Title: RE: Apache2 + sessions
Thanks, Andrey. I'll give it a try.

Jared

At 9:06 PM +0200 3/15/06, Andrey Yevsyukov wrote:
Hi

Try using that:

--- part of httpd.conf ---

PerlModule                      CGI
PerlModule                      HTML::Mason::ApacheHandler
PerlSetVar                      MasonArgsMethod                 CGI

<Perl>
    package SITE::Mason;

    use strict;
    use HTML::Mason::ApacheHandler;
    use CGI::Cookie;

    {
        package HTML::Mason::Commands;
        use vars qw(%session);
        use CGI::Cookie;
        use Apache::Session::File;
    }

    my $mason_dirs = {
                    www    => {
                                        comp_root               => "some-components-root",
                                        data_dir                => "some-data-dir",
                                        sessions_dir            => "some-dir-for-sessions"
                                    },
#                    <more-sites>
                };

    my $ah = {};
    foreach my $site (keys %$mason_dirs) {
        $ah->{$site} = HTML::Mason::ApacheHandler->new (
                                                        comp_root               => $mason_dirs->{$site}->{comp_root},
                                                        data_dir                => $mason_dirs->{$site}->{data_dir}
                                                    );
    }
sub handler {
        my ($r) = @_;
        my $site = $r->dir_config("site");

        my %cookies = parse CGI::Cookie($r->headers_in->get('Cookie'));

        my $site_session_id = uc($site).'_Session_ID';
        my $site_session_dir = $mason_dirs->{$site}->{sessions_dir};

        eval {
            tie %HTML::Mason::Commands::session, 'Apache::Session::File',
                    ($cookies{$site_session_id} ? $cookies{$site_session_id}->value() : undef),
                    {
                        Directory       => $site_session_dir,
                        LockDirectory   => $site_session_dir
                    };
        };

        if ($@) {
            if ($@ =~ m/^Object does not exist in the data store/) {
                tie %HTML::Mason::Commands::session, 'Apache::Session::File',
                    undef,
                    {
                        Directory       => $site_session_dir,
                        LockDirectory   => $site_session_dir
                    };

                undef $cookies{$site_session_id};
            }
        }

        if ( !$cookies{$site_session_id} ) {
            my $cookie = new CGI::Cookie (
                                        -name   => $site_session_id,
                                        -value  => $HTML::Mason::Commands::session{_session_id},
                                        -path   => '/'
                                    );

            $r->headers_out->set('Set-Cookie', $cookie);
        }

        my $status = $ah->{$site}->handle_request($r);
        untie %HTML::Mason::Commands::session;
        return $status;
    }
</Perl>

PerlSetVar                      site                            www

AddType                         application/x-_javascript_        mjs
AddType                         text/html                       mhtml
AddType                         text/css                        mcss

<LocationMatch "(\.mjs|\.mcss|\.mhtml)$">
    SetHandler                  perl-script
    PerlHandler                 SITE::Mason
</LocationMatch>


------------------------------------

Good luck

Andrey

Reply via email to