Initial patch.
[vuplus_webkit] / Websites / bugs.webkit.org / mod_perl.pl
diff --git a/Websites/bugs.webkit.org/mod_perl.pl b/Websites/bugs.webkit.org/mod_perl.pl
new file mode 100644 (file)
index 0000000..7cc647c
--- /dev/null
@@ -0,0 +1,129 @@
+#!/usr/bin/env perl -wT
+# -*- Mode: perl; indent-tabs-mode: nil -*-
+#
+# The contents of this file are subject to the Mozilla Public
+# License Version 1.1 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS
+# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# rights and limitations under the License.
+#
+# The Original Code is the Bugzilla Bug Tracking System.
+#
+# Contributor(s): Max Kanat-Alexander <mkanat@bugzilla.org>
+
+package Bugzilla::ModPerl;
+
+use strict;
+
+# If you have an Apache2::Status handler in your Apache configuration,
+# you need to load Apache2::Status *here*, so that Apache::DBI can
+# report information to Apache2::Status.
+#use Apache2::Status ();
+
+# We don't want to import anything into the global scope during
+# startup, so we always specify () after using any module in this
+# file.
+
+use Apache2::ServerUtil;
+use Apache2::SizeLimit;
+use ModPerl::RegistryLoader ();
+use CGI ();
+CGI->compile(qw(:cgi -no_xhtml -oldstyle_urls :private_tempfiles
+                :unique_headers SERVER_PUSH :push));
+use Template::Config ();
+Template::Config->preload();
+
+use Bugzilla ();
+use Bugzilla::Constants ();
+use Bugzilla::CGI ();
+use Bugzilla::Mailer ();
+use Bugzilla::Template ();
+use Bugzilla::Util ();
+
+# For PerlChildInitHandler
+eval { require Math::Random::Secure };
+
+# This means that every httpd child will die after processing
+# a CGI if it is taking up more than 70MB of RAM all by itself.
+$Apache2::SizeLimit::MAX_UNSHARED_SIZE = 70000;
+
+my $cgi_path = Bugzilla::Constants::bz_locations()->{'cgi_path'};
+
+# Set up the configuration for the web server
+my $server = Apache2::ServerUtil->server;
+my $conf = <<EOT;
+# Make sure each httpd child receives a different random seed (bug 476622).
+# Math::Random::Secure has one srand that needs to be called for
+# every process, and Perl has another. (Various Perl modules still use
+# the built-in rand(), even though we only use Math::Random::Secure in
+# Bugzilla itself, so we need to srand() both of them.) However, 
+# Math::Random::Secure may not be installed, so we call its srand in an
+# eval.
+PerlChildInitHandler "sub { eval { Math::Random::Secure::srand() }; srand(); }"
+<Directory "$cgi_path">
+    AddHandler perl-script .cgi
+    # No need to PerlModule these because they're already defined in mod_perl.pl
+    PerlResponseHandler Bugzilla::ModPerl::ResponseHandler
+    PerlCleanupHandler  Bugzilla::ModPerl::CleanupHandler
+    PerlCleanupHandler  Apache2::SizeLimit
+    PerlOptions +ParseHeaders
+    Options +ExecCGI
+    AllowOverride Limit
+    DirectoryIndex index.cgi index.html
+</Directory>
+EOT
+
+$server->add_config([split("\n", $conf)]);
+
+# Have ModPerl::RegistryLoader pre-compile all CGI scripts.
+my $rl = new ModPerl::RegistryLoader();
+# If we try to do this in "new" it fails because it looks for a 
+# Bugzilla/ModPerl/ResponseHandler.pm
+$rl->{package} = 'Bugzilla::ModPerl::ResponseHandler';
+# Note that $cgi_path will be wrong if somebody puts the libraries
+# in a different place than the CGIs.
+foreach my $file (glob "$cgi_path/*.cgi") {
+    Bugzilla::Util::trick_taint($file);
+    $rl->handler($file, $file);
+}
+
+
+package Bugzilla::ModPerl::ResponseHandler;
+use strict;
+use base qw(ModPerl::Registry);
+use Bugzilla;
+
+sub handler : method {
+    my $class = shift;
+
+    # $0 is broken under mod_perl before 2.0.2, so we have to set it
+    # here explicitly or init_page's shutdownhtml code won't work right.
+    $0 = $ENV{'SCRIPT_FILENAME'};
+
+    Bugzilla::init_page();
+    return $class->SUPER::handler(@_);
+}
+
+
+package Bugzilla::ModPerl::CleanupHandler;
+use strict;
+use Apache2::Const -compile => qw(OK);
+
+sub handler {
+    my $r = shift;
+
+    Bugzilla::_cleanup();
+    # Sometimes mod_perl doesn't properly call DESTROY on all
+    # the objects in pnotes()
+    foreach my $key (keys %{$r->pnotes}) {
+        delete $r->pnotes->{$key};
+    }
+
+    return Apache2::Const::OK;
+}
+
+1;