1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
#!/usr/bin/perl
# 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.
use 5.10.1;
use strict;
use warnings;
BEGIN { $main::BUGZILLA_PERSISTENT = 1 }
use File::Basename;
use File::Spec;
BEGIN {
require lib;
my $dir = File::Spec->rel2abs( dirname(__FILE__) );
lib->import(
$dir,
File::Spec->catdir( $dir, 'lib' ),
File::Spec->catdir( $dir, qw(local lib perl5) )
);
# disable "use lib" from now on
no warnings qw(redefine);
*lib::import = sub { };
}
# it is very important for CGI::Compile to be loaded first.
use CGI::Compile;
use Bugzilla::PSGI qw(compile_cgi);
use Bugzilla::Logging;
use Bugzilla ();
use Bugzilla::Constants ();
use Bugzilla::BugMail ();
use Bugzilla::CGI ();
use Bugzilla::Extension ();
use Bugzilla::Install::Requirements ();
use Bugzilla::Util ();
use Bugzilla::RNG ();
use Plack;
use Plack::Builder;
use Plack::App::URLMap;
use Plack::App::WrapCGI;
use Plack::Response;
# Pre-load all extensions and find their static dirs.
my @extensions = map { $_->NAME } @{ Bugzilla::Extension->load_all() };
my @static_dirs = qw( data/webdot docs graphs images js skins static );
foreach my $name (@extensions) {
my $dir = File::Spec->catfile('extensions', $name, 'web');
push @static_dirs, $dir if -d $dir;
}
Bugzilla->preload_features();
# Force instantiation of template so Bugzilla::Template::PreloadProvider can do its magic.
Bugzilla->template;
use Bugzilla::Sentry;
my $bugzilla_app = builder {
my $static_paths = join '|', map quotemeta, sort {length $b <=> length $a || $a cmp $b } @static_dirs;
enable 'Log4perl', category => 'Plack';
enable 'Static',
path => sub { s{^/(?:static/v\d+\.\d+/)?($static_paths)/}{$1/}gs },
root => Bugzilla::Constants::bz_locations->{cgi_path};
my @scripts = glob('*.cgi');
my %mount;
foreach my $script (@scripts) {
my $name = basename($script);
$mount{$name} = compile_cgi($script);
}
Bugzilla::Hook::process('psgi_builder', { mount => \%mount });
foreach my $name ( keys %mount ) {
mount "/$name" => $mount{$name};
}
# so mount / => $app will make *all* files redirect to the index.
# instead we use an inline middleware to rewrite / to /index.cgi
enable sub {
my $app = shift;
return sub {
my $env = shift;
$env->{PATH_INFO} = '/index.cgi' if $env->{PATH_INFO} eq '/';
return $app->($env);
};
};
mount '/robots.txt' => $mount{'robots.cgi'};
mount '/rest' => $mount{'rest.cgi'};
};
unless (caller) {
require Plack::Runner;
my $runner = Plack::Runner->new;
$runner->parse_options(@ARGV);
$runner->run($bugzilla_app);
exit 0;
}
return $bugzilla_app;
|