import rt 3.8.8
[freeside.git] / rt / bin / webmux.pl.in
index 7e61b27..50b959a 100644 (file)
 # END BPS TAGGED BLOCK }}}
 use strict;
 
+package HTML::Mason::Commands;
+our %session;
+
+package RT::Mason;
+
+our ($Nobody, $SystemUser, $Handler, $r);
+
+sub handler {
+    ($r) = @_;
+
+    local $SIG{__WARN__};
+    local $SIG{__DIE__};
+    RT::InitSignalHandlers();
+
+    if ($r->content_type =~ m/^httpd\b.*\bdirectory/i) {
+        use File::Spec::Unix;
+        # Our DirectoryIndex is always index.html, regardless of httpd settings
+        $r->filename( File::Spec::Unix->catfile( $r->filename, 'index.html' ) );
+    }
+
+    Module::Refresh->refresh if RT->Config->Get('DevelMode');
+
+    RT::ConnectToDatabase();
+
+    my (%session, $status);
+    {
+        local $@;
+        $status = eval { $Handler->handle_request($r) };
+        $RT::Logger->crit( $@ ) if $@;
+    }
+    undef %session;
+
+    RT::Interface::Web::Handler->CleanupRequest();
+
+    return $status;
+}
+
+package main;
+
+# check mod_perl version if it's mod_perl
+BEGIN {
+    die "RT does not support mod_perl 1.99. Please upgrade to mod_perl 2.0"
+        if $ENV{'MOD_PERL'}
+        and $ENV{'MOD_PERL'} =~ m{mod_perl/(?:1\.9)};
+}
+
 BEGIN {
-    $ENV{'PATH'}   = '/bin:/usr/bin';                     # or whatever you need
+    $ENV{'PATH'}   = '/bin:/usr/bin'; # or whatever you need
     $ENV{'CDPATH'} = '' if defined $ENV{'CDPATH'};
     $ENV{'SHELL'}  = '/bin/sh' if defined $ENV{'SHELL'};
     $ENV{'ENV'}    = '' if defined $ENV{'ENV'};
     $ENV{'IFS'}    = '' if defined $ENV{'IFS'};
 
-    use CGI qw(-private_tempfiles);    #bring this in before mason, to make sure we
-                                   #set private_tempfiles
-
-    die "RT does not support mod_perl 1.99. Please upgrade to mod_perl 2.0"
-      if $ENV{'MOD_PERL'}
-      and $ENV{'MOD_PERL'} =~ m{mod_perl/(?:1\.9)};
-
+    # bring this in before mason, to make sure we
+    # use private tempfiles
+    use CGI qw(-private_tempfiles);
 }
 
 # fix lib paths, some may be relative
@@ -88,91 +130,47 @@ BEGIN {
     }
 
 }
-use RT;
-
-package RT::Mason;
-
-use vars qw($Nobody $SystemUser $Handler $r);
 
-#This drags in RT's config.pm
-BEGIN {
-    RT::LoadConfig();
-    if (RT->Config->Get('DevelMode')) { require Module::Refresh; }
-    RT->InitPluginPaths();
+require RT;
+RT::LoadConfig();
+if ( RT->Config->Get('DevelMode') ) {
+    require Module::Refresh;
 }
+RT::Init();
 
+# check compatibility of the DB
 {
-    require RT::Handle;
-    my $dsn = RT::Handle->DSN;
-    my $user = RT->Config->Get('DatabaseUser');
-    my $pass = RT->Config->Get('DatabasePassword');
-
-    my $dbh = DBI->connect(
-        $dsn, $user, $pass,
-        { RaiseError => 0, PrintError => 0 },
-    );
+    my $dbh = $RT::Handle->dbh;
     if ( $dbh ) {
-        my ($status, $msg) = RT::Handle->CheckCompatibility( $dbh, 'post' );
+        my ($status, $msg) = $RT::Handle->CheckCompatibility( $dbh, 'post' );
         die $msg unless $status;
     }
 }
 
-{
-    package HTML::Mason::Commands;
-    use vars qw(%session);
-}
+require RT::Interface::Web::Handler;
+$RT::Mason::Handler = RT::Interface::Web::Handler->new(
+    RT->Config->Get('MasonParameters')
+);
+
+# load more for mod_perl before forking
+RT::InitClasses( Heavy => 1 ) if $ENV{'MOD_PERL'} || $ENV{RT_WEBMUX_HEAVY_LOAD};
 
-use RT::Interface::Web;
-use RT::Interface::Web::Handler;
+# we must disconnect DB before fork
+$RT::Handle->dbh(undef);
+undef $RT::Handle;
 
-if ($ENV{'MOD_PERL'} && !RT->Config->Get('DevelMode')) {
+if ( $ENV{'MOD_PERL'} && !RT->Config->Get('DevelMode')) {
     # Under static_source, we need to purge the component cache
     # each time we restart, so newer components may be reloaded.
     #
-    # We can't do this in FastCGI or we'll blow away the component root _every_ time a new server starts
-    # which happens every few hits.
+    # We can't do this in FastCGI or we'll blow away the component
+    # root _every_ time a new server starts which happens every few
+    # hits.
     
-    use File::Path qw( rmtree );
-    use File::Glob qw( bsd_glob );
-    my @files = bsd_glob("$RT::MasonDataDir/obj/*");
-    rmtree([ @files ], 0, 1) if @files;
-}
-
-sub handler {
-    ($r) = @_;
-
-    local $SIG{__WARN__};
-    local $SIG{__DIE__};
-
-    if ($r->content_type =~ m/^httpd\b.*\bdirectory/i) {
-        use File::Spec::Unix;
-        # Our DirectoryIndex is always index.html, regardless of httpd settings
-        $r->filename( File::Spec::Unix->catfile( $r->filename, 'index.html' ) );
-    }
-#    elsif (defined( $r->content_type )) {
-        #$r->content_type !~ m!(^text/|\bxml\b)!i or return -1;
-#    }
-
-    Module::Refresh->refresh if RT->Config->Get('DevelMode');
-
-    RT::Init();
-
-    $Handler ||= RT::Interface::Web::Handler->new(
-        RT->Config->Get('MasonParameters')
-    );
-
-    my %session;
-    my $status;
-    eval { $status = $Handler->handle_request($r) };
-    if ($@) {
-        $RT::Logger->crit($@);
-    }
-
-    undef(%session);
-
-    RT::Interface::Web::Handler->CleanupRequest();
-
-    return $status;
+    require File::Path;
+    require File::Glob;
+    my @files = File::Glob::bsd_glob("$RT::MasonDataDir/obj/*");
+    File::Path::rmtree([ @files ], 0, 1) if @files;
 }
 
 1;