From 30c35b3aefc582e1bb123b309f9c4971c04094ee Mon Sep 17 00:00:00 2001 From: Dylan William Hardison Date: Thu, 30 Mar 2017 10:52:49 -0400 Subject: Bug 1351695 - Allow apache to ignore .htaccess for increased performance --- Bugzilla/ModPerl.pm | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 Bugzilla/ModPerl.pm (limited to 'Bugzilla/ModPerl.pm') diff --git a/Bugzilla/ModPerl.pm b/Bugzilla/ModPerl.pm new file mode 100644 index 000000000..22be8e678 --- /dev/null +++ b/Bugzilla/ModPerl.pm @@ -0,0 +1,86 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This Source Code Form is "Incompatible With Secondary Licenses", as +# defined by the Mozilla Public License, v. 2.0. +package Bugzilla::ModPerl; + +use 5.10.1; +use strict; +use warnings; + +use File::Find (); +use Cwd (); +use Carp (); + +# We don't need (or want) to use Bugzilla's template subclass. +# it is easier to reason with the code without all the extra things Bugzilla::Template adds +# (and there might be side-effects, since this code is loaded very early in the httpd startup) +use Template (); + +sub apache_config { + my ($class, $cgi_path) = @_; + + Carp::croak "\$cgi_path is required" unless $cgi_path; + + my %htaccess; + $cgi_path = Cwd::realpath($cgi_path); + my $wanted = sub { + package File::Find; + our ($name, $dir); + + if ($name =~ m#/\.htaccess$#) { + open my $fh, '<', $name or die "cannot open $name $!"; + my $contents = do { + local $/ = undef; + <$fh>; + }; + close $fh; + $htaccess{$dir} = { file => $name, contents => $contents, dir => $dir }; + } + }; + + File::Find::find( { wanted => $wanted, no_chdir => 1 }, $cgi_path ); + my $template = Template->new; + my $conf; + my %vars = ( + root_htaccess => delete $htaccess{$cgi_path}, + htaccess_files => [ map { $htaccess{$_} } sort { length $a <=> length $b } keys %htaccess ], + cgi_path => $cgi_path, + ); + $template->process(\*DATA, \%vars, \$conf); + + return $conf; +} + +1; + +__DATA__ +# Make sure each httpd child receives a different random seed (bug 476622). +# Bugzilla::RNG 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 never use it in Bugzilla itself, +# so we need to srand() both of them.) +PerlChildInitHandler "sub { Bugzilla::RNG::srand(); srand(); }" + + + 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 Apache2::SizeLimit + PerlOptions +ParseHeaders + Options +ExecCGI +FollowSymLinks + DirectoryIndex index.cgi index.html + AllowOverride none + # from [% root_htaccess.file %] + [% root_htaccess.contents FILTER indent %] + + +# directory rules for all the other places we have .htaccess files +[% FOREACH htaccess IN htaccess_files %] +# from [% htaccess.file %] + + [% htaccess.contents FILTER indent %] + +[% END %] -- cgit v1.2.3-24-g4f1b